【问题标题】:facebook graph-apifacebook 图形 API
【发布时间】:2013-02-12 23:31:46
【问题描述】:

我想从 facebook 检索外部网页的最新粉丝专页更新。

似乎有两个问题...

一,访问令牌似乎在一小时后过期,有没有办法获得永久访问令牌?

其次,我想获取页面所有者最近10个帖子的json字符串(包含“消息”字段的帖子)。

例如,如果我使用“https://graph.facebook.com/stackexchange/posts?fields=message&limit=10”,它将返回不包含消息字段的行。有没有办法过滤这些?

也许有一种方法可以使用 FQL 查询来检索它?

【问题讨论】:

  • 您无法获得永久访问令牌,这违背了 OAuth 的目的(以及一般的安全性)。

标签: facebook facebook-graph-api facebook-fql


【解决方案1】:

如果您的页面没有任何限制,您可以使用永久应用访问令牌获取此数据。如果您使用其中一种服务器端 SDK,它们会自动为您获取一个。

如果您没有使用 SDK,或者您使用 JavaScript 编写代码,文档的 Login as an App 部分将引导您完成此操作。

您通过此方法获得的访问令牌将一直存在,直到您更改应用密码。

如果您的页面有年龄和/或国家/地区限制,那么您需要用户访问令牌才能通过 API 获取数据。根据 TOS,您应该对每个用户进行身份验证,并且仅在他们满足页面所有者设置的限制时才向他们显示结果。

最好通过 FQL 获取页面发布的最后 10 个帖子。试试这个查询:

SELECT created_time, message, attachment FROM stream WHERE 
   source_id = YOUR_PAGE_ID AND filter_key = "owner" AND message != "" LIMIT 10

【讨论】:

  • 这个 SQL 风格的查询运行良好,但无论我是否包含 LIMIT 似乎都没有返回 7 个结果。有与此等效的图表吗?
  • 您无法使用 Graph API 进行过滤。您所能做的就是获取所有内容并自行过滤。
【解决方案2】:

关于永久访问令牌:我认为您正在寻找应用访问令牌。阅读更多:https://developers.facebook.com/docs/technical-guides/opengraph/publishing-with-app-token/

关于您的第二个问题:从输出中检查是否存在“消息”键。如果不排除该条目。在 PHP 中有一个函数 array_key_exists 可以做这件事。

【讨论】:

  • 这非常适合获取永久密钥。这是一个客户端应用程序——我使用了一个类似的 js 函数(hasOwnProperty),但是我更愿意查询我想要的最后 10 个项目,而不是在返回后修剪所有帖子。
【解决方案3】:

好吧,您可以尝试让 Facebook 页面的管理员 ($pageId) 授权您的应用 ($fbAppId):

<script>
    var oauth_url = 'https://www.facebook.com/dialog/oauth/';
    oauth_url += '?client_id=<?php echo $fbAppId; ?>';
    oauth_url += '&redirect_uri=' + encodeURIComponent('https://www.facebook.com/pages/null/<?php echo $pageId; ?>/?sk=app_<?php echo $fbAppId; ?>');
    oauth_url += '&scope=manage_pages'

    window.top.location = oauth_url;
</script>

当他们授权时,您可以使用您获得的签名请求 ($signedRequest = $facebook-&gt;getSignedRequest();) 请求持久令牌:

$url = 'https://graph.facebook.com/oauth/access_token?client_id=' . $fbAppId . '&client_secret=' . $appSecret . '&grant_type=fb_exchange_token&fb_exchange_token=' . $signedRequest['oauth_token'];

cURL 这个 URL 并得到结果 access_token:

$access_token = substr($response, strlen('access_token='));

将其保存到您的数据库中。有了这个,你可以得到帖子:

$graphUrl = '/' . $pageId . '/posts?access_token=' . $accessToken;
$posts = $this->facebook->api($graphUrl, 'GET');

我不知道这个 access_token 多久到期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多