使用GM_xmlhttpRequest在Chrome上发布数据?

vulvrdjw  于 2023-10-14  发布在  Go
关注(0)|答案(2)|浏览(92)

我写了一个用户脚本,从一个网页上的图像,并将其上传到服务器。该脚本在FF(Greasemonkey和Scriptish)中运行良好,但当我使用Chrome(使用Tampermonkey或Ninjakit)时,它不发送数据,而是发送字符串 * [object Object] *。
以下是我的脚本:

// ==UserScript==
// @id             myid
// @name           myname
// @version        1.0
// @namespace      ohadcn
// @author         Ohad Cohen
// @description    mydescription
// @include        https://*
// @grant          GM_xmlhttpRequest
// @require        https://code.jquery.com/jquery-2.0.3.min.js
// @run-at         document-end
// ==/UserScript==

function getBase64Image(img) {
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);
    var dataURL = canvas.toDataURL("image/png");
    return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}

img=$("img[alt=myImage]").get(0);

img.onload=function(){
    var img64=getBase64Image(img)
    var _data=new FormData();
    _data.append("image64",img64);

    GM_xmlhttpRequest({
    method: "POST",
    url: "http://myserver.org/mysscript.py",
    headers: {
    "Content-Type": "multipart/form-data"
    },
    data:_data,
    onload: function(response) {
             console.log ("gut response");
         $("#input").get()[0].value=response.responseText;
    }
    });
}

Tampermonkey和Ninjakit都会发送请求。在Tampermonkey中,我得到一个响应,在Ninjakit中我没有(onload永远不会被调用)。
但是他们不发送用base64编码的实际图像-当我读取数据时-服务器获得 [object Object] 作为POST主体(而不是数据主体,我无法让devtools网络面板显示GM_xmlhttpRequest发出的请求,所以我在服务器端检查了它)。

fumotvh3

fumotvh31#

这 * 可能 * 是因为FormDatamultipart/form-data在这些平台上没有得到很好的支持。以后再看吧()。
同时,尝试更典型的方法;使用application/x-www-form-urlencoded或JSON。
例如:

GM_xmlhttpRequest ( {
    method:     "POST",
    url:        "http://myserver.org/mysscript.py",
    data:       "image64=" + encodeURIComponent (img64),
    headers:    {
        "Content-Type": "application/x-www-form-urlencoded"
    },
    onload:     function (response) {
        console.log ("gut response");
        $("#input").get()[0].value=response.responseText;
    }
} );
juud5qan

juud5qan2#

至少在Tampermonkey中可以通过将fetch参数设置为true来实现。这样,当你传递一个FormData的示例作为data参数时,它就可以工作了。不确定其他userscript管理器是否支持使用fetch而不是XMLHttpRequest,但Greasemonkey支持data字段中的FormData

let fd = new FormData()
    fd.append('field_name', 'field_value')
    fd.append('file_upload', file) // an instance of File
    
    GM.xmlHttpRequest({
      method: "POST",
      url: "https://upload.api",
      onload: function(res) {
        // ...
      },
      onerror: function(e) {
        // ...
      },
      data: fd,
      fetch: true
    })

相关问题