【问题标题】:XMLHttpRequest access facebook developers and graphXMLHttpRequest 访问 facebook 开发者和图
【发布时间】:2012-02-17 07:59:50
【问题描述】:

我在访问 Facebook 图表时遇到问题。我正在使用 Greasemonkey 脚本。当我在 chrome 的 Tampermonkey 中使用相同的脚本时,它运行良好,并且我可以获取数据。

在 Firefox 中没有任何反应,我想可能是因为跨域限制。我是对的,有没有办法解决这个问题?

忘了提一下,只有在我使用 graph.facebook.com 时,Firefox 才有效。

编辑:

var my_id = 1111111111;
var req = new XMLHttpRequest();
req.open('GET', 'https://graph.facebook.com/'+my_id, false); 
req.send();
var contents = req.responseText;
alert(contents);

【问题讨论】:

    标签: javascript facebook firefox xmlhttprequest greasemonkey


    【解决方案1】:

    根据观察 Facebook Graph 确实允许 CORS 因为当我尝试 GET-ing 时,我返回了状态 200 并且标题有 Access-Control-Allow-Origin:* *

    使用 Firebug:

    请求:

    xhr=new XMLHttpRequest();
    xhr.open('get','https://graph.facebook.com/id',true);
    xhr.send();
    

    标题:

    Response Headers
    Access-Control-Allow-Origin *
    Cache-Control   private, no-cache, no-store, must-revalidate
    Connection  keep-alive
    Content-Length  181
    Content-Type    text/javascript; charset=UTF-8
    Date    Tue, 19 Jun 2012 22:41:46 GMT
    Etag    "some random string"
    Expires Sat, 01 Jan 2000 00:00:00 GMT
    Pragma  no-cache
    X-FB-Debug  some random string
    X-FB-Rev    some random number
    
    Request Headers
    Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Accept-Encoding gzip, deflate
    Accept-Language en-us,en;q=0.5
    Connection  keep-alive
    DNT 1
    Host    graph.facebook.com
    Origin  http://localhost:8080
    Referer http://localhost:8080/login
    User-Agent  Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
    

    【讨论】:

      【解决方案2】:

      XMLHttpRequest 不支持跨域请求。 (你说这在 Tampermonkey 中有效??!? Tampermonkey 支持 GM_xmlhttpRequest(),所以它可能将跨域 XHR 扩展到 XMLHttpRequest()也许。) p>

      不过,要让它在 Greasemonkey(以及 Chrome 用户脚本和 Tampermonkey)中工作,您需要使用 GM_xmlhttpRequest()——它允许跨域请求。

      所以问题中的代码将变为:

      var my_id = 1111111111;
      
      GM_xmlhttpRequest ( {
          method:         'GET',
          url:            'https://graph.facebook.com/' + my_id,
          onload:         function (responseDetails) {
                              var contents = responseDetails.responseText;
                              alert (contents);
                          }
      } );
      


      请注意,GM_xmlhttpRequest() 是异步操作的。 (它有一个有点冒险的同步模式,但不推荐这样做。)

      【讨论】:

      • 是的,它在 Tampermonkey 中工作(来自问题的示例),正如我所说,这让我感到困惑!
      • 另一个“快速”问题:如何在函数外使用变量内容?我试图在 var my_id 下定义它,但它不起作用。
      • 简短的回答是你现在不能在函数外部可靠地使用变量contentsGM_xmlhttpRequest() 有一个 synchronous 模式,但目前它似乎有问题。 ...无论如何,习惯于异步思考和编程。这是更好的做法,您的脚本会更快、响应更快。
      • 那么,有没有办法在函数之外使用呢?抱歉打扰,我是 javascript 的初学者..
      • 目前版本的 Greasemonkey 没有好办法。反正你不需要。请注意,您可以从 onload 函数内部调用其他函数。
      【解决方案3】:

      如果您使用 XMLHttpRequest 发布信息,那么这很可能是由同源策略(MDNWikipedia)引起的。

      如果您所在的页面与您发送信息的位置的 1) 协议 (http) 2) 域和 3) 端口不匹配,那么 Firefox 和其他人可能会阻止该请求。 (这就是为什么它只在您使用 graph.facebook.com 时才有效。)

      由于 Facebook 不太可能代表您支持 cross origin resource sharing,因此您可能不太走运。

      Cookie 和其他“环境身份验证”与 POST 请求一起发送,因此浏览器强制执行此类策略的一个原因是防止书签或 Greasemonkey 脚本能够将您的 cookie 发送到提供它们的域后面的服务器给你。

      【讨论】:

      • 看起来您使用的是 GET 而不是 POST,它有不同的规则并且不受相同 SOP 政策的约束。
      • 我正在使用 GET,与我在问题中编写的示例相同。该代码在 Chrome 中有效,但在 Firefox 中无效……这让我感到困惑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多