210

我从事一个将 facebook 页面作为其数据源之一的项目。它定期从中导入一些数据,不涉及 GUI。然后我们使用一个网络应用程序来显示我们已经拥有的数据。

并非所有信息都是公开的。这意味着我必须访问数据一次然后保留它。但是,我不知道这个过程,我还没有找到一个很好的教程。我想我需要一个access_token,我怎样才能从用户那里一步一步地得到它?用户是 facebook 页面的管理员,他是否需要在页面中添加我们的一些 FB 应用程序?

编辑:感谢@phwd 的提示。我制作了一个教程,如何获取永久页面访问令牌,即使offline_access不再存在。

编辑:我刚刚发现它在这里得到了回答:Long-lasting FB access-token for server to pull FB page info

4

18 回答 18

672

按照 Facebook 的扩展页面令牌文档中的说明,我能够获得一个不会过期的页面访问令牌。

除非另有说明,否则我建议对所有这些步骤使用Graph API Explorer 。

0. 创建 Facebook 应用

如果您已经有一个应用程序,请跳到第 1 步。

  1. 转到我的应用程序
  2. 点击“+ 添加新应用”。
  3. 设置网站应用程序。

您无需更改其权限或任何内容。在您完成访问令牌之前,您只需要一个不会消失的应用程序。

1.获取用户短期访问令牌

  1. 转到Graph API Explorer
  2. 选择您要获取访问令牌的应用程序(在“应用程序”下拉菜单中,而不是“我的应用程序”菜单中)。
  3. 单击“获取令牌”>“获取用户访问令牌”。
  4. 在弹出窗口的“扩展权限”选项卡下,选中“manage_pages”。
  5. 单击“获取访问令牌”。
  6. 从有权管理目标页面的 Facebook 帐户授予访问权限。请注意,如果此用户失去访问权限,最终永不过期的访问令牌可能会停止工作。

“访问令牌”字段中显示的令牌是您的短期访问令牌。

2. 生成长寿命访问令牌

按照Facebook 文档中的这些说明,向

https://graph.facebook.com/v2.10/oauth/access_token?grant_type=fb_exchange_token&client_id= {app_id} &client_secret= {app_secret} &fb_exchange_token= {short_lived_token}

输入您的应用程序的 ID 和密钥以及在上一步中生成的短期令牌。

不能使用 Graph API Explorer。由于某种原因,它卡在了这个请求上。我认为这是因为响应不是 JSON,而是查询字符串。由于它是 GET 请求,因此您只需在浏览器中访问 URL。

响应应如下所示:

{"access_token":" ABC123 ","token_type":"bearer","expires_in":5183791}

“ABC123”将是您的长期访问令牌。您可以将其放入Access Token Debugger中进行验证。在“过期”下,它应该有“2 个月”之类的内容。

3.获取用户ID

使用长期访问令牌,发出 GET 请求

https://graph.facebook.com/v2.10/me?access_token= {long_lived_access_token}

id字段是您的帐户 ID。下一步将需要它。

4.获取永久页面访问令牌

发出 GET 请求

https://graph.facebook.com/v2.10/ {account_id} /accounts?access_token= {long_lived_access_token}

JSON 响应应该有一个data字段,该字段下是用户可以访问的项目数组。找到您希望从中获得永久访问令牌的页面的项目。该access_token字段应该有您的永久访问令牌。复制它并在Access Token Debugger中测试它。在“过期”下,它应该说“从不”。

于 2015-02-09T20:14:26.687 回答
95

这是我仅使用Graph API Explorer & Access Token Debugger的解决方案:

  1. 图形 API 资源管理器:
    • 从右上角的下拉菜单中选择您的应用
    • 从下拉列表(访问令牌字段右侧)中选择“获取用户访问令牌”并选择所需的权限
    • 复制用户访问令牌
  2. 访问令牌调试器:
    • 粘贴复制的令牌并按“调试”
    • 按“扩展访问令牌”并复制生成的长寿命用户访问令牌
  3. 图形 API 资源管理器:
    • 将复制的令牌粘贴到“访问令牌”字段中
    • 使用“PAGE_ID?fields=access_token”发出 GET 请求
    • 在响应中找到永久页面访问令牌(节点“access_token”)
  4. (可选)访问令牌调试器:
    • 粘贴永久令牌并按“调试”
    • “过期”应该是“从不”

(使用 API 版本 2.9-2.11、3.0-3.1 测试)

于 2017-04-23T10:44:48.260 回答
12

我制作了一个 PHP 脚本以使其更容易。创建一个应用程序。在Graph API Explorer中选择您的应用程序并获取具有 manage_pages 和 publish_pages 权限的用户令牌。在“关于”页面的底部找到您页面的 ID。填写配置变量并运行脚本。

<?php
$args=[
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
];

echo generate_token($args);

function generate_token($args){
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/me?access_token={$longtoken}")); // get user id
    $userid=$r->id;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/{$userid}/accounts?access_token={$longtoken}")); // get permanent token
    foreach($r->data as $d) if($d->id==$args['pageid']) return $d->access_token;
}
于 2017-04-11T14:56:20.567 回答
11

除了Vlasec答案中推荐的步骤之外,您还可以使用:

于 2013-11-09T00:00:27.483 回答
11

另一个让生活更轻松的 PHP 答案。为 Facebook Graph API 2.9 更新。填满并加载。

<?php
$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/me?access_token={$longtoken}")); // get user id
    $userid=$r->id;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/{$userid}?fields=access_token&access_token={$longtoken}")); // get permanent token
    if($r->id==$args['pageid']) $finaltoken=$r->access_token;
    return $finaltoken;
}
?>

附录:(替代)

从图 2.9 开始,您可以跳过获取长访问令牌的大部分麻烦,只需在调试短访问令牌后单击访问令牌调试器工具底部的扩展访问令牌即可。有了关于and的信息,运行下面的 php 以获得永久访问令牌。pageidlonglivedtoken

<?php
$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'longlivedtoken'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
$r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/{$args['pageid']}?fields=access_token&access_token={$args['longlivedtoken']}"));
return $r->access_token;
}
?>

尽管第二个代码为您节省了很多麻烦,但我建议您运行第一个 php 代码,除非您非常着急,因为它会交叉检查 pageid 和 userid。如果您错误地选择了用户令牌,第二个代码将无法正常工作。

感谢dw1Rob

于 2017-04-25T08:09:22.400 回答
7

我尝试了这些步骤: https ://developers.facebook.com/docs/marketing-api/access#graph-api-explorer

获取永久页面访问令牌

  • 转到图形 API 资源管理器
  • 在应用程序中选择您的应用程序
  • 将长期访问令牌粘贴到访问令牌中
  • 在Access Token旁边,选择您想要访问令牌的页面。访问令牌显示为新字符串。
  • 单击i查看此访问令牌的属性
  • 再次点击“Open in Access Token Tool”按钮,打开“Access Token Debugger”工具查看属性

一个提示,它仅在页面语言为英语时对我有用。

于 2016-12-15T12:26:26.407 回答
4

如果您只请求页面数据,则可以使用页面访问令牌。您只需授权用户一次即可获得用户访问令牌;将其有效期延长至两个月,然后请求页面的令牌。这一切都在方案 5中进行了解释。请注意,获取的页面访问令牌仅在用户访问令牌有效时才有效。

于 2013-06-19T17:57:38.707 回答
4

在获得永久访问令牌时,我按照Donut提到的 5 个步骤进行操作。然而,在第 5 步中,在生成永久访问令牌时,它会返回长期访问令牌(有效期为 2 个月)而不是永久访问令牌(永不过期)。我注意到的是 Graph API 的当前版本是 V2.5。如果您尝试使用 V2.5 获取永久访问令牌,它会提供长期访问令牌。尝试使用 V2.2 进行 API 调用(如果您无法在图形 api 资源管理器中更改版本,请点击 API 调用https: //graph.facebook.com/v2.2/ {account_id}/accounts?access_token={long_lived_access_token}在 V2.2 的新标签中)然后您将获得永久访问令牌(永不过期)

于 2016-03-20T03:25:02.933 回答
4

由于所有早期的答案都是旧的,并且由于 facebook 的政策不断变化,其他提到的答案可能不适用于永久令牌。

经过大量调试后,我可以使用以下步骤获取永不过期的令牌:

图形 API 资源管理器:

  1. 打开graph api explorer并在右侧下拉框中选择要获取访问令牌的页面,点击发送按钮并复制生成的access_token,这将是一个短暂的令牌
  2. 复制该令牌并将其粘贴到访问令牌调试器中,然后按调试按钮,在页面底部单击扩展令牌链接,这会将您的令牌有效期延长至两个月。
  3. 复制该扩展令牌并将其与您的 pageId 粘贴到下面的 url 中,然后点击浏览器 url https://graph.facebook.com/{page_id}?fields=access_token&access_token={long_lived_token}
  4. 您可以在访问令牌调试器工具中检查该令牌并验证Expires字段,该字段将永远显示。

就是这样

于 2020-10-02T18:38:41.450 回答
3

除了提到的方法之外,值得一提的是,对于服务器到服务器的应用程序,您还可以使用这种形式的永久访问令牌: app_id|app_secret 这种类型的访问令牌称为 App Token。它通常可用于调用 Graph API 和查询应用程序后端中的公共节点。这里提到:https ://developers.facebook.com/docs/facebook-login/access-tokens

于 2015-03-08T16:47:17.230 回答
3

现在上面的大多数答案都没有给出永久令牌,他们只将其延长到 2 个月。这是我得到它的方法:

  1. Graph Explorer 工具中,选择相关权限并获取短期页面访问令牌。
  2. 转到调试器工具并粘贴您的访问令牌。然后,单击页面底部的“扩展令牌”按钮。
  3. 复制扩展令牌并在此 API 中使用它:
  4. https://graph.facebook.com/v2.10/me?fields=access_token&access_token= <extended_access_token>
  5. 这应该会为您返回永久访问令牌。您可以在调试器工具中验证它,过期字段应显示“从不”。
于 2021-01-09T10:36:04.563 回答
2

感谢@donut,我设法在 JavaScript 中获得了永不过期的访问令牌。

// Initialize exchange
fetch('https://graph.facebook.com/v3.2/oauth/access_token?grant_type=fb_exchange_token&client_id={client_id}&client_secret={client_secret}&fb_exchange_token={short_lived_token}')
.then((data) => {
    return data.json();
})
.then((json) => {
    // Get the user data
    fetch(`https://graph.facebook.com/v3.2/me?access_token=${json.access_token}`)
    .then((data) => {
        return data.json();
    })
    .then((userData) => {
        // Get the page token
        fetch(`https://graph.facebook.com/v3.2/${userData.id}/accounts?access_token=${json.access_token}`)
        .then((data) => {
            return data.json();
        })
        .then((pageToken) => {
            // Save the access token somewhere
            // You'll need it at later point
        })
        .catch((err) => console.error(err))
    })
    .catch((err) => console.error(err))
})
.catch((err) => {
    console.error(err);
})

然后我像这样使用保存的访问令牌

fetch('https://graph.facebook.com/v3.2/{page_id}?fields=fan_count&access_token={token_from_the_data_array}')
.then((data) => {
    return data.json();
})
.then((json) => {
    // Do stuff
})
.catch((err) => console.error(err))

我希望有人可以修剪这段代码,因为它有点乱,但这是我能想到的唯一方法。

于 2019-01-07T17:41:11.643 回答
2

如果您有 facebook 的应用程序,那么您可以尝试使用 app-id 和 app-secret。

像 :

access_token={your-app_id}|{your-app_secret}

它不需要经常更改令牌。

于 2019-07-03T05:37:55.593 回答
1

达到应用程序请求限制 (#4) - FB API v2.1 及更高版本

这个答案让我得到了“我们的最终答案”,所以它非常相关,所以我在这里附加它。虽然它与上述有关,但它有所不同,似乎 FB 简化了一些过程。

当 FB 将 api 更新到 v 2.1 时,我们网站上的分享计数停止工作。在我们的例子中,我们已经有一个 FB 应用程序并且我们没有使用 FB 登录。所以我们需要做的是获得一个FB APP Token来发出新的请求。这是截至 2016 年 8 月 23 日的数据。

  1. 转到:https ://developers.facebook.com/tools/explorer
  2. 选择 api 版本,然后使用 GET 并粘贴以下内容:

    /oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials
    

    您将需要从您的应用页面获取您的应用 ID应用密码。主 FB Apps 开发者页面

  3. 运行图形查询,您将看到:

    {
       "access_token": "app-id|app-token",
       "token_type": "bearer"
    }
    

    在哪里

    “应用程序 ID”
    “应用令牌”
    将是您的 FB 应用程序页面中的应用程序 ID 和您刚刚收到的生成的 FB 应用程序 HASH。

  4. 接下来去测试你的新APP访问令牌:FB Access Token tester

  5. 你应该看到,通过粘贴

    “应用令牌”
    进入令牌测试器,一个基于应用程序的令牌,没有到期日期/时间。

在我们的例子中,我们使用的是 FB js sdk,所以我们将调用更改为这样(请注意,这只会获取共享计数,而不是像以前那样合并共享和评论计数)

FB.api(
    '/','GET',{
    // this is our FB app token for our FB app 
        access_token: FBAppToken,
        "id":"{$shareUrl}","fields":"id,og_object{ engagement }"
}

这现在工作正常。这需要大量搜索和 FB 的官方错误报告,以确认我们必须开始向 FB api 发出标记化请求。顺便说一句,我确实要求他们(FB)向提到标记化请求的错误代码(#4)添加一个线索。

我刚刚从我们的一位开发人员那里得到另一份报告,由于对标记化请求的新需求,我们的 FB 评论计数也被破坏了,所以我会相应地更新它。

于 2016-08-23T15:12:13.063 回答
1

这些例子中的许多都不起作用,不确定是不是因为 2.9v 出来了,但我在敲我的头。无论如何,我采用了@dw1 版本并在@KFunk 视频的帮助下对其进行了一些修改,并在 2.9 版本中为我工作。希望这可以帮助。

$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
    $r = json_decode(file_get_contents("https://graph.facebook.com/v2.9/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/{$args['pageid']}?fields=access_token&access_token={$longtoken}")); // get user id
    $finaltoken=$r->access_token;
    return $finaltoken;
}
于 2017-06-19T21:09:50.730 回答
0

截至 2020 年 4 月,我之前的永久页面令牌开始在 1 到 12 小时之间到期。manage_pages我开始使用具有实现先前目标(轮询页面事件)权限的用户令牌。这些令牌似乎是永久性的。

我根据这篇文章中的信息创建了一个 python 脚本,托管在github.com/k-funk/facebook_permanent_token 上,以跟踪需要哪些参数,以及哪些获取永久令牌的方法有效。

于 2020-05-14T09:00:04.887 回答
0

我根据甜甜圈的回答创建了一个小的 NodeJS 脚本。将以下内容存储在名为 get-facebook-access-token.js 的文件中:

const fetch = require('node-fetch');
const open = require('open');

const api_version = 'v9.0';
const app_id = '';
const app_secret = '';
const short_lived_token = '';
const page_name = '';

const getPermanentAccessToken = async () => {
  try {
    const long_lived_access_token = await getLongLivedAccessToken();
    const account_id = await getAccountId(long_lived_access_token);
    const permanent_page_access_token = await getPermanentPageAccessToken(
      long_lived_access_token,
      account_id
    );
    checkExpiration(permanent_page_access_token);
  } catch (reason) {
    console.error(reason);
  }
};

const getLongLivedAccessToken = async () => {
  const response = await fetch(
    `https://graph.facebook.com/${api_version}/oauth/access_token?grant_type=fb_exchange_token&client_id=${app_id}&client_secret=${app_secret}&fb_exchange_token=${short_lived_token}`
  );
  const body = await response.json();
  return body.access_token;
};

const getAccountId = async (long_lived_access_token) => {
  const response = await fetch(
    `https://graph.facebook.com/${api_version}/me?access_token=${long_lived_access_token}`
  );
  const body = await response.json();
  return body.id;
};

const getPermanentPageAccessToken = async (
  long_lived_access_token,
  account_id
) => {
  const response = await fetch(
    `https://graph.facebook.com/${api_version}/${account_id}/accounts?access_token=${long_lived_access_token}`
  );
  const body = await response.json();
  const page_item = body.data.find(item => item.name === page_name);  
  return page_item.access_token;
};

const checkExpiration = (access_token) => {
  open(`https://developers.facebook.com/tools/debug/accesstoken/?access_token=${access_token}&version=${api_version}`);
}

getPermanentAccessToken();

填写常量,然后运行:

npm install node-fetch
npm install open
node get-facebook-access-token.js

运行脚本后,会在浏览器中打开一个页面,显示令牌及其有效期。

于 2020-11-24T11:08:57.393 回答
-1

我找到了这个答案,它指的是这个工具,它真的很有帮助。

我希望这个答案在您阅读本文时仍然有效。

于 2018-03-03T12:25:04.333 回答