Facebook Graph API调用不再起作用(因为Facebook Cookies)

3

我一直在使用Facebook Graph API从公共“页面”中提取照片集并显示照片,但今天它停止工作了(不仅是我的PC,其他人也证实了这一点)。

我一直在没有任何SDK和令牌的情况下使用Graph API,并构建graph.facebook.com链接并使用返回的json。

起初我认为问题只发生在Chrome上,但现在我不那么确定了。我已经确认欺骗用户代理没有影响,并且我最近发现删除Facebook.com的cookie可以解决问题

现在,我无法强制删除其他人的cookie,因此我希望有另一个解决方案,或者至少有一个解释。

图形调用看起来像https://graph.facebook.com/{{albumID}}

这里有一个例子:https://graph.facebook.com/203416696378870

收到的错误信息

"error": {
   "message": "An access token is required to request this resource.",
   "type": "OAuthException",
   "code": 104
}

在没有facebook.com cookies的情况下,我得到了预期的输出结果。

"id": "203416696378870",
"from": {
   "id": "186646504722556",
   "category": "Musician/band",
   ...

在删除之前的Facebook Cookies

facebook.com cookies

我仍然不明白为什么Facebook cookies会突然破坏我的代码。

我找不到任何记录在Facebook平台更新或Chrome发布中可能解释这种行为的变化。

当然,我不能强制从使用我的代码的所有站点的用户中删除cookie,并且我对它看起来有多么脆弱感到不满。

是否有人对这个问题有额外的了解,以及facebook.com cookies具体如何干扰图形API调用?

有没有任何方法可以防止这种情况发生?


我和你一样,在使用Chrome浏览器获取Facebook cookies时遇到了同样的问题。但在Firefox浏览器中却没有这个问题。因此,看起来是与Chrome的更新有关。 - A. Wolff
我不知道,我一直很难确定它。我日常使用Chrome,所以我的其他浏览器没有Facebook会话cookie或任何东西(至少在之前没有更改),所以我无法做任何事情来重现它。我知道仍然有人无法正常工作,因为他们没有删除他们的cookies。但是是的-到目前为止,我只收到了Chrome用户的报告。 - Zach Lysobey
我已经在Safari和IE9上进行了测试,Safari可以正常工作,但IE返回一个HTTP 400错误。 - A. Wolff
@roasted - 真的吗?在我的IE9上运行良好。你看到了400错误吗?使用此链接:https://graph.facebook.com/203416696378870? - Zach Lysobey
事实上,IE9 询问我是否要下载 JSON 文件。看起来有错误的请求,请求一个 HTML 文档页面,而 Facebook 请求则响应一个 JSON 页面。 - A. Wolff
正常情况下(我认为)IE9会提示下载。响应JSON格式的,浏览器决定如何显示。当然,在使用中,我会用我的代码调用和解析这个JSON。 - Zach Lysobey
4个回答

2

很奇怪,Facebook正在请求访问令牌,但是如果您仅需要相册中的图片,则可以尝试以下方法:

https://graph.facebook.com/YOUR_ALBUM_ID/photos?fields=picture&limit=500

为了使其正常工作,必须使用fields=picture语句。

您可能会发现这很有用。

if (empty($_GET['album'])) {

    //get all albums of page
    $graph_url = "https://graph.facebook.com/PressPlayPrague/albums?fields=id,link,name,cover_photo&limit=500";
     $albums = json_decode(file_get_contents($graph_url));
    $counted = sizeof ($albums->data); // get the number of albums for later use

    //output all albums of given page
    for($c=0; $c<$counted; $c++){
    echo ("<div class='wrapper' <a href='?album=".$albums->data[$c]->id."'><div class='stack'><div style='width:180px; height:120px; display:inline-block; background-image:url(https://graph.facebook.com/".$albums->data[$c]->id."/picture?width=300&height=200); background-repeat:no-repeat;'>  </div></div><div class='caption'>".$albums->data[$c]->name."</div></a></div>");
    };

}else{

    //get the album pictures replace the $_GET[album] with specific ID and remove the     if clause to get only one album
    $pic_url = "https://graph.facebook.com/".$_GET[album]."/photos?fields=picture&limit=500";
    $pictures = json_decode(file_get_contents($pic_url));
    $countpic= sizeof ($pictures->data); // get the number of pics for later use
    for($p=0; $p<$countpic; $p++){
    echo ("<img style='width:250px; max-height:167px;'src='https://graph.facebook.com/".$pictures->data[$p]->id."/picture' alt='".$pictures->data[$p]->id."'>");

    };
}
?>

你有关于“the fields=picture语句在正常工作中是必需的”这一说法的参考资料吗?我在很长一段时间里都没有使用它... - Zach Lysobey
目前我没有使用 ?fields= 参数,也没有遇到访问令牌错误。在过去的一年里,它没有问题,并且在删除 Facebook cookie 后再次正常工作。我并不完全相信您建议的代码可以避免出现在我的代码中的任何问题。对于 ?fields= 的了解可能非常有限和错误,但我的理解是,它允许您在查询时更加具体,因此返回的JSON数据不会太臃肿。这 可能 解决了我的问题,但如果我能获得一些关于为什么首先出现问题的解释,我会感觉更好。 - Zach Lysobey
抱歉,我觉得我解释得不太好。显然,我只需要删除一次 cookie。自那以后,我已经登录了 FB,使用了其他 FB 应用程序等等,它仍然可以正常工作(登录和退出)。我个人见过这个错误在三台不同的机器上发生。我删除了 facebook.com 的 cookies,错误就不会再出现了。一旦我删除了 cookies,无论我做什么,似乎都无法在该机器上重现。我想我会改变我的代码来使用你的方法,因为它可能可以防止错误-尽管我还没有确认它是否更加一致(但你有吗?) - Zach Lysobey
哦,奇怪。我刚刚使用了匿名窗口技巧(为什么我没想到呢),错误又出现了。这让我相信你是正确的;尽管导致我的错误(以及缺乏它的机制)仍然让我困惑。 - Zach Lysobey
1
在Facebook文档中有一段话,说你需要一个通用访问令牌,它可能以某种方式存在于Cookie中,并且与长时期有效的令牌相同。然而,由于我们每天都在使用Facebook,几乎不可能过期(如果它确实存在)。真是怪怪的...我几个月前开发了这个机制,现在仍然有效。;) 但这可能只是一个权宜之计或者一个漏洞... - David Reinberger
显示剩余3条评论

1
我不知道你是如何尝试检索数据的,但如果我使用getJSON,它对我有效:
<a id="facebook-graph-link">TEST FACEBOOK</a>
<script>
 $(function(){
    $( "#facebook-graph-link" ).on( "click", function(e) {
        e.preventDefault();
        var url = "http://graph.facebook.com/203416696378870";
        $.getJSON( url, function( data ) {
            console.log(data);
        });
    });
 });
 </script>

我正在使用$.ajax,这本质上是你所做的事情的长手写法;但除非你能证明在直接从地址栏访问http://graph.facebook.com/203416696378870时返回`OAuthException`错误的情况下,此代码可以正常工作(在你的Chrome上)。 - Zach Lysobey
你是否在使用$.ajax时设置了json数据类型?只是问一下以防万一... 你的用户是否必须直接在地址栏中输入Facebook链接?很抱歉问这些问题,但我对你的意图感到很困惑。 - A. Wolff
实际上问题应该是:你的$ajax请求是否正常工作? - A. Wolff
是的。它在所有地方(一年多)都运行良好,直到一两天前停止在我的Chrome(和其他几个人的Chrome)浏览器上工作。在这些浏览器中删除Facebook.com的Cookie后,它再次在所有地方正常工作。 - Zach Lysobey
或许我还应该注意一下,除了使用JavaScript和$.ajax这样的方式来访问图形API之外,我还有一个应用程序,我使用curl在PHP中访问它。这也可以像上面所述的那样工作,有相同的例外情况。 - Zach Lysobey

0

我删除了所有的Cookies,之后就无法调用图形链接了。

接下来我进入Facebook网站,切换到我的页面账户,重新加载图形链接,然后它就可以工作了。

但是从我的Web服务器调用脚本根本不起作用。

IE10、FF20、最新版的Chrome,都是同样的结果。


嗨Yvonne,感谢您分享您的经验。听起来这对我要么是新信息,要么是您的问题类似但不相关?在Chrome中,当您单击此链接https://graph.facebook.com/203416696378870时,是否会出现Oauth错误? - Zach Lysobey
也许删除了cookies确实起作用了,但这可能是一个缓存问题。在你还没有删除cookies的浏览器上,在删除cookies之前和之后尝试清除缓存,然后反馈结果如何? - Zach Lysobey

0

更改IP地址最终解决了所有问题,不知道是否需要删除cookie,但在IP地址更改后直接运行,所有浏览器都可以正常工作。在一个浏览器中,我从未删除过cookie,在页面重新加载后也可以正常工作。

顺便说一句,直接调用图形链接仍然会导致有趣的事情发生,IE显示页面未找到,Safari oath,Firefox显示数据,所有现有网站包括专辑都很好,我希望使用同一专辑用于直接图形链接。


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