WishMeLz

生活其实很有趣

Typecho图片同步又拍云

前文说到: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毫秒滚动一次
    });
  });
}

2025-04-07T07:01:30.png