将媒体上传到 twitter API

Posted

技术标签:

【中文标题】将媒体上传到 twitter API【英文标题】:uploading media to the twitter API 【发布时间】:2015-03-06 14:02:50 【问题描述】:

我正在尝试通过 API 将媒体上传到 Twitter,但我不断收到“错误请求”错误

HTTP request failed! HTTP/1.1 400 Bad Request

这是我的电话

$image = 'http://4.bp.blogspot.com/-JOqxgp-ZWe0/U3BtyEQlEiI/AAAAAAAAOfg/Doq6Q2MwIKA/s1600/google-logo-874x288.png';

$media_ids = $twitterService->request('https://upload.twitter.com/1.1/media/upload.json', 'POST', array(
    'media' => $image
));

我正在使用 oauth 进行身份验证,并且任何其他类型的请求似乎都有效,例如获取用户时间表。

我也在使用库 - https://github.com/Lusitanian/phpoAuthLib - 它为我附加了诸如 oauth 令牌之类的东西。有什么想法吗?

编辑:

我也尝试使用 base64 图像发出相同的请求,如下所示:

$path = '../uploads/0PQ4j0yfMl1420641234.jpg';
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);

$media_ids = $twitterService->request('https://upload.twitter.com/1.1/media/upload.json', 'POST',     array(
        'media_data' => $base64
    ));

并通过抓取原始图像

$image = file_get_contents($path);

$media_ids = $twitterService->request('https://upload.twitter.com/1.1/media/upload.json', 'POST', array(
        'media' => $image
    ));

【问题讨论】:

嘿@wazzaday,你成功了吗?我正在使用相同的库,并且在尝试发布图像时出现授权错误。如果只是状态文本,一切正常。 不幸的是,不支持上传方法,因为 cURL 请求是如何在幕后发生的。我不得不使用一个单独的库,它工作得非常好 - github.com/abraham/twitteroauth - 按照文档提供了一个上传媒体的工作示例。 酷,我试试,谢谢! 【参考方案1】:

正如the docs 所说 - 图片应该是图片的 base64 编码字节,而不是图片的 URL。

【讨论】:

不确定您在哪里阅读?我只看到 base64:传递的图像应该是图像的原始二进制文件或二进制 base64 编码,只要 Content-Type 设置适当(如有疑问:“application/octet-溪流”)。支持的图像格式为 PNG、JPG 和 GIF。现在支持动画 GIF。 首先,使用 POST multipart/form-data 或 base64 编码文件到upload.twitter.com/1.1/media/upload.json。 - dev.twitter.com/rest/public/uploading-media-multiple-photos - 请注意,如果您要上传 base64 编码,则此端点的参数名称将是 media_data 而不是用于原始图像的 media。 对,没有提到通过 URL 上传图片。您可以链接到推文文本中的图像,也可以通过 media/upload.json 对其进行编码和上传。 尝试使用 base64 图像会产生不同的错误 - HTTP 请求失败! HTTP/1.1 431 请求标头字段太大。我错过了一些明显的东西吗? - 图片本身很小 发送的底层 http 消息是什么?你能把它打印出来吗(至少是标题)。也许图像没有在请求正文中发送。我会在 php 之外的 github.com/twitter/twurl 中进行测试。【参考方案2】:

对于图片网址,您可以这样做

$image = 'http://4.bp.blogspot.com/-JOqxgp-ZWe0/U3BtyEQlEiI/AAAAAAAAOfg/Doq6Q2MwIKA/s1600/google-logo-874x288.png';

$file = '/tmp/file';
file_put_contents($file, file_get_contents($image));
$media = $connection->upload('media/upload', ['media' => $file]);

【讨论】:

以上是关于将媒体上传到 twitter API的主要内容,如果未能解决你的问题,请参考以下文章

使用npm twit将图像上传到Twitter时“媒体类型无法识别”

Twitter 错误 215 使用 Fabric Android SDK 和 Retrofit 上传媒体

sh 可恢复媒体的脚本上传到Twitter

Twitter API OAuth 文件上传出现错误“您必须提供可读文件”

Tweepy [ Twitter API v2 ] 无法上传照片/媒体 [重复]

CSP 拒绝 API Twitter