【发布时间】:2017-09-29 23:49:23
【问题描述】:
我真的对 facebook api 感到困惑。 我有一个安装了基于 PHP 的 CMS 的网站。当文章在我的网站上发布时,我想在我的 Facebook 业务页面上创建一个帖子,其中包含返回该文章的链接。
现在,澄清一下:这是一个无头网络服务器,用于发布到 facebook。没有 facebook 登录,没有 facebook 用户 - 只有一个服务器和一个 facebook 页面。目标是实现自我驱动。编写/配置一次,无需手动更新令牌或其他任何东西即可工作。
问题(已编辑和重提)
如何以编程方式获取授权以将帖子发布到我的 Facebook 页面的访问令牌?
第一次通过(以用户身份验证,授予应用权限(弹出对话框),重定向回页面):
GET https://www.facebook.com/v2.9/dialog/oauth?client_id=$APP_ID&redirect_uri=$MY_URL&state=&scope=publish_pages
第二遍(获取应用的访问令牌,重定向回页面):
$CODE = $_REQUEST["code"]; // From facebook redirect process
GET https://graph.facebook.com/v2.9/oauth/access_token?client_id=$APP_ID&client_secret=$APP_SECRET&code=$CODE&redirect_uri=$MY_URL
但这将涉及一个用户,这是我的服务器上没有的。 :-(
这是我到目前为止所做的,一步一步的
创建应用
- 我需要create a Facebook App(
Add a New app按钮)。 - 该应用设置在
Apps for Pages类别下,并指向我的网站网址。 -
App ID和App Secret位于您的应用的Settings下。
获取访问令牌
- 创建应用后,我去了Facebook Graph Explorer
- 在图形资源管理器的标题栏中,我从
Application下拉列表中选择了我新创建的应用程序。 - 右下方有一个带有标签
Access Token的大文本字段。在此右侧的下拉列表中,我从Page access token中选择了我的 Facebook 页面。 - 在同一个下拉列表中,我选择了
Request publish_pages,此时我收到一个对话框提示我确认。 - 在左侧,有一个“侧边栏”——带有文本
Node: me和一个搜索字段。我点击了这个,然后再次选择了access_token。 -
Submit按钮随后为我提供了一个带有相关访问令牌的 JSON 字符串。
现在,这是一个短暂的令牌(大约一个小时)。但即使是长期存在的令牌也会在某个时候过期。 目标必须是找到一种在代码实例化时以编程方式请求令牌的方法。
在 Facebook 上发帖
下面的代码使用短期令牌工作。
$appId = 'xxxxxxxxxxxxxxxx';
$appSecret = 'yyyyyyyyyyyyyyyyyyyyy';
$accessToken = 'TheStringIGotFromGraphExplorer';
$fb = new \Facebook\Facebook([
'app_id' => $appId,
'app_secret' => $appSecret,
'default_graph_version' => 'v2.9'
]);
try {
// Returns a `Facebook\FacebookResponse` object
$response = $fb->post('/me/feed', [
'link' => $article->getUrl(),
'message' => $article->getHeader(),
'description' => $article->getIngress()
], $accessToken);
$graphNode = $response->getGraphNode();
$LOG->debug(__FILE__,__LINE__,"Posted with id: " . $graphNode['id']);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
$LOG->error(__FILE__,__LINE__,"Graph returned an error: " . $e->getMessage());
} catch(Facebook\Exceptions\FacebookSDKException $e) {
$LOG->error(__FILE__,__LINE__,"Facebook SDK returned an error: " . $e->getMessage());
}
【问题讨论】:
-
fb page的用户账号和fb app的用户账号是否相同?
-
是的,你当然需要一个应用程序。但是您不需要将页面“连接”到应用程序;相反,您只需在登录期间向页面管理员询问必要的权限。
-
@CBroe 你能详细说明一下吗?特别是“在登录期间向页面管理员询问必要的权限”部分(因为我是页面管理员,并且不知道如何在技术上向自己询问权限)。也许把它作为一个答案?
-
如果您只需要这个,您也可以从其他地方获取令牌,例如 Graph API Explorer。无需实际编码即可对其进行扩展,然后您只需在浏览器中手动执行请求即可。
-
不,它并不能消除对应用程序的需求。没有应用程序就无法与 API 对话。 “如果是这样,我怎样才能让它成为一个长期存在的令牌或永久令牌?”——这在文档中也有详细的解释。
标签: php facebook facebook-graph-api