使用Python requests访问GitHub API遇凭证错误,求排查方案
解决GitHub API请求返回"Bad credentials"的问题
看起来你遇到的情况有点棘手——curl能正常拿到结果,但用requests写的两种方式都报了认证错误,我来帮你梳理几个关键排查点和解决办法:
1. 先确认Token的有效性与权限
这是最常见的原因,先优先排查:
- 去GitHub的「Settings → Developer settings → Personal access tokens」里检查你的token:确保它没有过期、没有被撤销
- 确认token拥有repo权限(如果目标仓库是私有的话),至少要有读取仓库内容的权限
- 复制token时有没有不小心带了多余的空格或换行?可以在终端里用
echo打印token,对比GitHub上的原始值是否一致
2. 调整第二种写法的Auth参数
GitHub允许用token作为Basic Auth的密码,但用户名可以是特殊值x-oauth-basic(这是GitHub推荐的无用户名认证方式),你可以修改第二种写法试试:
import requests url = "https://api.github.com/repos/rsapkf/42/commits" headers = {"Accept": "application/vnd.github.inertia-preview+json"} my_token = "a0d42faabef23ab5b5462394373fc133ca107890" # 使用x-oauth-basic作为用户名,避免用户名匹配问题 r = requests.get(url, headers=headers, auth=('x-oauth-basic', my_token)) print(r.json())
3. 验证第一种写法的Headers格式
第一种写法的Headers逻辑是对的,但可以先打印实际发送的请求头,确认没有格式错误:
import requests url = "https://api.github.com/repos/rsapkf/42/commits" headers = { "Accept": "application/vnd.github.inertia-preview+json", "Authorization": "token a0d42faabef23ab5b5462394373fc133ca107890" } # 创建Session查看预发送的请求头 s = requests.Session() req = requests.Request('GET', url, headers=headers) prepped = s.prepare_request(req) # 打印Headers确认格式 print(prepped.headers) # 发送请求 r = s.send(prepped) print(r.json())
重点检查Authorization头:token和你的token之间必须有一个空格,且token本身没有拼写错误。
4. 排除环境干扰
如果上面都没问题,可能是你的运行环境有代理或防火墙,导致requests的请求被修改。可以试试关闭代理,或者在请求里明确禁用代理:
# 第一种写法禁用代理的示例 r = requests.get(url, headers=headers, proxies={"http": None, "https": None})
另外提个小细节:你提供的curl命令里URL是/repos/rsapkf/42/commit(单数),但requests里用的是/commits(复数)——不过这个只会导致404错误,不是认证问题,统一成复数URL就好。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

