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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:33:26