facebook:永久页面访问令牌?

时间:2013-06-19 17:52:35

标签: facebook facebook-graph-api facebook-access-token

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

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

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

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

18 个答案:

答案 0 :(得分:594)

按照Facebook extending page tokens documentation中的说明,我能够获得一个未过期的页面访问令牌。

我建议将Graph API Explorer用于所有这些步骤,除非另有说明。

0。创建Facebook应用程序

如果您已有应用,请跳至步骤1.

  1. 转到My Apps
  2. 点击" +添加新应用"。
  3. 设置网站应用
  4. 您不需要更改其权限或任何内容。您只需要一个在使用访问令牌之前不会消失的应用程序。

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

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

      2。生成长期访问令牌

      在Facebook文档中关注these instructions后,向

      发出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请求,您只需转到浏览器中的网址即可。

      响应应如下所示:

        

      {&#34;的access_token&#34;:&#34;的 ABC123 &#34;&#34; token_type&#34;:&#34;承载&#34;&# 34; expires_in&#34;:5183791}

      &#34; ABC123&#34;将是您的长期访问令牌。您可以将其放入Access Token Debugger进行验证。在&#34; Expires&#34;它应该有类似的&#34; 2个月&#34;。

      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} /帐户?=的access_token的 {long_lived_access_token}

      JSON响应应该有一个data字段,在该字段下是用户有权访问的项目数组。找到您想要永久访问令牌的页面的项目。 access_token字段应具有永久访问令牌。复制它并在Access Token Debugger中测试它。在&#34; Expires&#34;它应该说&#34;从不&#34;。

答案 1 :(得分:74)

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

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

答案 2 :(得分:11)

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

答案 3 :(得分:9)

我制作了一个PHP脚本,使其更容易。 Create an app。在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;
}

答案 4 :(得分:8)

另一个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以后,您可以在调试短访问后,只需点击Access Token Debugger tool底部的扩展访问令牌,就可以避免获取长访问令牌的麻烦令牌。有关pageidlonglivedtoken的信息,请运行以下php以获取永久访问令牌。

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

答案 5 :(得分:6)

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

获取永久页面访问令牌

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

一个提示,当页面语言为英语时,它只适用于我。

答案 6 :(得分:4)

获取永久访问令牌时,我按照甜甜圈提到的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} ,然后您将获得永久访问令牌(永不过期)

答案 7 :(得分:4)

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

答案 8 :(得分:3)

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

答案 9 :(得分:2)

由于所有较早的答案都比较旧,并且由于来自facebook的政策不断变化,因此其他提及的答案可能不适用于永久令牌。

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

图形API资源管理器:

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

就这样

答案 10 :(得分:1)

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

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

我们的网站上的共享计数在FB将API转到v 2.1时停止工作。在我们的例子中,我们已经有了一个FB APP,我们没有使用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 应用密钥Main FB Apps developer page

  3. 运行图表查询,您会看到:

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

    "app-id"
    "app-token"
    将成为您的FB应用页面中的应用ID以及您刚刚收到的生成的FB App HASH。

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

  5. 您应该通过将

    "app-token"
    粘贴到令牌测试程序中,看到一个基于应用的令牌而没有到期日期/时间。

  6. 在我们的案例中,我们正在使用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评论计数也被打破,所以我会相应地更新它。

答案 11 :(得分: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;
}

答案 12 :(得分:1)

由于@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))

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

答案 13 :(得分:0)

我发现this answer指的是this tool,它确实帮助了很多。

我希望你读这篇文章时这个答案仍然有效。

答案 14 :(得分:0)

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

赞:

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

不需要频繁更改令牌。

答案 15 :(得分:0)

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

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

答案 16 :(得分: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

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

答案 17 :(得分:0)

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

  1. 从(图表资源管理器工具)0 中,选择相关权限并获取短期页面访问令牌。
  2. (转到调试器工具)1 并粘贴您的访问令牌。然后,点击页面底部的“扩展令牌”按钮。
  3. 复制扩展令牌并在此 API 中使用它:
  4. https://graph.facebook.com/v2.10/me?fields=access_token&access_token=
  5. 这应该会返回永久访问令牌。您可以在调试器工具中验证它,过期字段应显示“从不”。