Twitter API v2免费版GET /2/users/me端点认证问题及代码改造咨询
Twitter API v2 /users/me端点认证问题解决方法
问题描述
我尝试用以下代码调用Twitter API v2免费版的/users/me端点:
import requests import os # 从环境变量获取Bearer Token bearer_token = os.environ.get("BEARER_TOKEN") headers = { 'Authorization': f'Bearer {bearer_token}', } url = 'https://api.twitter.com/2/users/me' response = requests.get(url, headers=headers) # 打印JSON响应 print(response.json())
但收到403错误:
{'title': 'Unsupported Authentication', 'detail': 'Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint. Supported authentication types are [OAuth 1.0a User Context, OAuth 2.0 User Context].', 'type': 'https://api.twitter.com/2/problems/unsupported-authentication', 'status': 403}
我原本以为这个端点不需要用户上下文认证,但看起来确实需要。我已经写了Tweepy的OAuth1.0a认证代码,但不知道怎么和API调用结合:
consumer_key = os.environ["TWITTER_CONSUMER_KEY"] consumer_secret = os.environ["TWITTER_CONSUMER_KEY_SECRET"] access_token = os.environ["TWITTER_ACCESS_TOKEN"] access_token_secret = os.environ["TWITTER_ACCESS_TOKEN_SECRET"] # 使用密钥认证 auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) # 创建API实例 api = tweepy.API(auth)
问题原因
/users/me端点必须使用用户上下文认证(OAuth 1.0a User Context 或 OAuth 2.0 User Context),而你使用的OAuth 2.0应用级认证(Bearer Token)仅适用于无需用户权限的公共数据访问,无法获取当前用户的个人信息,因此被接口拒绝。
解决方案
方案1:用Tweepy直接调用API v2端点
Tweepy原生支持Twitter API v2,你可以基于已有的OAuth1.0a认证创建v2客户端,直接调用/users/me:
import tweepy import os # 从环境变量读取密钥 consumer_key = os.environ["TWITTER_CONSUMER_KEY"] consumer_secret = os.environ["TWITTER_CONSUMER_KEY_SECRET"] access_token = os.environ["TWITTER_ACCESS_TOKEN"] access_token_secret = os.environ["TWITTER_ACCESS_TOKEN_SECRET"] # OAuth1.0a用户上下文认证 auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) # 创建API v2客户端 client = tweepy.Client( consumer_key=consumer_key, consumer_secret=consumer_secret, access_token=access_token, access_token_secret=access_token_secret ) # 调用/users/me端点,指定需要返回的用户字段 response = client.get_me(user_fields=['id', 'name', 'username', 'created_at']) print(response.data)
方案2:用requests结合OAuth1.0a签名
如果不想依赖Tweepy,可以用requests-oauthlib库生成符合要求的认证请求头:
- 先安装依赖包:
pip install requests-oauthlib
- 修改代码实现:
import requests from requests_oauthlib import OAuth1 import os # 读取环境变量中的密钥信息 consumer_key = os.environ["TWITTER_CONSUMER_KEY"] consumer_secret = os.environ["TWITTER_CONSUMER_KEY_SECRET"] access_token = os.environ["TWITTER_ACCESS_TOKEN"] access_token_secret = os.environ["TWITTER_ACCESS_TOKEN_SECRET"] # 创建OAuth1认证对象 auth = OAuth1(consumer_key, consumer_secret, access_token, access_token_secret) # 发起API请求 url = 'https://api.twitter.com/2/users/me' response = requests.get(url, auth=auth) print(response.json())
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

