You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:30:21