如何从GitHub Release页下载文件名动态变化的文件?
修复方案
问题分析
原代码存在两个核心问题:
https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/releases/latest是网页跳转链接,并非直接的文件下载链接,请求该链接返回的是HTML页面内容,不是zip文件。- 未处理Release页面包含多个文件的情况,无法自动识别目标zip文件。
修复步骤
利用GitHub API获取最新Release的资产列表,筛选出目标zip文件后下载:
完整修复代码
import requests import os # GitHub仓库信息 REPO_OWNER = "GTNewHorizons" REPO_NAME = "GT-New-Horizons-Modpack" # 目标文件的关键词(根据GTNH的Release文件特征调整) TARGET_FILE_KEYWORDS = ["GT-New-Horizons", ".zip"] # 旧文件路径 ORIGINAL_FILE_PATH = "C:\\Users\\********\\CurseforgeUtils\\GTNHAutoUpdate\\GTNHOld.zip" def get_latest_release_asset_url(): # 调用GitHub API获取最新Release信息 api_url = f"https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/releases/latest" response = requests.get(api_url) response.raise_for_status() # 捕获请求错误 release_data = response.json() # 遍历资产列表,筛选目标zip文件 for asset in release_data["assets"]: asset_name = asset["name"] if all(keyword in asset_name for keyword in TARGET_FILE_KEYWORDS): return asset["browser_download_url"] raise ValueError("未找到符合要求的目标zip文件") def download_zip(url, save_path): # 下载并保存文件 response = requests.get(url) response.raise_for_status() with open(save_path, "wb") as f: f.write(response.content) print(f"文件已保存至: {save_path}") if __name__ == "__main__": try: download_url = get_latest_release_asset_url() download_zip(download_url, ORIGINAL_FILE_PATH) except Exception as e: print(f"操作失败: {str(e)}")
关键说明
- GitHub API调用:通过官方API接口直接获取最新Release的所有资产信息,避免解析HTML页面的麻烦。
- 动态文件匹配:通过关键词筛选目标文件,不管版本号如何变化,只要文件名包含设定的关键词就能匹配,适配版本更新后的文件名变化。
- 错误处理:添加了HTTP请求错误捕获和文件未找到的异常提示,方便排查问题。
内容的提问来源于stack exchange,提问作者Penrosian
相关产品推荐
相关产品推荐

