如何通过GitHub API下载私有仓库PR补丁?脚本遇404问题求助
解决方案
问题根源
你遇到的Not Found问题,主要是因为GitHub的web端patch URL(github.com域名)对请求头有严格要求,requests默认的请求标识可能被拦截;另外也可以直接通过GhApi的内置方法绕过URL拼接的问题,更省心可靠。
修复方案1:完善requests请求头
在请求原patch_url时,补充User-Agent头(GitHub要求所有请求必须携带合法的User-Agent),同时确保token格式正确:
from ghapi.core import GhApi import requests github_token = "<my token>" api = GhApi(owner="<my-org>", repo="<my-repo>", token=github_token ) for pr_number, patch_url in map(lambda pr: (pr['number'], pr['patch_url']), api.pulls.list(state="open", per_page=100, page=1 )): print(pr_number, patch_url) # 补充必要请求头 headers = { 'Authorization': f'token {github_token}', 'User-Agent': 'Python/requests' # 填写任意合法的User-Agent即可 } r = requests.get(patch_url, headers=headers) # 新增状态码检查,方便排查问题 if r.status_code == 200: open(f"{pr_number}.patch", 'wb').write(r.content) else: print(f"下载PR {pr_number}失败,状态码:{r.status_code},响应内容:{r.text}")
修复方案2:直接用GhApi获取补丁内容(更推荐)
GhApi的pulls.get方法支持直接返回PR的patch内容,无需手动处理patch_url,授权逻辑已内置,避免URL拼接或请求头问题:
from ghapi.core import GhApi github_token = "<my token>" api = GhApi(owner="<my-org>", repo="<my-repo>", token=github_token ) # 获取所有开放PR open_prs = api.pulls.list(state="open", per_page=100, page=1) for pr in open_prs: pr_number = pr['number'] print(f"正在下载PR {pr_number}的补丁") # 直接获取patch内容 patch_content = api.pulls.get(pr_number).patch # 写入文件(指定编码避免乱码) with open(f"{pr_number}.patch", 'w', encoding='utf-8') as f: f.write(patch_content)
额外检查项
- 确保你的GitHub Token拥有repo权限(私有仓库必须要有该权限),可在GitHub个人设置→开发者设置→Personal access tokens里检查权限配置。
- 若使用方案1,确认patch_url未被截断或拼接错误,可直接打印出来对比浏览器中的URL。
内容的提问来源于stack exchange,提问作者ksrikanth
相关产品推荐
相关产品推荐

