【问题标题】:Facebook Graph API Call no longer works (because of Facebook Cookies)Facebook Graph API 调用不再有效(因为 Facebook Cookies)
【发布时间】:2013-04-10 09:53:15
【问题描述】:

我一直在使用 facebook grap 从公共“页面”中提取相册并显示照片,但今天它停止工作(不仅在我的电脑上,它已被其他人验证)

我一直在没有令牌和任何 SDK 的情况下点击图形 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 cookie,我得到了预期的输出。

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

删除前的 Facebook Cookies

我还是不明白为什么 Facebook cookie 会突然破坏我的代码。

我在 Facebook 的平台更新或 Chrome 版本中找不到任何可以解释此行为的记录更改。

当然,我不能强行从所有使用我的代码的网站的用户那里删除 cookie,我对这显然使它变得多么脆弱感到不满。

有没有人对此问题有任何额外的见解,以及 facebook.com cookie 中具体是什么与图形 api 调用混淆了?

有没有办法防止这种情况发生?

【问题讨论】:

  • 我遇到了与您在 chrome 上获取 facebook cookie 相同的问题。使用 Firefox 不会发生这种情况。所以,似乎与 chrome 更新有关。
  • IDK,我很难确定它。我每天都使用 chrome,所以我的其他浏览器都没有 facebook 会话 cookie 或任何东西(至少在发生任何变化之前没有),所以我无法做任何事情来重现它。我确实知道有些人仍然无法正常工作,因为他们没有删除他们的 cookie。但是是的 - 到目前为止,我只有 Chrome 用户的报告。
  • 我在 safari 和 IE9 上也进行了测试,在 Safari 中工作,但 IE 返回 http 400 错误。
  • @roasted - 真的吗?对我来说在 IE9 中工作正常。看到400了吗?通过此链接:graph.facebook.com/203416696378870?
  • 事实上,IE9 询问我是否要下载 json 文件。看起来有一个错误的请求完成,要求一个文档 html 页面,facebook 请求响应一个 json 页面。

标签: javascript facebook-graph-api oauth cross-browser


【解决方案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,这基本上是您如何操作的简写;但这与问题无关,除非您可以证明此代码正常工作(在您的 chrome 上),同时直接从地址栏点击 graph.facebook.com/203416696378870 会返回 OAuthException 错误。
  • 使用 $.ajax,你是在设置数据类型 json 吗?只是问一下……您的用户是否必须将 facebook 链接直接放在地址栏中?很抱歉问这些问题,但我对你想要做什么感到很困惑。
  • 其实问题应该是:你的$ajax请求有效吗?
  • 是的。它在任何地方都有效(一年多),直到一两天前它停止在我的 chrome(和其他一些人的 chrome)浏览器上工作。在这些浏览器上从 facebook.com 删除 cookie 后,它再次在任何地方工作。
  • 也许我也应该注意,除了像这样使用 JavaScript 和 $.ajax 访问图形 api 之外,我还有一个应用程序,我使用 curl 使用 PHP 访问它。这也适用于与上述相同的例外情况..
【解决方案2】:

我删除了所有的 Cookie,之后我无法调用图表链接,

接下来我去 facebook 网站,切换到我的页面帐户,重新加载图表链接,它工作了

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

IE10、FF20、最新的chrome,结果都一样

【讨论】:

  • 嗨伊冯,感谢您分享您的经验。听起来这对我来说是新信息,或者您的问题可能相似但不相关?在 chrome 中,单击此链接时是否出现 Oauth 错误:graph.facebook.com/203416696378870
  • 另外,也许删除 cookie 确实有效,但这是一个缓存问题。在您尚未删除 cookie 的浏览器上,您可以尝试在删除 cookie 前后清除缓存并反馈吗?
【解决方案3】:

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

顺便说一句。直接调用图表链接仍然会导致有趣的事情,IE 说找不到页面,safari 誓言,Firefox 显示数据,所有网站包括专辑都很好,我想用于直接图表链接的同一张专辑

【讨论】:

    【解决方案4】:

    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."'>");
    
        };
    }
    ?>
    

    【讨论】:

    • 你有没有关于“fields=picture 声明是它正常工作所必需的”的参考?我已经用了很长时间了...
    • 打开一个新的匿名窗口并转到此:graph.facebook.com/203416696378870/photos?fields=picture 应该重新运行图片。但是,如果您不使用该语句,则需要访问令牌才能访问资源
    • 好吧,我目前没有使用?fields= 参数,也没有收到访问令牌错误。它在没有超过一年的情况下运行良好,现在在删除 Facebook cookie 后再次运行。我完全不相信您建议的代码会避免我出现的任何问题。我对?fields= 的理解(有限且可能是错误的)是,它允许您更具体地查询查询内容,因此返回的 JSON 不会臃肿。这可能可以解决我的问题,但如果我能解释一下它发生的原因,我会感觉好多了。
    • 奇怪的事情 - 你是说当你登录到 facebook 时(cookie 存在),你会得到错误,当你删除 cookie 时,你会得到预期的内容。但是,当我访问您的图表链接时 - 出现预期的数据,当我访问匿名窗口中的链接(没有 cookie,退出 Facebook)时,它给了我错误。不幸的是我不能告诉你为什么我的解决方案总是有效,因为我猜你正在尝试建立一个公共画廊,你应该使用它;)
    • 好吧,在 facebook 文档中有一个声明,您需要一个通用访问令牌,它可能以某种方式存在于 cookie 中,并且与长期令牌过期一样。但是,由于我们每天都在使用我们的 Facebook,因此几乎不可能将其过期(如果有的话)。 Juuuust wierd...几个月前我开发了这个机制,它仍然有效。 ;) 但这可能只是一种解决方法或错误......
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 2015-02-17
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2011-10-27
    • 2015-03-07
    相关资源
    最近更新 更多