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

使用Twikit上传网络图片至Twitter时遇FileNotFoundError等问题求助

问题原因分析
  • FileNotFoundError:Twikit的媒体上传方法默认接收本地文件路径或文件对象,直接传入网络URL会被当作本地文件路径解析,导致找不到文件。
  • httpx.LocalProtocolError:直接传URL时,Twikit内部错误地将URL作为文件路径拼接进请求头,造成请求头格式非法;转base64时如果附带data:image/png;base64,这类前缀,会导致请求参数不符合Twitter API规范,触发协议错误。
解决方法

方法1:先下载网络图片到内存再上传

Twikit支持传入文件对象,先把网络图片下载到内存中的BytesIO对象,再传给上传方法,无需本地文件存储:

import requests
from io import BytesIO
from twikit import Client

# 初始化并登录客户端(需自行补充登录逻辑)
client = Client()
# client.login(...)

# 下载网络图片
image_url = "https://i.imgur.com/ZFMaW5h.png"
resp = requests.get(image_url)
resp.raise_for_status()

# 包装为文件对象(需设置文件名以识别类型)
image_file = BytesIO(resp.content)
image_file.name = "image.png"

# 上传媒体并发布推文
media_id = client.upload_media(image_file, media_type='image/png')
client.create_tweet(text="测试带图推文", media_ids=[media_id])

方法2:正确处理base64格式上传

若使用base64,必须去掉data:image/png;base64,前缀,解码为字节后包装成文件对象:

import base64
from io import BytesIO
from twikit import Client

client = Client()
# 登录步骤省略

# 处理带前缀的base64字符串
base64_data = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
pure_base64 = base64_data.split(',')[1]
image_bytes = base64.b64decode(pure_base64)

# 转为文件对象
image_file = BytesIO(image_bytes)
image_file.name = "image.png"

# 上传并发布
media_id = client.upload_media(image_file, media_type='image/png')
client.create_tweet(text="测试base64图片", media_ids=[media_id])

额外注意

  • 确保Twikit为最新版本,执行pip install --upgrade twikit更新,旧版本可能存在网络图片上传的兼容性问题。
  • 下载图片时需处理网络异常(如超时、404),避免后续流程出错。

内容的提问来源于stack exchange,提问作者ten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:22:41