如何用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
相关产品推荐
相关产品推荐

