Twitter API 1.1发布推文时图片未在信息流显示问题求助
问题结论
首先可以明确:Twitter API v1.1的statuses/update、media/upload.json接口并未完全废弃,你遇到的图片不显示问题不是v2版本上线直接导致的,核心原因是接口返回的推文实体没有识别到你传递的media_ids参数,从你贴出的响应内容可以看到,推文entities字段仅包含hashtags、symbols、user_mentions、urls四个子项,没有media相关字段,说明媒体ID根本没有和推文成功绑定。
排查思路
- 先排查参数传递逻辑:打印你调用
statuses/update时实际传递的完整参数数组,确认当存在媒体ID时,media_ids字段确实存在、值为正确的逗号分隔字符串,没有被其他参数覆盖或者被框架过滤掉 - 检查开发者账号权限层级:2023年Twitter调整了API收费策略后,免费层级的开发者账号已经不支持通过v1.1的
statuses/update接口绑定媒体资源,接口会直接忽略请求中的media_ids参数,且不会返回任何错误,这是目前这类问题最常见的诱因 - 确认媒体上传后的有效性:可以调用
GET media/upload接口传入你获取到的media_id_string,确认媒体资源没有被平台判定为违规、没有过期 - 可选迁移方案:如果是权限限制导致的问题,可以直接迁移到v2版本的发推接口,媒体上传仍然可以使用原有v1.1的
media/upload.json接口,发推时调用https://api.twitter.com/2/tweets,在请求体中传入media.media_ids数组即可,该逻辑对免费层级账号开放
代码优化参考
你可以在原逻辑基础上调整发推部分的请求即可适配v2接口:
public function send($message, $media = null, $options = []) { $mediaIds = []; foreach ((array) $media as $item) { $res = $this->request( 'https://upload.twitter.com/1.1/media/upload.json', 'POST', null, ['media' => $item] ); $mediaIds[] = $res->media_id_string; } // 调整为v2发推接口 $postData = $options + ['text' => $message]; if (!empty($mediaIds)) { $postData['media'] = [ 'media_ids' => $mediaIds ]; } return $this->request( 'https://api.twitter.com/2/tweets', 'POST', null, json_encode($postData), // v2接口要求传JSON格式请求体 ['Content-Type: application/json'] ); }
内容的提问来源于stack exchange,提问作者Glen
相关产品推荐
相关产品推荐

