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
相关产品推荐
相关产品推荐

