如何用Python实现定时从文件夹上传图片到Twitter?API权限报错求助
问题描述
我想写一个机器人代码,实现每小时从指定文件夹上传一张图片到Twitter。我对Twitter API和Python都不熟悉,一直在查资料学习。朋友的机器人服务被关停了,我想自己学Python来做这个。现在先测试发文本的功能,找了一段代码,但运行api.update_status时报错,不知道怎么解决。
我用的代码:
def set_up(): auth = tweepy.OAuthHandler(Keys.api_key, Keys.api_key_secret) auth.set_access_token(Keys.access_token, Keys.access_token_secret) api = tweepy.API(auth) print('AAAAAAA') #test if it goes through return api def run(tweet): api = set_up() api.update_status(tweet) #issue is here run('AAAAAA')
错误信息:
Traceback (most recent call last): File "C:\Users\email\PycharmProjects\pythonProject\main.py", line 26, in run('AAAAAA') File "C:\Users\email\PycharmProjects\pythonProject\main.py", line 24, in run api.update_status(tweet) File "C:\Users\email\PycharmProjects\pythonProject\venv\Lib\site-packages\tweepy\api.py", line 46, in wrapper return method(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\email\PycharmProjects\pythonProject\venv\Lib\site-packages\tweepy\api.py", line 1142, in update_status return self.request( ^^^^^^^^^^^^^ File "C:\Users\email\PycharmProjects\pythonProject\venv\Lib\site-packages\tweepy\api.py", line 265, in request raise Forbidden(resp) tweepy.errors.Forbidden: 403 Forbidden 453 - You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal.
解决方案
错误原因
api.update_status是Twitter API v1.1的接口,而你的开发者账号只有Essential访问权限,这种权限只能调用API v2的接口,所以调用v1.1接口会返回403禁止访问。
两种解决途径
途径1:改用Twitter API v2接口发推文
Tweepy支持API v2,直接用v2的方法替换v1.1的update_status,不需要升级权限。修改后的代码如下:
import tweepy def set_up_v2(): client = tweepy.Client( consumer_key=Keys.api_key, consumer_secret=Keys.api_key_secret, access_token=Keys.access_token, access_token_secret=Keys.access_token_secret ) return client def run_v2(tweet): client = set_up_v2() # 调用v2接口创建推文 response = client.create_tweet(text=tweet) print(f"推文发布成功,ID: {response.data['id']}") run_v2('AAAAAA')
途径2:申请Elevated访问权限
如果你坚持要用API v1.1的接口(比如后续上传图片可能需要v1.1的媒体接口),可以按以下步骤申请:
- 登录Twitter开发者平台,找到你的项目
- 在"Project Settings"里找到"Access level",申请升级到Elevated
- 申请通过后,就能正常调用
api.update_status这类v1.1接口了
后续图片上传的注意点
如果要实现上传图片的功能,用API v2的话,需要先通过v1.1的媒体接口上传图片获取媒体ID,再用v2的create_tweet附带媒体ID发布(因为v2暂时没有直接上传媒体的接口)。示例代码如下:
import tweepy def set_up(): # 同时初始化v1.1的API和v2的Client auth = tweepy.OAuthHandler(Keys.api_key, Keys.api_key_secret) auth.set_access_token(Keys.access_token, Keys.access_token_secret) api_v1 = tweepy.API(auth) client_v2 = tweepy.Client( consumer_key=Keys.api_key, consumer_secret=Keys.api_key_secret, access_token=Keys.access_token, access_token_secret=Keys.access_token_secret ) return api_v1, client_v2 def post_tweet_with_image(tweet_text, image_path): api_v1, client_v2 = set_up() # 用v1.1接口上传图片 media = api_v1.media_upload(filename=image_path) # 用v2接口发布带图片的推文 response = client_v2.create_tweet(text=tweet_text, media_ids=[media.media_id]) print(f"带图推文发布成功,ID: {response.data['id']}") # 调用示例 post_tweet_with_image("测试带图推文", "test.jpg")
注意:这段代码需要你的账号有Elevated权限,因为v1.1的media_upload接口需要Elevated访问。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

