如何订阅Facebook页面墙的实时更新

15

Facebook的实时更新文档现在说明您可以获取页面的feed:

您可以以与订阅用户feed相同的方式订阅页面的feed-订阅主题应为'user',订阅字段应为'feed'

我的理解是,我需要通过Graph API发布以进行订阅:

curl -d \
"object=user&fields=feed&callback_url=$CALLBACKURL&verify_token=$SECRET" \
"https://graph.facebook.com/$PAGEID/subscriptions?access_token=$OAUTHTOKEN"

(这是一个bash脚本。)这里$CALLBACKURL已经正确设置,根据他们的示例代码。(至少我认为它是正确的--我成功地使用它添加了订阅。)
$OAUTHTOKEN 是我的 Facebook 应用程序的令牌。
$PAGEID 是我想要实时获取更新的 Facebook 对象 ID。

当我进行这个调用时,似乎一切都正常--没有错误信息。我的回调被调用了。但是我肯定没有在页面动态中收到通知。

那么还有什么缺失吗?页面需要安装使用我正在使用的 oauth 令牌的应用程序吗?或者我需要通过登陆页面来以页面自身的身份获取oauth令牌?


你达到了你想要的目标了吗? - Keyne Viana
不,我最近没有深入研究过它,但我也没有看到任何证据表明当前的Facebook API实际上可以实现这一点。 - Leopd
差不多一年过去了,你找到如何做到这一点了吗? - user684934
6个回答

17

我不知道这是否能够帮到您,但是我可以告诉您如何实时更新页面订阅源:

(权限:manage_page、offline_access、read_stream)

  1. 您的应用程序必须与页面链接(然后安装应用程序,但不需要拥有选项卡,例如创建选项卡 https://graph.facebook.com/PAGE_ID/tabs?app_id=APP_ID&method=POST&access_token=PAGE_ACCESS_TOKEN 并删除选项卡 TAB_ID=PAGE_ID.'/tabs/app_'.APP_ID; https://graph.facebook.com/TAB_ID?method=DELETE&access_token=PAGE_ACCESS_TOKEN)。

  2. 
    function page_access_token($page_id,$access_token){
    $page_token_url="https://graph.facebook.com/" . $page_id . "?fields=access_token&" . $access_token; $response = file_get_contents($page_token_url); $resp_obj = json_decode($response,true); $page_access_token = $resp_obj['access_token']; return $page_access_token; }

  3. 函数 page_tabs_create($page_id,$app_id,$page_access_token):

    $page_settings_url = "https://graph.facebook.com/" . $page_id . "/tabs?app_id=".$app_id."&method=POST&access_token=" . $page_access_token; $response = file_get_contents($page_settings_url); $resp_obj = json_decode($response,true); return $resp_obj;

  4. 函数 page_tabs_delete($tab_id,$page_access_token):

    $page_settings_url = "https://graph.facebook.com/".$tab_id."?method=DELETE&access_token=" . $page_access_token; $response = file_get_contents($page_settings_url); $resp_obj = json_decode($response,true);

    return $resp_obj;

  • 订阅:要订阅必须像一个“用户”一样,因此对象=用户,字段=动态(feed),但您必须添加新字段,否则它将接收评论和赞,所以您必须添加“状态”以便接收发布的文章(我的问题是如何获取其他内容,例如链接,我已经成功添加了“链接”作为字段,但是当发布链接时,我没有收到通知)

    $param = array('access_token' => $access_token, 'object' => 'user', 'fields' => 'feed, status, link', 'callback_url' => 'http://********fbcallback.php', 'verify_token' => '***********', 'include_values' => 'true');

    POST https://graph.facebook.com/APP_ID/subscriptions

  • 我的英语不是很好,但我希望这对您有所帮助,在我的一面,我仍在寻找真正更新墙上的所有更新(链接,视频...)


    我在哪里可以找到更多关于添加“状态”字段的信息?http://bugs.developers.facebook.net/show_bug.cgi?id=18048#c40 - Caroline Craipeau
    1
    谢谢Caroline。这很有帮助。你能否更详细地描述如何将应用程序添加到页面而不创建选项卡?你会使用哪个访问令牌发送POST请求?(您可以使用“编辑”链接在帖子中编写更多内容,而不是添加评论。) - Leopd
    嗨@CarolineCraipeau,当我尝试进行POST调用时,我收到一个错误消息:“(#10)应用程序没有此操作的权限”,你知道我该怎么做吗??我请求所有权限,对于用户实时工作正常。谢谢! - Gaucho_9
    1
    当我尝试向“/tabs”端点进行POST时,我会收到“应用程序必须设置配置文件选项卡URL”的错误提示。 - Tarlen

    4

    我一直在研究这个问题,也收到了推送页面的消息。

    1. 在订阅时,请确保object = user,fields = feed,status存在。

    2. 确保将应用程序添加到您的页面中,然后才能接收更新。

    3. 从Facebook收到的响应如下:

    {"entry":[{"id":"*******","uid":"*****","time":1332940650,"changed_fields":["status"]}],"object":"user"}

    其中****是我的页面ID。

    上述推送是在添加新帖子时收到的,正如您所看到的changed_field是状态,但是当我们在墙上发布时,changed_fields会出现feed。以下链接帮助我接收页面的推送。

    http://bugs.developers.facebook.net/show_bug.cgi?id=18048


    1
    你好,你现在能读取页面动态吗?根据最新的Facebook漏洞,这是不可能的:http://developers.facebook.com/bugs/536991969662115?browse=search_50e46a01010542e20755873 - rjha94
    是的,我能够在本地和生产环境中检索页面源。 - Sanket
    谢谢。你是怎么做到上面的第二步的——将应用添加到页面的? - rjha94
    1
    向下面的 Facebook Graph Url 发送 Post 请求以在页面上添加选项卡。 "https://graph.facebook.com/pageId/tabs?app_id=appId&access_token=page_access_token - Sanket
    非常感谢。所以我在我的应用程序详细信息中添加了订阅#1,使用上述API(添加选项卡)进行#2,然后如果有人在我的Facebook页面照片上发布新评论,那么我应该收到警报,对吗?再次感谢。 - rjha94
    是的,您将收到警报。不过您可以给我的回答点个赞 :) - Sanket

    3
    首先,页面/信息流实时更新的订阅功能无法使用。 参见:http://bugs.developers.facebook.net/show_bug.cgi?id=18048

    这个页面需要安装我正在使用的 OAuth 令牌所属的应用程序吗?

    是的。

    还是我需要以该页面身份登录以获取页面本身的 OAuth 令牌?

    如果我正确理解您的意思,您只需要应用程序访问令牌https://graph.facebook.com/oauth/access_token?client_id=your_app_id&client_secret=your_secret&grant_type=client_credentials


    2

    我最初开始阅读有关实时更新的文档,认为它可以提供实际数据。但是,后来我意识到这不是目的。

    实时更新只是告诉你有什么变化,一旦发生,你可以用传统的方法调用API。

    此外,这部分似乎有错误订阅主题应该是'user',订阅字段应该是'feed'。实际上,订阅主题应该是“page”。(你也这么想吗?)

    通过订阅页面源稿与用户源稿相同,意味着你可以得到更新通知,而不是数据本身。

    不确定这是否是一个常见的错误,但我还是发帖提醒一下。

    --

    目前我正在开发一个需要实时更新的数据挖掘工具。但首先,我专注于数据本身,所以暂时无法提供任何示例。(实现这一部分后,我将编辑此答案)

    关于你的问题,我可以说:

    1)检查你的$PAGEID是否正确。实际上,它应该是你的APPID。

    2)订阅后,在调用https://graph.facebook.com/<app-id>/subscriptions?access_token=...时,你的订阅是否出现在列表中?

    3)用户订阅是否有效?还是仅适用于页面?


    我最初开始阅读有关实时更新的文档,认为它可以提供实际数据。但是,我意识到这不是其目的。实时更新只是告诉您发生了某些更改,一旦发生更改,您就可以使用传统方法调用API。现在更加清晰明了!我认为Facebook的文档没有很好地提到这一点,如果提到的话也很少。 - fuzzysearch

    1
    为此,您需要设置一个端点URL,该URL接收来自Facebook的HTTP GET(用于订阅验证)和POST(用于实际更改数据)请求。
    然后,您应该向Graph API URL https://graph.facebook.com/<app-id>/subscriptions?access_token=<access_token> 发送POST请求进行订阅,并准备处理验证请求。
    然后要列出订阅,只需在相同的URLhttps://graph.facebook.com/<app-id>/subscriptions?access_token=<access_token>上执行GET请求,该URL返回一个JSON编码的内容,其中每种对象类型最多列出一个订阅。

    1

    在开始等待通知之前,您应该检查 FB 是否实际上已经访问了 URL。

    检查以下输出:

    "https://graph.facebook.com/".FACEBOOK_APP_ID."/subscriptions?".$appToken."&client_secret=".FACEBOOK_SECRET;

    如果设置正确,这将返回回调URL!


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接