You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twitter API v2使用TwitterOAuth上传图片失败求助

问题排查与修复方案

核心问题:你混用了Twitter API v1.1的媒体上传逻辑和API v2的推文发布端点,两者不兼容导致媒体上传失败,返回非对象结果,进而出现media_id_string为null的报错。

修复后的完整代码

require "vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

// 初始化API连接(替换为你的真实密钥)
$connection = new TwitterOAuth(
    'p8kebRtLTYZo4Lyc8p17lcUGZ',
    'KUmxOxfgfISQPxM64kqA9YTEibC28s2tNjcqBNu5YpY1wTuJNU',
    '1236013086688989184-c5gHPKryY5zJTJp03ILU1N31atayJp',
    'yvunJthcPlBRXnUaBwfbIpyv6q5i7jJX3TzxjLK6Mq5On'
);
$connection->setApiVersion('2');

// 1. 读取图片文件并转为base64编码
$imagePath = 'C:\xampp\htdocs\twitter_oauth\S3169002871756923800.jpg';
$mediaData = base64_encode(file_get_contents($imagePath));

// 2. 调用API v2的媒体上传端点
$uploadResponse = $connection->post('media/upload', [
    'media_data' => $mediaData,
    'media_category' => 'tweet_image' // 图片类媒体必须指定此参数
]);

// 检查上传是否失败
if (isset($uploadResponse->errors)) {
    print_r($uploadResponse->errors);
    exit;
}

$mediaId = $uploadResponse->media_id_string;

// 3. 等待媒体处理完成(API v2上传后需等待处理完成才能关联推文)
do {
    $mediaStatus = $connection->get("media/{$mediaId}", [
        'fields' => 'processing_info'
    ]);
    if (isset($mediaStatus->processing_info->state) && $mediaStatus->processing_info->state === 'succeeded') {
        break;
    }
    sleep(1); // 间隔1秒重试
} while (true);

// 4. 发布带图片的推文
$data = [
    'text' => 'Hello world',
    'media' => ['media_ids' => [$mediaId]]
];

$content = $connection->post("tweets", $data, true);

echo "<pre>";
print_r($content);
exit;

额外排查要点

  • 文件路径与权限:确认图片文件存在,且PHP进程有读取该文件的权限。
  • API权限:你的开发者账号需开启Read and write权限,且应用已启用Twitter API v2的媒体上传功能。
  • 文件大小限制:Twitter单张图片最大支持5MB,超过此大小会上传失败。

内容的提问来源于stack exchange,提问作者Mir Mosraki Shon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:01:31