
twikit 的 upload_media() 方法不支持直接传入 url,仅接受本地文件路径或二进制字节数据;本文详解如何安全下载远程图片并以字节形式上传,同时规避 http 头非法字符等常见错误。
twikit 的 upload_media() 方法不支持直接传入 url,仅接受本地文件路径或二进制字节数据;本文详解如何安全下载远程图片并以字节形式上传,同时规避 http 头非法字符等常见错误。
在使用 Twikit 构建 Twitter(X)自动化脚本时,一个高频踩坑点是调用 client.upload_media() 上传图片失败——尤其是当开发者试图直接传入网络图片 URL(如 https://i.imgur.com/ZFMaW5h.png)时,会立即触发 FileNotFoundError: No such file or directory。根本原因在于:Twikit 的 upload_media() 并非“下载并上传”,而是严格按文件系统语义读取本地路径或接收内存中的原始字节流。其函数签名明确要求 media_path: str | bytes,其中 str 必须是本地磁盘上的有效路径,而非 URL。
✅ 正确做法:下载 → 转字节 → 上传
你需要先通过 HTTP 客户端(如 httpx 或 requests)获取远程图片的二进制内容,再将该 bytes 对象直接传入 upload_media():
import httpx
from twikit import Client
client = Client('ja')
client.login(
auth_info_1='your_username',
auth_info_2='your_email',
password='your_password'
)
# 1. 下载远程图片为 bytes
image_url = 'https://i.imgur.com/ZFMaW5h.png'
response = httpx.get(image_url)
response.raise_for_status() # 确保请求成功
image_bytes = response.content
# 2. 直接上传字节数据(无需 base64 编码!)
media_id = client.upload_media(image_bytes, index=0)
# 3. 发送带图推文
TWEET_TEXT = 'テスト投稿2'
client.create_tweet(text=TWEET_TEXT, media_ids=[media_id])
⚠️ 注意事项:
- 不要对 bytes 做 base64 编码:upload_media() 期望原始图像二进制(如 PNG/JPG 文件头),base64 后的数据格式不被识别,会导致上传失败或媒体损坏。
- 避免 open(url, 'rb'):Python 的内置 open() 只能打开本地文件,无法解析 HTTP 协议,这是 FileNotFoundError 的直接来源。
- 务必检查响应状态:使用 response.raise_for_status() 防止静默失败(如 404、403)。
? 关于 LocalProtocolError 的额外说明
你遇到的 Illegal header value b'Mozilla/5.0...' 错误,通常源于 Twikit 内部 HTTP 客户端(httpx)向 Twitter 服务发送了含非法空格或不可见字符的 User-Agent 等请求头。这多见于:
- Twikit 版本过旧(已知 v1.7.x 存在 User-Agent 构造缺陷);
- 系统环境变量污染了 HTTP 头(如设置了异常 HTTP_PROXY 或自定义 USER_AGENT)。
✅ 解决方案:
- 升级 Twikit 至最新版:pip install --upgrade twikit
- 若仍报错,可临时禁用默认 UA(需修改 Twikit 源码或 fork 后定制),但更推荐优先升级 + 使用稳定网络环境。
✅ 最佳实践总结
| 场景 | 推荐方式 | 示例 |
|---|---|---|
| 本地图片 | 直接传路径字符串 | client.upload_media('./cat.jpg', 0) |
| 远程图片 | httpx.get(url).content → 传 bytes | 如上完整示例 |
| 多图上传 | 循环调用 upload_media(),index 从 0 开始递增 | ids = [client.upload_media(img1_b, 0), client.upload_media(img2_b, 1)] |
通过以上方法,你不仅能彻底解决 FileNotFoundError,还能构建健壮、可维护的媒体上传逻辑,为后续扩展(如批量发图、动态截图上传)打下坚实基础。










