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

Tweepy Twitter机器人求助:403错误与媒体上传问题

解决方案:Tweepy批量推文(含媒体)避免403错误

一、批量发布文本推文

403错误核心原因是触发了Twitter免费API的速率限制(每15分钟最多15条推文)或请求频率过高。以下是修正后的代码:

import tweepy
import time

# 填入你的密钥信息
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
bearer_token = "YOUR_BEARER_TOKEN"
access_token = "YOUR_ACCESS_TOKEN"
access_token_secret = "YOUR_ACCESS_TOKEN_SECRET"

# 初始化认证,开启自动速率限制等待
client = tweepy.Client(
    bearer_token, api_key, api_secret, access_token, access_token_secret,
    wait_on_rate_limit=True  # 关键:自动等待速率限制重置
)

# 待发布的文本列表
tweet_texts = [
    "第一条测试推文",
    "第二条测试推文",
    "第三条测试推文"
]

for text in tweet_texts:
    try:
        response = client.create_tweet(text=text)
        print(f"成功发布推文:{response.data['id']}")
        # 额外短延迟避免触发反垃圾机制(可选,按需调整)
        time.sleep(2)
    except tweepy.TweepyException as e:
        print(f"发布失败:{e}")

关键说明:

  • wait_on_rate_limit=True:让Tweepy自动检测速率限制,达到上限时自动等待至限制重置,无需手动计算延迟。
  • 循环内复用同一个client实例,不要重复创建认证对象。
  • 额外的time.sleep(2)用于避免短时间连续请求触发反垃圾机制,可根据实际情况调整时长。

二、发布带媒体的推文

免费层级无法直接使用Twitter API v2的媒体上传端点,必须通过v1.1 API上传媒体,再结合v2 API发布推文。完整代码如下:

import tweepy
import time

# 填入你的密钥信息
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
bearer_token = "YOUR_BEARER_TOKEN"
access_token = "YOUR_ACCESS_TOKEN"
access_token_secret = "YOUR_ACCESS_TOKEN_SECRET"

# 初始化v2 Client(发推文)和v1.1 API(上传媒体)
client = tweepy.Client(
    bearer_token, api_key, api_secret, access_token, access_token_secret,
    wait_on_rate_limit=True
)
auth = tweepy.OAuth1UserHandler(api_key, api_secret, access_token, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit=True)

# 单条带媒体推文发布函数
def post_tweet_with_media(text, media_path):
    try:
        # 用v1.1 API上传媒体
        media = api.media_upload(filename=media_path)
        # 用v2 Client发布带媒体的推文
        response = client.create_tweet(text=text, media_ids=[media.media_id_string])
        print(f"成功发布带媒体推文:{response.data['id']}")
        return response
    except tweepy.TweepyException as e:
        print(f"发布失败:{e}")
        return None

# 批量带媒体推文示例
tweet_media_pairs = [
    ("带第一条图片的推文", "image1.jpg"),
    ("带第二条图片的推文", "image2.png")
]

for text, media_path in tweet_media_pairs:
    post_tweet_with_media(text, media_path)
    time.sleep(5)  # 媒体上传速率限制更严格,适当延长延迟

关键说明:

  • 免费层级媒体限制:单张图片最大5MB,支持JPG、PNG、静态GIF格式;每15分钟最多上传30个媒体文件。
  • 必须通过v1.1的api.media_upload()上传媒体,将返回的media_id_string传入v2的create_tweet接口。
  • 开启wait_on_rate_limit=True,同时处理媒体上传和推文发布的双重速率限制。

常见403错误排查点

  • 确认所有密钥/令牌正确,且权限为Read and write(必须开启写权限才能发布推文)。
  • 检查推文内容是否违反Twitter社区规则(如垃圾信息、重复内容)。
  • 免费层级无法使用部分高级功能,确保只调用免费权限范围内的API端点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:34:56