使用Tweepy调用Twitter API v2获取完整推文时遇403权限错误
问题解决:Twitter API v2 403权限错误及完整推文获取方案
问题根源
你遇到的403错误核心原因:免费的Essential访问权限仅支持Twitter API v2端点,但你的代码用Tweepy的tweepy.API类调用了v1.1的search_tweets接口,这超出了权限范围,和密钥重置无关。
解决方案
改用Tweepy的Client类(对应API v2)实现搜索,并调整推文文本的获取逻辑,具体如下:
1. 替换API初始化方式
用Client替代API,v2认证需要Bearer Token(在开发者后台生成),同时可保留OAuth1.0a密钥用于用户上下文请求。
2. 调用v2合法搜索接口
使用Client.search_recent_tweets(Essential权限支持搜索最近7天推文),通过tweet.fields参数指定获取完整文本及所需字段。
3. 处理完整推文文本
API v2中,普通推文的完整文本在text字段;若为引用/回复推文,需通过referenced_tweets字段请求原推文获取完整内容。
修改后的完整代码
import tweepy from transformers import AutoTokenizer, AutoModelForSequenceClassification from scipy.special import softmax # 替换为你的开发者密钥 bearer_token = "你的Bearer Token" consumer_key = "xxx" consumer_secret = "xxx" access_token = "xx" access_token_secret = "xxx" # 初始化API v2客户端 client = tweepy.Client( bearer_token=bearer_token, consumer_key=consumer_key, consumer_secret=consumer_secret, access_token=access_token, access_token_secret=access_token_secret, wait_on_rate_limit=True ) # 搜索最近7天的热门英文原创推文 response = client.search_recent_tweets( query="React lang:en -is:retweet", tweet_fields=["text", "referenced_tweets"], max_results=25 ) # 整理推文列表,处理引用推文的完整文本 tweets_list = [] for tweet in response.data: # 检查是否为引用推文 if tweet.referenced_tweets: # 请求引用的原推文获取完整内容 ref_response = client.get_tweet(tweet.referenced_tweets[0].id, tweet_fields=["text"]) full_text = ref_response.data.text else: full_text = tweet.text tweets_list.append(full_text) # 情感分析逻辑保持不变 roberta = "cardiffnlp/twitter-roberta-base-sentiment" model = AutoModelForSequenceClassification.from_pretrained(roberta) tokenizer = AutoTokenizer.from_pretrained(roberta) labels = ['Negative', 'Neutral', 'Positive'] for tweet in tweets_list: tweet_words = [] for word in tweet.split(' '): if word.startswith('@') and len(word) > 1: word = '@user' elif word.startswith('http'): word = "http" tweet_words.append(word) tweet_proc = " ".join(tweet_words) encoded_tweet = tokenizer(tweet_proc, return_tensors='pt') output = model(**encoded_tweet) scores = output[0][0].detach().numpy() scores = softmax(scores) print(f"Tweet: {tweet}") for i in range(len(scores)): l = labels[i] s = scores[i] print(f"{l}: {s:.2f}") print("\n")
关键说明
- 权限限制:Essential权限仅支持搜索最近7天的推文,如需更早内容才需申请Elevated权限。
- Bearer Token获取:在Twitter开发者后台的「Projects & Apps」→ 对应项目 →「Keys and tokens」中生成。
- 调用次数限制:处理引用推文时的额外请求会消耗API额度,注意控制请求数量。
内容的提问来源于stack exchange,提问作者Krzysztof Romańczuk
相关产品推荐
相关产品推荐

