Разница между запросом скручивания и Grease / TamperMonkey GM_xmlHttpRequest - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь ввести кнопки на веб-сайте клиента для легкой отправки URL-адресов моему экземпляру pyload. Я уже делал аналогичную вещь для создания пакетов в локальном экземпляре jDownloader, поэтому я не слишком далеко отсюда.

Мне уже удалось успешно поговорить с pyload API с помощью curl:

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

, который возвращает мне - как и должно быть - идентификатор сеанса, который мне нужен для продолжения использования API.

Однако, когда я пытаюсь сделать тот же самый вызов из Tampermonkey с GM_xmlhttpRequest, я всегда получаю успех с 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); }

});

Мой вопрос: что я делаю не так, где разница (для сервера / pyload) между использованием curl и использованием GM_xmlhttpRequest? Я думал, что это должно привести к тому же самому запросу?

И нет, к сожалению, я не вижу ничего в pyload-журналах. : - (

1 Ответ

1 голос
/ 07 января 2020

При использовании метода POST в GM.xmlHttpRequest / GM_xmlhttpRequest вам также необходимо установить заголовок Content-Type.

POST-запрос

При создании запроса POST большинство сайтов требуют, чтобы заголовок Content-Type был определен следующим образом:

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