前文说到:typecho 使用 又拍云CDN和云存储, 这涉及到一个问题,如何将以前的所有文件在同步到又拍云一份,手动copy涉及到导出上传问题,太麻烦。这里有个小技巧,他既然都已经打开页面自动替换文件url了,那么写个脚本将所有的文章都挨个打开一遍,自然就同步完成,脚本如下:
const puppeteer = require('puppeteer');
(async () => {
// 启动浏览器
const browser = await puppeteer.launch({
headless: false, // 设置为true可以在后台运行,false可以看到浏览器窗口
defaultViewport: null, // 使用默认视口
args: ['--start-maximized'] // 最大化窗口
});
try {
// 创建一个新页面
const page = await browser.newPage();
// 设置页面超时时间(可选)
page.setDefaultNavigationTimeout(60000); // 60秒
// 遍历从1到2000的页面
for (let i = 1; i <= 2000; i++) {
console.log(`正在访问页面 ${i}/2000`);
// 构建URL
const url = `https://blog.itsse.cn/${i}.html`;
try {
// 导航到页面
const response = await page.goto(url, { waitUntil: 'networkidle2' });
// 检查页面状态码,如果是404则跳过
if (response.status() === 404) {
console.log(`页面 ${url} 返回404,跳过并继续下一个页面`);
continue;
}
// 滚动到页面底部
await autoScroll(page);
// 等待1秒
await new Promise(resolve => setTimeout(resolve, 1000));
} catch (error) {
console.error(`访问页面 ${url} 时出错:`, error.message);
// 继续下一个页面,而不是终止整个过程
continue;
}
}
} catch (error) {
console.error('发生错误:', error);
} finally {
// 关闭浏览器
await browser.close();
console.log('任务完成');
}
})();
// 自动滚动到页面底部的函数
async function autoScroll(page) {
await page.evaluate(async () => {
await new Promise((resolve) => {
let totalHeight = 0;
const distance = 100; // 每次滚动的距离
const timer = setInterval(() => {
const scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
// 如果已经滚动到底部,或者滚动超过了页面高度,就停止
if (totalHeight >= scrollHeight) {
clearInterval(timer);
resolve();
}
}, 100); // 每100毫秒滚动一次
});
});
}