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

