更新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()构造函数。