【问题标题】:Fetching third party posts from the Facebook Graph API从 Facebook Graph API 获取第三方帖子
【发布时间】:2012-12-19 10:44:28
【问题描述】:

我正在为一个从 Facebook 页面获取和显示帖子的客户端构建一个 Facebook 选项卡应用程序。该应用程序还提供向页面添加新帖子和评论现有帖子的功能。这是使用 Facebook Graph API(通过 PHP SDK)实现的。

我一切正常,但遇到了涉及从我的应用发布的问题。当用户提交帖子时,它会通过以下请求发送到 Graph API。

$facebook->api([PAGE_ID]/feed', 'POST', array(
    'message' => [MESSAGE]
));

此请求成功,帖子将显示在相关 Facebook 页面上,下方显示“通过我的应用名称”。

当我通过 API 请求页面上的帖子列表时(以下请求),上述帖子没有出现。

$posts = $facebook->api([PAGE_ID].'/feed');

我有一种强烈的感觉,这是因为帖子来自第三方应用。我听说 Facebook 会“降级”第三方帖子以鼓励使用自己的平台。所有直接通过 Facebook 发布的帖子都会出现。

但是,必须有办法检索这类帖子。

以下 Fisch 的更新

当我向 API 发帖时,会返回以下帖子 ID:

112706495458566_468411663221379

但是,当我向它发出 API 请求时:

$facebook->api('112706495458566_468411663221379');

我收到以下回复:

{
    "error": {
        "message": "Unsupported get request.",
        "type": "GraphMethodException",
        "code": 100
    }
}

但是,当我发出相同的请求但帖子的 ID 已包含在 /feed 请求中时。

$facebook->api('112706495458566_457890310940181');

我收到以下回复。

{
    "id": "112706495458566_457890310940181",
    "from": {
        "category": "Local business",
        "name": "Genting Casino Southport",
        "id": "112706495458566"
    },
    "story": "\"Very well done to ste,...\" on their own status.",
    "privacy": {
        "value": ""
    },
    "type": "status",
    "application": {
        "name": "Mobile",
        "id": "2915120374"
    },
    "created_time": "2012-11-25T22:12:21+0000",
    "updated_time": "2012-11-25T22:12:21+0000",
    "comments": {
        "count": 0
    }
}

因此,出于某种原因,Facebook 甚至不允许我通过 ID 查找帖子。

更新 #2

在寻找这个问题的答案时,我遇到了一项研究,该研究加强了我之前对分配给第三方应用帖子的“权重”的怀疑。

来自 EdgeRank Checker 报告:“在 Facebook 中创建对象时,会为其分配权重。我们认为 Facebook 战略性地降低了通过 API 创建的对象的权重。此策略背后的原因是鼓励在 Facebook 平台内创建更多内容。这最终会增加他们平台的价值,同时增加广告印象。”

http://adage.com/article/digitalnext/posting-facebook-truth-party-applications/229694

这可以解释为什么帖子没有在 /feed 或 /posts API 响应中传递。

但是,这并不能解释为什么 API 甚至不会通过其 ID 返回帖子(请参阅上面的更新)。

我能想到的是,Facebook 不会将第三方应用帖子归类为真正的“帖子”,因此不会通过适当的 API 响应推送它们。但是,我在 Facebook 文档中找不到这方面的证据。

更新 #3

根据下面的 cmets,我现在正尝试做同样的事情,但使用的 Facebook 帐户不是应用程序的所有者,或者实际上与 Facebook 上的任何页面(我自己的个人 Facebook 帐户)有任何管理员关系。

我已使用 oAuth 对话框授权应用程序并接受以下权限:

  • 电子邮件
  • user_birthday
  • publish_stream

使用我闪亮的新访问令牌,我发出以下 API 请求:

$post = $facebook->api('112706495458566/feed', 'POST', array(
    'message' => 'this is a test'
));

我收到以下回复:

array(1) {
    ["id"] => string(31) "112706495458566_470663409662871"
}

然后我检查实际的 Facebook 页面,我刚刚发送的帖子已按预期从我的 Facebook 用户帐户中出现。

然后我发出以下请求以获取页面上的所有帖子:

$posts = $facebook->api('112706495458566/feed');

我收到了页面上所有帖子的长数组(我不会在这里发布)。但是,我刚刚发送的帖子(并收到了回复的 ID)没有出现。

然后我使用 POST 请求返回的 ID 直接请求该帖子。

$post = $facebook->api('112706495458566_470663409662871');

这会引发以下异常(根据之前的尝试)。

GraphMethodException: Unsupported get request.

重申一下,这次尝试使用的帐户与我们尝试为其提取数据的应用或任何页面完全无关。该帐户也从未与应用程序有任何联系(即这是第一次接受权限并生成 oAuth 密钥)。

【问题讨论】:

  • 您是否尝试过以非管理员用户身份运行您的应用程序,还是仅以应用程序管理员身份对其进行测试?如果是后者,请尝试以非管理员用户身份运行。
  • 顺便说一句,我尝试使用选项卡式应用程序和单独的站点来复制您的问题,但无法这样做。你能告诉我,你的客户是 Facebook 页面的所有者吗?以及选项卡式应用程序?我原以为他们一定是,但不想假设任何事情。
  • 你确定这不是这个错误造成的吗?
  • @FacebookAnswers 是的,我一直在测试的 facebook 用户是应用程序的所有者,并且对选项卡所在的页面具有管理员访问权限。用户对我尝试获取帖子的页面没有管理员访问权限。也许我会尝试与不拥有该应用程序的用户一起使用(尽管这似乎是 API 运行的一种奇怪方式)。
  • @Igy 你没有提供任何错误链接。

标签: php facebook facebook-graph-api facebook-php-sdk


【解决方案1】:

丹,我试过了-

  1. APP 的供稿发布到主页

    POST: "PAGE_ID/feed"
    message: "hi"
    

    结果:发布成功

  2. 请求页面上的帖子列表

    GET: "PAGE_ID/feed"
    

    结果:页面上的所有帖子包括上述帖子。


为什么有效?

因为 GET 请求是使用用户的访问令牌发出的,该用户是发布消息的应用的管理员。

结论

我尝试了所有的案例,最后的结论是,要获取某个 APP 发布的页面 incl 的提要,您必须使用访问令牌该应用的管理员(不是大问题); 否则您只会获得其余的供稿。

【讨论】:

    【解决方案2】:

    使用Yahoo Query Language.ajax() 的组合来抓取Facebook Feed Channel的数据。

    LIVE Facebook 会员网页进行数据抓取的好处是您不需要令牌密钥来获取最新的实时供稿!

    HTML:

    <div id="results"></div>
    

    jQuery:

    $.ajax({
        url: "http://query.yahooapis.com/v1/public/yql",
        dataType: "jsonp",
        success: function(data) {
            console.log(data.query.results.json);
            $.each(data.query.results.json.entries, function(i, v) {
                $('#results').append(data.query.results.json.entries[i].content + '<br /><br />');
            });
        },
        data: {
            q: 'select * from json where url="https://www.facebook.com/feeds/page.php?id=112706495458566&format=json"',
            format: "json"
        }
    });
    

    DEMO:灵感来自online tutorial

    jsFiddle Facebook Feeds


    编辑:点击图片查看修改后的 jsFiddle with Style


    额外:

    为了补充我上面的回答,这里是准相关的 jsFiddle,标题为:

    jsFiddle Tutorial: Creating Dynamic Div's (Now Improved!)

    本教程展示了如何转换您的 HTML 标记,使其成为可以与 jQuery 一起作为对象使用的“模板”,然后可以正确地将其附加到网页中。

    【讨论】:

    • 感谢您的回答。这是一个有趣的方式来解决这个问题。我会尽快调查此事!
    • 刚刚添加:上述答案中的 EXTRA 部分。干杯!
    【解决方案3】:

    当您通过 API 发布帖子时,Facebook 会向您返回该帖子的 ID。您可以保存这些 ID,然后稍后使用图形 API 或 FQL 查询它们

    【讨论】:

    • Fisch,感谢您的回复。作为回应,我已经更新了我上面的帖子。不幸的是,Facebook 也不允许我通过它的 ID 查找帖子。几乎就像 API 不存在一样。
    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 2018-04-27
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多