You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python urllib调用GitHub API遇403错误,求无包装库认证方案

嘿,这个403 Forbidden错误大概率是因为GitHub API的速率限制触发了——未认证的请求每小时只有60次配额,很容易就耗尽了。你不想用包装库完全没问题,用原生的urllib就能轻松实现认证,下面给你两种靠谱的方案:

方法一:使用个人访问令牌(PAT,GitHub推荐)

这是最安全且推荐的方式,步骤很简单:

  1. 先在GitHub的账户设置里生成一个带有必要权限的个人访问令牌(比如如果你要访问仓库数据,勾选repo权限即可,不要给多余权限)
  2. 修改你的代码,给请求添加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

火山引擎 最新活动