curl请求和Grease/TamperMonkeyGM_xmlHttpRequest的区别

Difference between curl request and Grease/TamperMonkey GM_xmlHttpRequest

我正在尝试在网站客户端中注入按钮,以便轻松地将 URL 发送到我的 pyload 实例。 我已经做了类似的事情来在本地 jDownloader 实例中创建包,所以我离这里不远。

我已经成功地使用 curl 与 pyload API 对话:

curl -s -d "username=myusername&password=mypassword" -X POST http://MYPYLOADINSTANCE:8000/api/login

哪个 returns 我 - 因为它应该 - 我需要继续使用 api.

的会话 ID

但是,当我尝试使用 GM_xmlhttpRequest 从 Tampermonkey 中进行相同的调用时,我总是通过 responseText 'false' 获得成功 - 这意味着身份验证不成功:

GM_xmlhttpRequest ( {
  context: { contextData: 'foo', contextData2: 'bar' }, // <- ignore that, only for testing
  method:  'POST',
  data: 'username=myusername&password=mypassword',
  synchronous: false,
  url:     'http://MYPYLOADINSTANCE:8000/api/login',
  onload:  function(responseDetails) { alert(responseDetails.responseText
          + '\n' + responseDetails.context.contextData); },
  onerror: function(responseDetails) { alert(responseDetails); },
  onabort: function(responseDetails) { alert(responseDetails); }

});

我的问题是: 我做错了什么,使用 curl 和使用 GM_xmlhttpRequest 之间的区别(对于服务器/pyload)在哪里?我认为它应该导致基本相同的查询?

不,遗憾的是我在 pyload 日志中没有看到任何内容。 :-(

GM.xmlHttpRequest/GM_xmlhttpRequest中使用POST方法时,还需要设置Content-Typeheader。

POST request

When making a POST request, most sites require the Content-Type header to be defined as such:

GM.xmlHttpRequest({
  method: "POST",
  url: "http://www.example.net/login",
  data: "username=johndoe&password=xyz123",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded"
  },
  onload: function(response) {
    if (response.responseText.indexOf("Logged in as") > -1) {
      location.href = "http://www.example.net/dashboard";
    }
  }
});