所以我有一个网站,用户可以在其中上传图像文件(我一直在使用 113KB PNG 文件进行测试)。点击提交按钮后,图像数据会被编码为 Base64,然后以 POST 请求正文中的 JSON 形式发送到 Heroku 上托管的 Node.js 服务器。然后服务器获取图像数据并解析 JSON。然后,我使用 Node 模块 twitter
从 heroku 服务器向 media/upload
端点发送 POST。我尝试使用它来发布有效的常规状态,因此这不是身份验证问题。在 twitter
模块文档的示例中,他们这样做(原始二进制文件,而不是 base64):
var data = require('fs').readFileSync('image.jpg');
client.post('media/upload', {media: data}, function(error, media, response) { ... }
但是,按照我的方式,我实际上无法读取文件——我所得到的只是 JSON 字符串中的编码数据。无论如何,这就是我所得到的:
...
let data = JSON.parse(req.rawBody).imageb64;
//console.log(data);
client.post('media/upload', {media_data: data}, function(error, media, response) {
if (!error) {
console.log(media);
var status = {
status: 'api test',
media_ids: media.media_id_string
}
client.post('statuses/update', status, function(error, tweet, response) {
if (!error) {
console.log(tweet);
}
});
} else {
console.log(response)
}
});
我怀疑问题是因为我传入的是数据而不是 readFileSync
的结果。关于如何在不使用它的情况下做到这一点的任何想法?
最佳答案
the docs 的细则中有一个小注释。这可能有帮助:
When posting base64 encoded images, be sure to set the “Content-Transfer-Encoding: base64” on the image part of the message.
API 文档不是最好的。示例中有一个 media_type
但可以肯定的是:
-
twitter.js 中的
client.post
使用params
调用__request
-
__request
是否未设置标题
如果将 post
调用中的参数从 {media_data: data}
更改为 {media: data}
是否有效?如果没有,设置 header 的唯一方法似乎是打开 PR 或在初始化客户端时尝试将它们作为默认设置:Twitter(options)
。已经设置了一些 header here .
仅供引用 - 我已经为您打开了一个 GitHub 问题。加入对话! https://github.com/desmondmorris/node-twitter/issues/292
关于javascript - 推特 API : media/upload 400 Bad Request: media type unrecognized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50261958/