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

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

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

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


当前回答

另一个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开始,在调试了短访问令牌之后,只需单击访问令牌调试器工具底部的扩展访问令牌,就可以跳过获取长访问令牌的许多麻烦。掌握了pageid和longlivetoken的信息后,运行下面的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。如果您错误地选择了user令牌,则第二个代码将无法工作。

感谢dw1和Rob

其他回答

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

获取永久页面访问令牌

进入图形API资源管理器 在应用程序中选择你的应用程序 将长寿命访问令牌粘贴到access token中 在“访问令牌”旁边,选择要为其设置访问令牌的页面。访问令牌显示为一个新字符串。 单击i查看此访问令牌的属性 再次点击“打开访问令牌工具”按钮,打开“访问令牌调试器”工具,检查属性

一个提示,它只适用于我的网页语言是英语。

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

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

经过大量的调试,我能够获得永不过期令牌使用以下步骤:

图形API浏览器:

Open graph api explorer and select the page for which you want to obtain the access token in the right-hand drop-down box, click on the Send button and copy the resulting access_token, which will be a short-lived token Copy that token and paste it in access token debugger and press debug button, in the bottom of the page click on extend token link, which will extend your token expiry to two months. Copy that extended token and paste it in the below url with your pageId, and hit in the browser url https://graph.facebook.com/{page_id}?fields=access_token&access_token={long_lived_token} U can check that token in access token debugger tool and verify Expires field , which will show never.

这是它

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

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

0. 创建Facebook应用

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

进入我的应用程序。 点击“+添加新应用”。 建立一个网站应用程序。

你不需要改变它的权限之类的。你只需要一个应用程序,在你完成访问令牌之前不会消失。

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

转到图形API资源管理器。 选择你想要获取访问令牌的应用程序(在“应用程序”下拉菜单中,而不是“我的应用程序”菜单中)。 点击“获取令牌”>“获取用户接入令牌”。 在弹出的“扩展权限”选项卡下,选中“manage_pages”。 点击“获取访问令牌”。 授予具有管理目标页面权限的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和secret以及在前一步中生成的短期令牌。

不能使用图形API资源管理器。由于某种原因,它在这个请求上卡住了。我认为这是因为响应不是JSON,而是一个查询字符串。因为它是一个GET请求,所以您可以直接在浏览器中访问URL。

响应应该是这样的:

{“access_token”:“ABC123”,“token_type”:“持票人”、“expires_in”:5183791}

“ABC123”将是您的长期访问令牌。您可以将其放入访问令牌调试器中进行验证。在“Expires”下面应该有类似“2个月”的内容。

3.获取用户ID

使用长期访问令牌,向

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响应应该有一个数据字段,下面是用户可以访问的项的数组。找到要从中获得永久访问令牌的页面的项。access_token字段应该有您的永久访问令牌。复制它并在访问令牌调试器中测试它。在“过期”下面应该显示“永不”。

多亏了@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))

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