【问题标题】:Get public page statuses using Facebook Graph API without Access Token使用没有访问令牌的 Facebook Graph API 获取公共页面状态
【发布时间】:2011-11-29 19:11:41
【问题描述】:

我正在尝试使用 Facebook Graph API 从公共页面获取最新状态,比如说http://www.facebook.com/microsoft

根据http://developers.facebook.com/tools/explorer/?method=GET&path=microsoft%2Fstatuses - 我需要一个访问令牌。由于 Microsoft 页面是“公开的”,这绝对是这种情况吗?如果没有访问令牌,我是否无法访问这些公共状态?

如果是这种情况,为我的网站创建访问令牌的正确方法是什么?我有一个 App ID,但是http://developers.facebook.com/docs/authentication/ 的所有示例都描述了处理用户登录。我只是想在 Microsoft 页面上获取最新状态更新并将其显示在我的网站上。

【问题讨论】:

    标签: facebook facebook-graph-api authentication permissions


    【解决方案1】:

    这是设计使然。一旦可以从没有访问令牌的公共页面获取最新状态。这是为了阻止对 API 的身份不明的匿名访问而进行的更改。您可以使用图形 API 通过以下调用获取应用程序的访问令牌(如果您没有为您的网站设置 Facebook 应用程序 - 您应该创建它):

    https://graph.facebook.com/oauth/access_token?
    client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&
    grant_type=client_credentials  
    

    这称为应用访问令牌。然后,您使用上面的应用访问令牌继续实际的 API 调用。

    希望对你有帮助

    【讨论】:

    • 获得应用程序令牌并将其传递给“graph.facebook.com/PADEID/statuses?access_token=”后,我收到错误消息“请求此资源需要用户访问令牌。”
    • 哎呀!小心 - 不要在任何地方公开您的应用秘密。这是一个秘密!如果它保持在服务器端,则此代码很好。
    • 那么生成的访问令牌是否永远有效?我必须为每个客户都这样做吗?如果您只是要免费赠送代币,为什么还需要代币呢?一个跳圈运动。 :p
    • 出于安全原因,不应在客户端使用秘密令牌,请参阅developers.facebook.com/docs/facebook-login/security/#appsecret
    • 对于以前访问过此数据的应用程序,这似乎将继续有效,但新的应用程序将需要获得批准。此外,在我对开发应用程序的测试中,我相信如果没有用户或页面访问令牌,您的应用程序需要得到专门的批准。 (当开发应用无法执行操作时,很难提交应用评论)
    【解决方案2】:

    您可以使用 AppID 和密钥来获取任何页面的公共帖子/提要。这样您就不需要获取访问令牌。像下面这样称呼它。

    https://graph.facebook.com/PAGE-ID/feed?access_token=APP-ID|APP-SECRET
    

    并获得帖子。

    https://graph.facebook.com/PAGE-ID/posts?access_token=APP-ID|APP-SECRET
    

    【讨论】:

    • 此解决方案是否有过期时间?
    • 还没有到期时间,它工作正常。但不要相信 Facebook API 会不断改变主意 :)
    • 对于看到此答案的其他任何人,这种类型的访问令牌称为 App Access Token,并且他们确实在其文档中声明了 AppId 和 AppSecret 的组合作为访问令牌。
    • 看来 facebook 现在已经锁定了 :( 获取页面事件现在需要页面访问令牌
    • 不仅仅是事件——看起来获取提要数据根本需要页面或用户访问令牌。
    【解决方案3】:

    您可以通过简单地请求浏览器请求的站点然后从 HTML 中提取帖子来获取帖子。

    在 NodeJS 中你可以这样做:

    // npm i request cheerio request-promise-native
    const rp = require('request-promise-native'); // requires installation of `request`
    const cheerio = require('cheerio');
    
    function GetFbPosts(pageUrl) {
        const requestOptions = {
            url: pageUrl,
            headers: {
                'User-Agent': 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0'
            }
        };
        return rp.get(requestOptions).then( postsHtml => {
            const $ = cheerio.load(postsHtml);
            const timeLinePostEls = $('.userContent').map((i,el)=>$(el)).get();
            const posts = timeLinePostEls.map(post=>{
                return {
                    message: post.html(),
                    created_at: post.parents('.userContentWrapper').find('.timestampContent').html()
                }
            });
            return posts;
        });
    }
    GetFbPosts('https://www.facebook.com/pg/officialstackoverflow/posts/').then(posts=>{
        // Log all posts
        for (const post of posts) {
            console.log(post.created_at, post.message);
        }
    });
    

    有关如何检索超过 20 个帖子的更多信息和示例,请参阅:https://stackoverflow.com/a/54267937/2879085

    【讨论】:

      【解决方案4】:

      不再可能使用没有访问令牌的 Facebook Graph API 来读取公共页面状态,这在 Facebook API 权限中称为 页面公共内容访问。访问令牌甚至是不够的。您必须将 appsecret_proof 与访问令牌一起使用,以验证您是合法用户。 https://developers.facebook.com/blog/post/v2/2018/12/10/verification-for-individual-developers/。 如果您是个人开发者,您可以访问三页数据(有限),除非您拥有商业应用程序。

      【讨论】:

        【解决方案5】:

        我有几个星期的类似用例,我使用了这个 API:

        https://rapidapi.com/axesso/api/axesso-facebook-data-service/

        我可以在几分钟内获取所有帖子和 cmets,对我来说效果很好。

        【讨论】:

          猜你喜欢
          • 2016-10-25
          • 2021-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多