为何调用Pocket API始终返回401状态码?附调试代码
嘿,我来帮你排查下调用Pocket API时一直收到401状态码的问题,结合你的代码来看,主要是这几个环节容易出错:
1. 请求令牌的获取与使用不匹配
你代码里直接用了硬编码的code: '21ff0ee0-2b65-fe35-f4b3-a18ed3',但这个值应该是从第一步获取请求令牌的响应里动态提取的,而不是手动写死。Pocket返回的请求令牌是一次性的,硬编码的旧令牌肯定会导致授权失败。
2. 重定向URI的格式与配置不匹配
你设置的redirect_uri里用了&,这是HTML转义后的符号,实际请求中应该使用原始的&。同时,这个URI必须和你在Pocket开发者后台配置的Redirect URI完全一致,包括所有参数和符号,哪怕一个字符不同都会触发401。
3. 跳过了用户授权的关键步骤
Pocket的OAuth流程需要三个步骤:获取请求令牌 → 引导用户登录Pocket并授权你的应用 → 用请求令牌交换访问令牌。你直接跳过了中间用户授权的步骤,调用authorize接口自然会被拒绝。
修正后的代码示例
import requests from urllib.parse import parse_qs # 第一步:获取请求令牌 auth_params = { 'consumer_key': '77081-4664470ecdeaa9c127925c30', 'redirect_uri': 'https://weibo.com/u/5069317986/home?topnav=1&wvr=6' # 替换为后台配置的原始URI,用&而非& } tkn_response = requests.post('https://getpocket.com/v3/oauth/request', data=auth_params) tkn_data = parse_qs(tkn_response.content.decode('utf-8')) request_token = tkn_data['code'][0] print(f"获取到请求令牌:{request_token}") # 第二步:引导用户完成授权(必须手动操作) auth_url = f"https://getpocket.com/auth/authorize?request_token={request_token}&redirect_uri={auth_params['redirect_uri']}" print(f"请复制以下链接到浏览器,登录Pocket并授权你的应用:\n{auth_url}") # 第三步:用户授权后,交换访问令牌 usr_params = { 'consumer_key': '77081-4664470ecdeaa9c127925c30', 'code': request_token # 使用动态获取的请求令牌 } usr_response = requests.post('https://getpocket.com/v3/oauth/authorize', data=usr_params) usr_data = parse_qs(usr_response.content.decode('utf-8')) print("授权响应结果:", usr_data)
额外注意事项
- 检查Pocket开发者后台的Consumer Key是否和代码里的一致,不要出现字符遗漏或拼写错误。
- 如果授权后还是401,尝试重新生成请求令牌,因为请求令牌是短期有效的,过期后无法使用。
- 确保你的网络环境可以正常访问Pocket的API服务器,部分地区可能需要调整网络设置。
内容的提问来源于stack exchange,提问作者xiaotian wang
相关产品推荐
相关产品推荐

