您能否在不要求用户允许的情况下使用 Graph API 获取公共 Facebook 页面的提要?
Posted
技术标签:
【中文标题】您能否在不要求用户允许的情况下使用 Graph API 获取公共 Facebook 页面的提要?【英文标题】:Can you get a public Facebook page's feed using Graph API without asking a user to allow? 【发布时间】:2012-03-11 12:46:37 【问题描述】:我从未使用过 Facebook 的 Graph API 或 OAuth。我只是想使用 Graph API 获取公共 Facebook 页面的提要,但它需要访问令牌。我不想麻烦用户登录并允许访问以获取他们的令牌。 Facebook 应用程序访问令牌可用于获取公共提要,但我试图完全在 javascript 中执行此操作,因此我无法使用应用程序密码来执行此操作。我在某处读到 Facebook 应用程序访问令牌永远不会过期或更改,除非我手动重置密码。这是真的?在访问令牌中硬编码是否安全?如果没有,是否有某种方法可以验证应用程序以获取令牌而无需涉及用户?我可以使用某种类型的通用应用令牌吗?
【问题讨论】:
如果你能做到这一点,那么 FB 就不安全了,不是吗? ;) 我只是想阅读一开始就公开的信息。没有帖子,只读。听说旧系统也可以。编辑:“它”是对公共页面提要的 api 访问,没有令牌 可以使用页面令牌来做到这一点,但我不能说将其公开给前端有多安全。 我需要相同的功能:我想请求业务页面的公共提要,以便将其解析为我们的“新闻”页面上的帖子,但我不打算让每个用户都去登录 Facebook 只是为了获取一些毫无意义的访问令牌!这是一个公共供稿! 您可以使用任何有效的访问令牌毫无问题地提供公共帖子。例如developers.facebook.com/tools/… 【参考方案1】:如果您像我一样,您的客户不会想要标准的 Facebook 点赞框插件,他们会希望它以自己的方式设计和定制。
您无需整天都在翻阅官方文档,想知道其中是否适用于像这样简单的东西,这很容易。之所以会出现混淆,是因为您假设使用所有这些密钥和秘密 ID,您必须从您想要从中提取提要的 Facebook 页面获得许可或身份验证——您不需要。您只需要一个有效的应用程序,即可获取任何公共页面的供稿。
在 Facebook 中设置您的应用,它会为您提供一个应用 ID 和一个 API 密钥。获取您想要的公共页面提要的配置文件 ID,这就是您所需要的。然后,您可以使用以下代码检索身份验证令牌,然后使用该代码将提要数据作为 JSON 对象返回。
<?php
function fetchUrl($url)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
// You may need to add the line below
// curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
$feedData = curl_exec($ch);
curl_close($ch);
return $feedData;
$profile_id = "the_profile_id_of_the_page_you_want";
//App Info, needed for Auth
$app_id = "your_app_id_in_here";
$app_secret = "your_app_secret_in_here";
//Retrieve auth token
$authToken = fetchUrl("https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id=$app_id&client_secret=$app_secret");
$json_object = fetchUrl("https://graph.facebook.com/$profile_id/feed?$authToken");
感谢有人建议的编辑,我认为此代码来自 here(无论如何看起来很熟悉 :))并且那里的 cmets 中有更多信息可能会有所帮助。
然后你可以解析对象,这里有一些代码可以基于这个线程在 PHP 中完成;
Handling data in a PHP JSON Object
$feedarray = json_decode($json_object);
foreach ( $feedarray->data as $feed_data )
echo "<h2>$feed_data->name</h2><br />";
echo "$feed_data->message<br /><br />";
要找出 json 对象中可用的内容,您可以在浏览器中输出 url 并将其复制/粘贴到这个有用的 json 可视化工具中;
http://chris.photobooks.com/json/default.htm
【讨论】:
尝试运行 -https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=<1234>&client_secret=<1qw2e3e>
得到响应 access_token=123456|123456
然后运行 https://graph.facebook.com/espn/feed?access_token=123456|123456
并得到 An access token is required...
错误。我做错了什么,我应该在我的应用页面上启用某些东西吗?
谢谢谢谢谢谢!如果 Facebook API 文档像这样简单明了就好了!
@McNab,您是否必须将您的应用程序提交到 Facebook 以供审核才能查看帖子?我所做的就是让我的访问令牌请求起作用。
我终于弄清楚我做错了什么。两件事:1)我没有使用 FB 返回的完整 access_token
。 2)我不得不拿出花括号。他们给了我一个“无效令牌”错误。
随着权限的收紧,这似乎不再适用 - 现有应用程序可能会继续运行,但新应用程序需要批准。【参考方案2】:
除非我手动重置密码,否则 Facebook 应用访问令牌永远不会过期或更改
没错。
除非重置 App Secret,否则应用令牌不会过期。应用访问令牌对于每个应用都是唯一的。
由于公共提要采用任何有效的访问令牌,因此可以使用应用程序令牌。
转到https://developers.facebook.com/tools/access_token,您不需要流程。然后你就可以硬编码了。重置密码的那一刻,这个方法就失效了。
$access_token = '1111111111|2Cha_1-n5'
$graph_url = "https://graph.facebook.com/Boo/posts?access_token="
. $access_token;
$page_posts = json_decode(file_get_contents($graph_url), true);
然后遍历页面
foreach($page_posts['data'] as $post)
$post_link = $post['actions'][0]['link'];
$page_id = $post['from']['id'];
$page_name = $post['from']['name'];
$message = ($post['message']) ? $post['message'] : " ";
$name = ($post['name']) ? $post['name'] : " ";
$story = ($post['story']) ? $post['story'] : " ";
$post_time = $post['updated_time'];
来源:http://philippeharewood.com/facebook/how-to-get-facebook-access-tokens-in-php-for-public-posts-the-basic-sauce/
【讨论】:
那个小小的 access_token url 是一个宝石!【参考方案3】:针对@Psyked 和@James_David_Low 的消息,不推荐使用FQL,因为已弃用。
"...Facebook 也使用两个低级 HTTP API 来访问图表:FQL 和旧版 REST API。这些 API 包含相似且重叠的功能,但已被弃用。"
新功能通常仅在Graph API 中提供。 为了让您的应用适应未来发展,您应该尽可能在应用中使用 Graph API。
【讨论】:
这不是真的,FQL 本身并没有被弃用。通过 RestAPI 和其他一些较旧的方式使用它已被弃用 - 但 FQL 查询使用 Graph API 端点绝对不被弃用。跨度> Diego 是对的,CBroe 是错的:FQL 和 REST API 在 v2.1 中不再可用:之前在 v2.0 中宣布,应用程序必须从 v2.1 开始迁移到版本化的 Graph API 调用。 developers.facebook.com/docs/apps/changelog【参考方案4】:接受的答案没有提供检索 profileId/pageId 的动态方式,甚至没有说明如何检索它。查看我的answer/question。根据我的经验,在要求 app-id
和 app-secret
周围使用花括号时,公认的答案也是错误的。当我将它们包含在内时出现错误,它可以解决它们。
没有比这更简单的了。
【讨论】:
【参考方案5】:如果您想在应用中使用页面提要(例如您自己的页面提要)向他人展示。只需使用您自己的 access_token 来获取它。但是!因为这不是一种好的做法,您也可以使用页面或应用程序登录并使用他们的 access_token。
更多信息请阅读official documentation on authentication
【讨论】:
【参考方案6】:我认为为了做到这一点,您必须使用 FQL 而不仅仅是 Graph API。这就是我正在做的(将PAGE_ID
替换为您的页面ID,保留引号):
SELECT post_id, created_time, type, message, attachment
FROM stream
WHERE source_id = 'PAGE_ID'
AND actor_id = source_id
https://developers.facebook.com/docs/reference/fql/stream/
【讨论】:
s3.amazonaws.com/f.cl.ly/items/2G0q0y3Z2s32311U1s40/…以上是关于您能否在不要求用户允许的情况下使用 Graph API 获取公共 Facebook 页面的提要?的主要内容,如果未能解决你的问题,请参考以下文章
如何允许用户在不登录的情况下使用 Google Form 上传文件?