使用Python urllib调用GitHub API遇403错误,求无包装库认证方案
嘿,这个403 Forbidden错误大概率是因为GitHub API的速率限制触发了——未认证的请求每小时只有60次配额,很容易就耗尽了。你不想用包装库完全没问题,用原生的urllib就能轻松实现认证,下面给你两种靠谱的方案:
方法一:使用个人访问令牌(PAT,GitHub推荐)
这是最安全且推荐的方式,步骤很简单:
- 先在GitHub的账户设置里生成一个带有必要权限的个人访问令牌(比如如果你要访问仓库数据,勾选
repo权限即可,不要给多余权限) - 修改你的代码,给请求添加
Authorization头:
import urllib.request import json # 替换成你的API链接和PAT link = "https://api.github.com/your-target-endpoint" github_token = "your-personal-access-token" # 创建请求对象并注入认证头 req = urllib.request.Request(link) req.add_header("Authorization", f"token {github_token}") try: response = urllib.request.urlopen(req) raw_json = response.read().decode("utf-8") data = json.loads(raw_json) # 这里可以处理你的数据 print(data) except urllib.error.HTTPError as e: print(f"请求失败: {e.code} - {e.reason}")
方法二:基本认证(不推荐,仅作参考)
如果你想用用户名+密码(或PAT)做基本认证,也可以这样实现,但这种方式不如PAT灵活安全:
import urllib.request import json import base64 link = "https://api.github.com/your-target-endpoint" username = "your-github-username" # 这里可以填密码或者PAT auth_value = "your-password-or-pat" # 对用户名和认证值进行Base64编码 credentials = f"{username}:{auth_value}".encode("utf-8") encoded_creds = base64.b64encode(credentials).decode("utf-8") req = urllib.request.Request(link) req.add_header("Authorization", f"Basic {encoded_creds}") try: response = urllib.request.urlopen(req) raw_json = response.read().decode("utf-8") data = json.loads(raw_json) print(data) except urllib.error.HTTPError as e: print(f"请求失败: {e.code} - {e.reason}")
额外注意事项
- 永远不要把PAT或密码硬编码到代码里!最好用环境变量读取,比如:
import os github_token = os.getenv("GITHUB_TOKEN") - 认证后,GitHub API的请求配额会提升到每小时5000次,足够大部分日常使用场景
- 如果还是遇到403,检查一下令牌的权限是否足够,或者有没有触发其他限制(比如单个IP的请求频率)
内容的提问来源于stack exchange,提问作者mishi ahmad




