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

如何用Python从GitHub私有仓库下载最新发布文件?

解决方案

问题原因

你用的直接下载URL(https://github.com/HamzaYslmn/example/releases/latest/download/example.exe)是网页端跳转链接,对于私有仓库,仅靠Token头请求该链接无法正确处理权限验证,重定向过程中还可能丢失权限信息。而获取标签的请求是直接调用GitHub REST API,权限逻辑更明确,所以能成功。

修复步骤

1. 通过API获取正确的资产下载URL

修改下载逻辑,先调用GitHub API拿到最新release中目标文件的官方下载链接,再执行下载:

import requests

headers = {'Authorization': 'token ' + 'ghp_xxxxxxxxxxxxxxx'}

def get_latest_release_asset_url(repo_owner, repo_name, asset_name):
    # 调用API获取最新release信息
    latest_tag_url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/releases/latest"
    response = requests.get(latest_tag_url, headers=headers)
    response.raise_for_status()  # 捕获API请求错误
    release_data = response.json()
    
    # 遍历资产列表,找到目标文件的下载链接
    for asset in release_data['assets']:
        if asset['name'] == asset_name:
            return asset['browser_download_url']
    return None

def download_and_apply_update(self, loading_window):
    repo_owner = "HamzaYslmn"
    repo_name = "example"
    asset_name = "example.exe"
    new_executable_path = "DetaBaseFatura_New.exe"
    
    # 获取正确的下载URL
    download_url = get_latest_release_asset_url(repo_owner, repo_name, asset_name)
    if not download_url:
        loading_window[1]["text"] = "Error: 未找到目标文件"
        loading_window[0].update()
        return
    
    # 执行下载
    response = requests.get(download_url, stream=True, headers=headers, allow_redirects=True)
    response.raise_for_status()  # 捕获下载请求错误
    
    total_size = int(response.headers.get("content-length", 0))
    chunk_size = 8192
    
    with open(new_executable_path, "wb") as new_executable_file:
        downloaded_size = 0
        for data in response.iter_content(chunk_size=chunk_size):
            new_executable_file.write(data)
            downloaded_size += len(data)
            if total_size > 0:
                progress_percentage = (downloaded_size / total_size) * 100
                loading_window[1]["text"] = f"Progress: {progress_percentage:.2f}%"
                loading_window[2]["value"] = progress_percentage
                loading_window[0].update()

2. 关键优化点

  • 使用官方API下载链接:browser_download_url是GitHub提供的资产直接下载地址,权限验证逻辑更可靠
  • 添加错误捕获:response.raise_for_status()会直接抛出HTTP错误,方便快速排查权限或资源问题
  • 匹配资产文件名:遍历资产列表精准匹配文件名,避免因文件名大小写或后缀不一致导致下载失败
  • 显式允许重定向:allow_redirects=True确保即使遇到重定向也能正确跟随并保持权限

3. 额外排查建议

  • 检查Token权限:确保Token拥有repo权限(私有仓库必备),无需开通全部权限
  • 打印响应状态码:在下载请求后添加print(response.status_code),403代表权限问题,404代表文件或仓库不存在
  • 核对资产名称:确认release中上传的文件名称和代码中asset_name完全一致

内容的提问来源于stack exchange,提问作者Teccno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:52:57