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

Python使用Tweepy与requests发布带媒体推文报错如何修复

错误原因

你遇到的ValueError: stat: embedded null character in path报错,以及代码本身的逻辑问题一共有3处:

  • 执行顺序完全颠倒:你先调用了媒体上传接口,才把网络请求拿到的媒体内容写入本地文件,上传时本地根本不存在对应文件。
  • api.media_upload()参数传参错误:Tweepy的media_upload()方法要求传入本地文件路径的字符串,你直接传入了requests返回的Response响应对象,方法内部读取路径时识别到对象里的空字节,就抛出了路径含空字符的错误。
  • 打开文件时的文件名未加引号:open(media.jpg, 'wb')里的media.jpg没有用引号包裹,Python会把它识别为「media变量的jpg属性」,运行时会直接抛出NameError/AttributeError,根本不是合法的文件名字符串。
修复方法

按照「请求媒体资源 -> 写入本地临时文件 -> 调用上传接口 -> (可选)删除临时文件」的顺序调整代码即可,不需要给requests加stream=True参数,因为你需要获取完整的媒体二进制内容。

修复后的可运行代码示例:

import requests
import os

# 替换成你要上传的媒体文件直链
media_url = "你的媒体文件URL"
# 自定义本地临时保存的文件名,注意要加字符串引号
local_media_path = "temp_media.jpg"

# 1. 请求拿到媒体二进制内容
media_resp = requests.get(media_url)
media_resp.raise_for_status() # 提前捕获请求失败问题,比如404、500错误

# 2. 把媒体内容写入本地文件
with open(local_media_path, 'wb') as f:
    f.write(media_resp.content)

# 3. 调用Tweepy的上传接口,传入合法的本地路径字符串
media = api.media_upload(local_media_path)

# 4. 发推文时带上返回的media_id即可
# api.update_status(status="推文内容", media_ids=[media.media_id])

# 可选:上传完成后删除本地临时文件
os.remove(local_media_path)

如果你不想生成本地临时文件,也可以用Tweepy 1.12版本以上支持的media_upload的file参数,直接传入内存里的二进制流,不需要落盘:

import io
media_resp = requests.get(media_url)
media_file = io.BytesIO(media_resp.content)
# 必须指定文件名后缀,否则Tweepy无法识别媒体类型
media = api.media_upload(filename="temp.jpg", file=media_file)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:54:31