const crypto = require("crypto"); async function dogecloudApi(apiPath, data = {}) { const accessKey = process.env.DOGECLOUD_ACCESS_KEY; const secretKey = process.env.DOGECLOUD_SECRET_KEY; if (!accessKey || !secretKey) { console.error("Error: DOGECLOUD_ACCESS_KEY or DOGECLOUD_SECRET_KEY not set."); process.exit(1); } const body = JSON.stringify(data); const signStr = apiPath + "\n" + body; const sign = crypto.createHmac("sha1", secretKey).update(signStr).digest("hex"); const authorization = `TOKEN ${accessKey}:${sign}`; const res = await fetch(`https://api.dogecloud.com${apiPath}`, { method: "POST", headers: { Authorization: authorization, "Content-Type": "application/json", }, body, }); return res.json(); } async function main() { const cdnUrlListStr = process.env.CDN_URL_LIST; if (!cdnUrlListStr) { console.log("Warning: CDN_URL_LIST not found or empty."); return; } let urlList = cdnUrlListStr .replace(/\n/g, ",") .split(",") .map((u) => u.trim()) .filter(Boolean); if (urlList.length === 0) { console.log("No URLs to refresh."); return; } // ★ 多吉云 rtype=path 是「刷新目录」,目录必须以 / 结尾: // https://usj.cc → 只刷新首页这一个文件(旧行为,不是全站) // https://usj.cc/ → 整站刷新 // 这里兜底补尾斜杠(只对裸域名生效,不碰带路径的 URL)。 urlList = urlList.map((u) => { const bare = /^https?:\/\/[^/?#]+$/.test(u); if (bare) { console.log(`[warn] "${u}" 缺少结尾斜杠 —— 补成 "${u}/" 才能全站刷新`); return u + "/"; } return u; }); console.log(`Refreshing ${urlList.length} URLs (rtype=path, 目录刷新)...`); urlList.forEach((u) => console.log(` - ${u}`)); const result = await dogecloudApi("/cdn/refresh/add.json", { rtype: "path", urls: JSON.stringify(urlList), }); if (result && result.code === 200) { console.log( `Refresh task submitted. Task ID: ${result.data.task_id}, count: ${result.data.count}`, ); } else { console.error(`Failed to submit refresh task. Response: ${JSON.stringify(result)}`); process.exit(1); } } main();