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

如何获取GitHub最新Release原始URL,通过Node.js流下载

如何获取GitHub最新Release的原始URL并通过Node.js/Electron下载

一、当前下载失败的原因

GitHub Release的下载链接会返回302重定向,默认的https.get不会自动跟随重定向,导致无法获取实际的文件流,这就是你的代码无法下载Release文件的核心原因。

二、修复Node.js下载函数(支持重定向)

修改下载函数,添加重定向处理逻辑,同时优化文件名提取逻辑:

import https from "https";
const { pipeline } = require("stream/promises");
import path from "path";
import fs from "fs";

async function download(url) {
  return new Promise(async (resolve, reject) => {
    const fetchFile = (targetUrl) => {
      https.get(targetUrl, async (res) => {
        // 处理302重定向
        if (res.statusCode === 302 && res.headers.location) {
          fetchFile(res.headers.location);
          return;
        }

        if (res.statusCode !== 200) {
          reject(new Error(`请求失败,状态码:${res.statusCode}`));
          return;
        }

        // 优先从响应头提取文件名, fallback到URL拆分
        let fileName = url.split("/").pop();
        const contentDisposition = res.headers["content-disposition"];
        if (contentDisposition) {
          const match = contentDisposition.match(/filename="?([^"]+)"?/);
          if (match) fileName = match[1];
        }

        const fileWriteStream = fs.createWriteStream(path.join(__dirname, fileName), {
          autoClose: true,
          flags: "w",
        });

        try {
          await pipeline(res, fileWriteStream);
          resolve("success");
        } catch (err) {
          reject(err);
        }
      }).on("error", reject);
    };

    fetchFile(url);
  });
}

// 现在可以正常下载Release文件
await download("https://github.com/spicetify/spicetify-cli/releases/download/v2.15.0/spicetify-2.15.0-windows-x64.zip");

三、获取GitHub最新Release的下载URL

通过GitHub REST API获取最新Release信息,从中提取对应资产的下载链接:

async function getLatestReleaseAssetUrl(owner, repo, assetNamePattern) {
  const apiUrl = `https://api.github.com/repos/${owner}/${repo}/releases/latest`;
  return new Promise((resolve, reject) => {
    https.get(apiUrl, {
      headers: {
        "User-Agent": "Node.js Downloader" // GitHub API强制要求设置User-Agent
      }
    }, (res) => {
      if (res.statusCode !== 200) {
        reject(new Error(`获取最新Release失败,状态码:${res.statusCode}`));
        return;
      }

      let data = "";
      res.on("data", chunk => data += chunk);
      res.on("end", () => {
        try {
          const release = JSON.parse(data);
          // 根据文件名正则匹配目标资产
          const asset = release.assets.find(asset => 
            asset.name.match(assetNamePattern)
          );
          if (!asset) {
            reject(new Error("未找到匹配的Release资产"));
            return;
          }
          resolve(asset.browser_download_url);
        } catch (err) {
          reject(err);
        }
      });
    }).on("error", reject);
  });
}

// 使用示例:获取spicetify-cli最新Windows x64版本的下载链接
const latestUrl = await getLatestReleaseAssetUrl(
  "spicetify", 
  "spicetify-cli", 
  /spicetify-.*-windows-x64\.zip$/
);
await download(latestUrl);

四、Electron环境下的下载方案

Electron提供了更适配桌面应用的下载API,基于Chromium内核,支持进度监听、暂停/恢复、系统下载栏集成等功能,示例如下:

主进程代码

const { app, BrowserWindow, session, ipcMain } = require('electron');
const path = require('path');

function createWindow() {
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  });

  // 全局监听下载事件
  session.defaultSession.on('will-download', (event, item) => {
    // 设置保存路径(可选,不设置则使用系统默认下载目录)
    const savePath = path.join(app.getPath('downloads'), item.getFilename());
    item.setSavePath(savePath);

    // 监听下载进度
    item.on('updated', (event, state) => {
      if (state === 'progressing') {
        console.log(`下载进度:${((item.getReceivedBytes() / item.getTotalBytes()) * 100).toFixed(2)}%`);
      }
    });

    // 下载完成/失败回调
    item.once('done', (event, state) => {
      if (state === 'completed') {
        console.log(`下载完成,保存路径:${savePath}`);
      } else {
        console.log(`下载失败:${state}`);
      }
    });
  });

  // 监听渲染进程的下载请求
  ipcMain.on('trigger-download', (event, url) => {
    mainWindow.webContents.downloadURL(url);
  });

  mainWindow.loadFile('index.html');
}

app.whenReady().then(createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

preload.js(渲染进程与主进程通信桥接)

const { ipcRenderer } = require('electron');

window.triggerReleaseDownload = (url) => {
  ipcRenderer.send('trigger-download', url);
};

渲染进程调用示例

<button onclick="window.triggerReleaseDownload('https://github.com/spicetify/spicetify-cli/releases/download/v2.15.0/spicetify-2.15.0-windows-x64.zip')">
  下载最新版本
</button>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:00:46