使用状态机外的casperjs多部分表单上传二进制文件(不能使用填充)

时间:2016-07-29 22:03:49

标签: phantomjs casperjs telegram-bot

更新1:我在测试夹具中创建了一个带有实际运行代码的GIST,以准确显示我正在运行的内容。我已经包含了工作机器人令牌(到一个扔掉机器人)和访问机器人已经在的电报聊天,以防有人想快速浏览。这是

https://gist.github.com/pleasantone/59efe5f9d7f0bf1259afa0c1ae5a05fe

更新2:我已经查看了以下文章的答案(还有更多):

https://github.com/francois2metz/html5-formdata/blob/master/formdata.js

PhantomJS - Upload a file without submitting a form

https://groups.google.com/forum/#!topic/casperjs/CHq3ZndjV0k

How to instantiate a File object in JavaScript?

How to create a File object from binary data in JavaScript

我有一个用casperjs(phantomjs)编写的程序,它通过BOT API成功地向Telegram发送消息,但我正在试图弄清楚如何发送照片。

我可以将文件作为文件访问本地文件系统,或者我已经将其作为base64编码字符串(这是一个casper屏幕截图)。

我知道我的照片很好,因为我可以使用以下方式通过CURL发布:

curl -X POST "https://api.telegram.org/bot<token>/sendPhoto" -F chat_id=<id> -F photo=@/tmp/photo.png

我知道我从capserjs中连接到bot api的代码正在运行,因为我可以执行sendMessage,而不是sendPhoto。

function sendMultipartResponse(url, params) {
    var boundary = '-------------------' + Math.floor(Math.random() * Math.pow(10, 8));
    var content = [];

    for (var index in params) {
        content.push('--' + boundary + '\r\n');
        var mimeHeader = 'Content-Disposition: form-data; name="' + index + '";';
        if (params[index].filename)
            mimeHeader += ' filename="' + params[index].filename + '";';
        content.push(mimeHeader + '\r\n');
        if (params[index].type)
            content.push('Content-Type: ' + params[index].type + '\r\n');
        var data = params[index].content || params[index];
//        if (data.length !== undefined)
//            content.push('Content-Length: ' + data.length + '\r\n');
        content.push('' + '\r\n');
        content.push(data + '\r\n');
    };

    content.push('--' + boundary + '--' + '\r\n');
    utils.dump(content);

    var xhr = new XMLHttpRequest();
    xhr.open("POST", url, false);

    if (true) {
        /*
         * Heck, try making the whole thing a Blob to avoid string conversions
         */
        body = new Blob(content, {type: "multipart/form-data; boundary=" + boundary});
        utils.dump(body);
    } else {
        /*
         * this didn't work either, but both work perfectly for sendMessage
         */
        body = content.join('');
        xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
//        xhr.setRequestHeader("Content-Length", body.length);
    }

    xhr.send(body);
    casper.log(xhr.responseText, 'error');
};

同样,这是在CASPERJS环境中,而不是nodejs环境,所以我没有fs.createReadableStream或File()构造函数。

0 个答案:

没有答案