Twikit 图片上传失败:正确处理远程图片与本地文件路径的完整指南

雨萱同学_4063

雨萱同学_4063

2026-04-07

283人浏览

原创

Twikit 图片上传失败:正确处理远程图片与本地文件路径的完整指南

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,还能构建健壮、可维护的媒体上传逻辑,为后续扩展(如批量发图、动态截图上传)打下坚实基础。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1831

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4924

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29477

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3507

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3527

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2743

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习