使用无访问令牌的Facebook Graph API获取公共页面状态

使用无访问令牌的Facebook Graph API获取公共页面状态,facebook,facebook-graph-api,authentication,permissions,Facebook,Facebook Graph Api,Authentication,Permissions,比如说,我正在尝试使用Facebook Graph API从公共页面获取最新状态 根据-我需要一个访问令牌。因为微软的页面是“公共”的,这是肯定的吗?如果没有访问令牌,我是否无法访问这些公共状态 如果是这种情况,如何为我的网站创建访问令牌的正确方法?我有一个应用程序ID,但是所有的例子都描述了如何处理用户登录。我只想在Microsoft页面上获取最新状态更新,并将其显示在我的网站上。这是出于设计。一旦可以在没有访问令牌的情况下从公共页面获取最新状态。这是为了阻止匿名访问API而更改的。您可以使用

比如说,我正在尝试使用Facebook Graph API从公共页面获取最新状态

根据-我需要一个访问令牌。因为微软的页面是“公共”的,这是肯定的吗?如果没有访问令牌,我是否无法访问这些公共状态


如果是这种情况,如何为我的网站创建访问令牌的正确方法?我有一个应用程序ID,但是所有的例子都描述了如何处理用户登录。我只想在Microsoft页面上获取最新状态更新,并将其显示在我的网站上。

这是出于设计。一旦可以在没有访问令牌的情况下从公共页面获取最新状态。这是为了阻止匿名访问API而更改的。您可以使用graph API通过以下调用获取应用程序的访问令牌(如果您没有为您的网站设置Facebook应用程序-您应该创建它):

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&
grant_type=client_credentials  
这称为应用程序访问令牌。然后使用上面的appaccess令牌继续实际的API调用


希望这有帮助

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

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

您只需请求浏览器将请求的站点,然后从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篇以上帖子的更多信息和示例,请参见:

在没有访问令牌的情况下,不可能使用Facebook Graph API来读取公共页面状态,这在Facebook API权限中称为页面公共内容访问。访问令牌甚至是不够的。为了验证您是否是合法用户,您必须使用appsecret_proof和访问令牌。
若你们是个人开发者,你们可以访问三页数据(有限),除非你们拥有一个商业应用程序

在我获取应用程序令牌并将其传递给“I get the error”后,需要一个用户访问令牌来请求此资源。Yikes!小心-不要将你的应用程序秘密发布到任何公开的地方。这是个秘密!如果代码保持在服务器端,那么这段代码就可以了。那么生成的访问令牌是否永远有效?我必须为每个客户都这样做吗?如果你只是想免费赠送,为什么需要代币呢?跳圈运动p出于安全原因,不应在客户端使用秘密令牌,请参见,对于以前访问过此数据的应用程序,此操作似乎将继续有效,但新的应用程序将需要获得批准。此外,在我使用开发应用程序进行的测试中,我相信,如果没有用户或页面访问令牌,您的应用程序需要经过专门批准。(当开发应用程序无法执行操作时,很难提交应用程序审查)此解决方案是否有过期时间?还没有过期时间,并且工作正常。但是不要相信Facebook API会不断改变他们的想法:)对于其他看到这个答案的人来说,这种类型的访问令牌称为an,他们在文档中确实声明了访问令牌的AppId和AppSecret的组合。Facebook现在似乎已经锁定了这一点:(获取页面的事件现在需要一个页面访问令牌,而不仅仅是事件——看起来获取提要数据需要一个页面或用户访问令牌。