facebook:永久页面访问令牌?


193

我正在一个以Facebook页面作为其数据源之一的项目上工作。它在不涉及GUI的情况下定期从其中导入一些数据。然后,我们使用一个Web应用程序来显示我们已经拥有的数据。

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

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

编辑:我刚刚发现它的答案在这里:服务器的持久FB访问令牌以拉出FB页面信息



看起来确实如此。我的头衔更好,他的问题更详细,我们都接受了大致相同的答案。
Vlasec 2014年

Answers:


638

按照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文档的这些说明,向GET请求

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”将是您的长期访问令牌。您可以将其放入访问令牌调试器中进行验证。在“过期”下,其内容应类似于“ 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字段应具有您的永久访问令牌。复制它并在访问令牌调试器中对其进行测试。在“过期”下,应该说“从不”。


14
Facebook搞砸了,所以它不再起作用了。:-(在上述步骤1.5之后(单击“获取访问令牌”按钮),下面的对话框中出现红色警告,指出“提交登录审阅-以下某些权限尚未被Facebook批准使用”,并且下方同时显示带有文本“这不允许应用程序发布到Facebook”的挂锁。因此,应在上面的步骤1.5和1.6之间插入一个新步骤,显示为“对您的应用程序进行很多繁琐的操作,然后将其提交以供审核,然后祈祷并等待。” :-(任何人都知道为纯测试应用程序解决此
问题的方法

10
对于最后一步,浏览器返回的任何人:message: "(#100) Tried accessing nonexisting field (accounts) on node type (Page)", type: "OAuthException", code: 100 转到FB Access Token Debugger并测试您的long_lived_access_token。一致地,我已经看到几分钟后,如果您返回并重新检查long_lived_access_token,则FB访问令牌调试器将指示该令牌是永久的(过期:永不)
AdjunctProfessorFalcon 2015年

14
我发誓,如果我还没读完这个答案,我仍然会用短暂的令牌将我的头撞在墙上...不幸的是,最后一部分无法正常工作...我得到了(#100) Tried accessing nonexisting field (accounts) on node type (Page)错误。 。无法继续执行步骤5 ...仍然,谢谢... LE:请查看@Vlasec提供的答案的最后一部分。您可以通过查询/ {pageId}?fields = access_token&access_token = {long_lived_access_token}来获取永久访问令牌,因此已解决问题。
Mujnoi Gyula Tamas

15
必须使用它作为最后一步来获取我的永久访问令牌,因为它说“账户”不存在,甚至对于v2.7也是如此:https://graph.facebook.com/v2.7/{page_id}?fields=access_token&access_token={long_lived_access_token}
Reado 2016年

5
在最后一步中,我得到以下异常{“ error”:{“ message”:“语法错误\”预期的字符串结尾,而不是字符11的\“?\”。\“:access_toke \ u200c \ u200bn” ,“类型”:“ OAuthException”,“代码”:2500,“ fbtrace_id”:“ A8 + gtSaShIO”}}任何人都知道如何解决它???
露西

89

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

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

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


3
没有要按的“扩展访问令牌”按钮。也许他们把它拿出来了。
Cesar Bielich

4
我看到“扩展”按钮
Eduardo

2
扩展访问令牌(第2步)并再次对其进行调试之后,它应该永不过期。您可能只需通过步骤3和
4。– daniel_serretti

1
感谢您提供这个答案,比上面的大答案更容易理解。真的很有帮助。
Paul Laffitte

2
噢,伙计,你着火了!太谢谢了!我浪费了太多时间来找到此选项,因为我无法正确调试应用程序!
Killuminati

11

除了Vlasec答案中建议的步骤,您还可以使用:


3
这不再起作用了。令牌仅持续一个小时
闪动一下'16

@flashsnake您是否在v2.8上进行了实际测试?令牌调试器显示Expires Never
Bizmate'1

我不记得了 我可能已经测试过了。
flashsnake

11

我制作了一个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;
}

1
+1刚刚尝试过,在所有这些部分贬值的答案中,它行之有效!我喜欢这个答案,因为将来的修改很容易,只需在此处和此处进行一些编辑即可。
Siddhant Rimal

抱歉,我不允许编辑此答案。因此,对于Graph API 2.9,我写了另一个答案
Siddhant Rimal

似乎他们用2.9更改了内容,因为这些示例都不起作用了
Cesar Bielich

10

使生活更加轻松的另一个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开始,调试了短访问令牌后,只需单击访问令牌调试器工具底部的扩展访问令牌,就可以跳过获得长访问令牌的大部分麻烦。拥有有关和的信息,请运行以下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


扩展访问令牌按钮不存在,我缺少什么吗?
Cesar Bielich

@CesarBielich:您必须先调试短访问令牌。当您调试简短的应用令牌时,它会显示在结果下方。由于看不到它,因此必须调试了用户访问令牌。请注意,此答案不适用于使用访问令牌。只能使用应用程序访问令牌。用户访问令牌不能是永久的。它们最多可以生成长令牌。
Siddhant Rimal

1
@CesarBielich我认为您在这里有些困惑。您可以为用户,应用程序和页面创建访问令牌。您需要选择创建的应用程序,而不是Graph API Explorer在“应用程序”字段中选择,才能请求令牌。
Siddhant Rimal

@CesarBielich:如果第二种方法对您来说太混乱了,请使用第一种方法。您只需在第一个字段中填写输入字段,一切就会自动发生:)
Siddhant Rimal

抱歉,我在评论我昨晚刚刚发表的另一则帖子,哈哈。是的,由于某种原因,我无法让您的工作,并使我成为永不过期的令牌。我必须v2.9在第二个通话中删除,这对我有用。Wierd
Cesar Bielich

6

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

获取永久页面访问令牌

  • 转到Graph API Explorer
  • 应用程序中选择您的应用程序
  • 将长期存在的访问令牌粘贴到访问令牌中
  • 访问令牌旁边,选择您想要访问令牌的页面。访问令牌显示为新字符串。
  • 单击以查看此访问令牌的属性
  • 再次单击“在访问令牌工具中打开”按钮以打开“访问令牌调试器”工具以检查属性

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


1
这家伙!!!5种虚拟啤酒。这可以代替已批准答案的步骤5。图形版本2.8

1
我在使用Facebook API上浪费了数周的时间。到目前为止,这是我遇到的最混乱和不一致的令牌。该解决方案仍然可以正常使用。.2017
user919426

4

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


对不起,也许我还不够清楚。我已经阅读了有关令牌的信息,我只需要学习如何向用户请求权限并将令牌传输到我的应用程序。看来我需要创建一些Facebook“应用”,其唯一目的是请求权限,对吗?
Vlasec

1
@Viasec更正获取访问令牌的唯一方法是通过应用程序,如此处所述developer.facebook.com/docs/facebook-login
phwd

谢谢,我一定以某种方式无视了它,我认为它在APIs部分中的某个地方,这是错误的。我会看的,希望它能回答我的问题。
Vlasec13年

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的新标签中),您将获得永久访问令牌(永不过期)


返回api版本以获得结果只会在我发现的将来导致更多工作,尤其是因为API版本会在一段时间后过期。
SlickRemix

它返回null :(我们如何获得页面访问令牌?
Nancy thakkar 2016年

3

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


1
是否允许任何形式的页面访问?我认为不是,在那种情况下,它并不能真正回答问题。
Vlasec 2015年

@Vlasec它允许您访问公开帖子上的评论
Ali Gajani '17

1
尽管对于某些人来说这可能就足够了,但它不能回答问题。
Vlasec

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))

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


2

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

喜欢 :

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

不需要经常更改令牌。


1

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

这个答案使我想到了“对我们的最终答案”,因此它与之非常相关,因此我将其附加在这里。尽管与上述内容相关,但有所不同,并且FB似乎简化了该过程。

当FB将api滚动到v 2.1时,我们站点上的共享计数停止工作。在我们的情况下,我们已经有一个FB APP,而我们没有使用FB登录。因此,我们需要做的是获得一个FB APP令牌来发出新请求。这是截至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"
    }
    

    哪里

    “ app-id”
    “应用令牌”
    将是您的FB应用页面中的应用ID,以及您刚刚收到的生成的FB应用哈希。

  4. 接下来,测试您的新APP访问令牌:FB访问令牌测试器

  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评论计数也被破坏了,因此我将对此进行相应的更新。


1
登录并允许该应用访问的始终是该应用的用户。无论如何,这似乎并没有创建页面访问令牌,因此我认为这不是该问题的有效答案。有趣的是-也许自己做一个Q / A?
Vlasec

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;
}

代码段不错,但是这个问题不是关于如何在PHP中进行,而是关于如何使用API​​本身,这也可以在Java或.NET中完成。例如,我需要用Java来做。对于不使用PHP的用户,伪代码或分步指南将更有用。
Vlasec

2
@Vlasec我认为这个PHP代码段非常接近任何伪代码,并且非常容易理解。Casar仅使用了facebook已经提供的一些API。其余的内容不言自明。
Siddhant Rimal

0

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

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


-1

我发现工具的参考答案确实很有帮助。

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


好。甜甜圈的答案仍然有效,还是需要一些额外的步骤?
Vlasec
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.