- blog-admin tools.ts: favicon 响应加 s-maxage/CDN-Cache-Control, 让 CF 边缘可缓存,边缘命中即不进 Worker,KV 读取量大幅下降 - scripts/refresh_cdn.js: 裸域名自动补尾斜杠(多吉云 rtype=path 是目录刷新, https://usj.cc 只刷首页,https://usj.cc/ 才是全站),并打印刷新清单 - 新增文档:评论孤儿修复方案、函数版证书管家方案、诊断报告
78 lines
2.2 KiB
JavaScript
78 lines
2.2 KiB
JavaScript
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();
|