您能否在不征得用户允许的情况下使用 Graph API 获取公共 Facebook 页面的提要?

IT技术 javascript facebook facebook-graph-api client-side oauth-2.0
2021-03-12 16:59:47

我从未使用过 Facebook 的 Graph API 或 OAuth。我只是想使用 Graph API 获取公共 Facebook 页面的提要,但它需要访问令牌。我不想麻烦用户登录并允许访问以获取他们的令牌。Facebook 应用访问令牌可用于获取公共提要,但我正在尝试完全使用 Javascript 执行此操作,因此我无法使用应用机密来执行此操作。我在某处读到 Facebook 应用程序访问令牌不会过期或更改,除非我手动重置密码。这是真的?仅在访问令牌中进行硬编码是否安全?如果没有,是否有某种方法可以验证应用程序以获取令牌而无需涉及用户?我可以使用某种类型的通用应用程序令牌吗?

6个回答

如果您像我一样,您的客户不会想要一个标准的 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}");

感谢有人建议我进行编辑,我认为这段代码来自这里(反正看起来很熟悉 :) )并且那里的评论中有更多信息可能会有所帮助。

然后你可以解析这个对象,这里有一些代码可以基于这个线程在 PHP 中完成;

处理 PHP JSON 对象中的数据

$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

看起来这不再适用于收紧权限 - 现有应用程序可能会继续工作,但新应用程序需要批准。
2021-04-30 16:59:47
我终于明白我做错了什么。2件事:1)我没有使用access_tokenFB返回的全部内容2)我不得不取出花括号。他们给了我一个“无效令牌”错误。
2021-05-05 16:59:47
尝试运行 -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|123456An access token is required...出现错误。我做错了什么,我应该在我的应用程序页面上启用一些东西吗?
2021-05-07 16:59:47
@McNab,您是否必须将您的应用提交给 Facebook 进行审核才能查看帖子?我所做的一切都不是让我对访问令牌的请求起作用。
2021-05-12 16:59:47
谢谢你,谢谢你,谢谢你!如果 Facebook API 文档像这样简单就好了!
2021-05-16 16:59:47

除非我手动重置密码,否则 Facebook 应用访问令牌永远不会过期或更改

没错。

除非重置 App Secret,否则 App 令牌不会过期。应用访问令牌对每个应用都是唯一的。

由于公共提要采用任何有效的访问令牌,因此可以使用应用程序令牌。

转到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 网址是一个宝石!
2021-05-16 16:59:47

针对@Psyked 和@James_David_Low 的消息,不推荐使用FQL,因为已被弃用。

“... Facebook 也使用两个低级 HTTP API 来访问图形:FQL 和 Legacy REST API。这些 API 包含相似和重叠的功能,但已弃用。”

新功能通常仅在Graph API 中可用为了让您的应用面向未来,您应该尽可能在您的应用中使用 Graph API。

事实并非如此,FQL 本身并未被弃用。不推荐通过 RestAPI 和其他一些较旧的方式使用它 - 但绝对不推荐使用Graph API 端点进行FQL 查询
2021-04-30 16:59:47
Diego 是对的,CBroe 是错的:FQL 和 REST API 在 v2.1 中不再可用:之前在 v2.0 中宣布,应用程序必须从 v2.1 开始迁移到版本化的 Graph API 调用。developer.facebook.com/docs/apps/changelog
2021-05-18 16:59:47

接受的答案没有提供检索 profileId/pageId 的动态方法,甚至没有解释如何检索它。查看我的回答/问题根据我的经验,接受的答案在要求app-id周围的花括号方面也是错误的app-secret当我包含这些时,我遇到了一个错误,并且解决了它们。

没有比这更简单的了。

如果您想在应用程序中使用页面提要(如您自己的页面提要)向他人展示。只需使用您自己的 access_token 即可获取。
但!因为这不是一个好的做法,您也可以使用页面或应用程序登录并使用他们的 access_token。

有关更多信息,请阅读有关身份验证官方文档