.:. 草榴社區 » 技術討論區 » 自己写一段程序来自动下载论坛某个页面的所有图片,纯技术
本頁主題: 自己写一段程序来自动下载论坛某个页面的所有图片,纯技术字體大小 寬屏顯示 只看樓主 最新點評 熱門評論 時間順序
落尘2023


級別:俠客 ( 9 )
發帖:1324
威望:153 點
金錢:6714 USD
貢獻:35 點
註冊:2023-10-18

膜拜大佬
TOP Posted: 03-27 13:06 #25樓 引用 | 點評
穿红袜子的鱼


級別:新手上路 ( 8 )
發帖:28
威望:23 點
金錢:76 USD
貢獻:0 點
註冊:2024-06-20

我也写了js版的,手机浏览器也能用。部署到CloudFlare Worker就行。

代码如下:

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    // 1. 处理代理请求 (绕过跨域并添加 Rust 代码中指定的请求头)
    if (url.pathname === '/proxy') {
      const targetUrl = url.searchParams.get('url');
      if (!targetUrl) return new Response('Missing URL', { status: 400 });

      const proxyRequest = new Request(targetUrl, {
        method: 'GET',
        headers: {
          'User-Agent': 'Mozilla/5.0',
          'Cookie': 'ismob=0'
        }
      });

      try {
        const response = await fetch(proxyRequest);
        // 复制响应并加上 CORS 头,允许前端读取数据
        const newResponse = new Response(response.body, response);
        newResponse.headers.set('Access-Control-Allow-Origin', '*');
        return newResponse;
      } catch (e) {
        return new Response(e.message, { status: 500 });
      }
    }

    // 2. 默认路由返回前端 HTML 页面
    const html = `
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>网页图片打包下载器</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
  <style>
    body { font-family: system-ui, sans-serif; max-width: 600px; margin: 40px auto; padding: 20px; line-height: 1.6; }
    h2 { color: #333; }
    input[type="text"] { width: 100%; padding: 10px; margin-bottom: 15px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }
    button { padding: 10px 20px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
    button:disabled { background-color: #aaa; cursor: not-allowed; }
    #status { margin-top: 20px; color: #555; font-weight: bold; }
  </style>
</head>
<body>
  <h2>图片下载打包器</h2>
  <input type="text" id="targetUrl" placeholder="请输入目标网页的 URL">
  <button id="downloadBtn">提取并打包</button>
  <div id="status"></div>

  <script>
    document.getElementById('downloadBtn').addEventListener('click', async () => {
      const urlInput = document.getElementById('targetUrl').value.trim();
      const statusEl = document.getElementById('status');
      const btn = document.getElementById('downloadBtn');
     
      if (!urlInput) {
        alert('请输入URL!');
        return;
      }

      btn.disabled = true;
      try {
        // 第一步:通过代理获取网页 HTML
        statusEl.innerText = '正在获取网页内容...';
        const htmlRes = await fetch('/proxy?url=' + encodeURIComponent(urlInput));
        const htmlText = await htmlRes.text();

        // 第二步:解析 HTML,寻找特定的 img 标签
        const parser = new DOMParser();
        const doc = parser.parseFromString(htmlText, 'text/html');
        // 选择器和逻辑:查找 img 并获取 ess-data 属性
        const images = doc.querySelectorAll('img[ess-data]');

        if (images.length === 0) {
          statusEl.innerText = '未在页面中找到带有 ess-data 属性的图片。';
          btn.disabled = false;
          return;
        }

        const zip = new JSZip();
        let count = 0;
       
        // 第三步:循环下载图片并加入 ZIP
        for (let i = 0; i < images.length; i++) {
          let imgUrl = images.getAttribute('ess-data');
         
          // 处理相对路径问题,确保是完整 URL
          if (imgUrl.startsWith('//')) {
            imgUrl = 'https:' + imgUrl;
          } else if (imgUrl.startsWith('/')) {
            const baseUrl = new URL(urlInput);
            imgUrl = baseUrl.origin + imgUrl;
          }

          statusEl.innerText = \`正在下载图片 \${i + 1} / \${images.length} ...\`;
         
          // 通过代理获取图片二进制数据
          const imgRes = await fetch('/proxy?url=' + encodeURIComponent(imgUrl));
          const blob = await imgRes.blob();
         
          // 命名逻辑:{count}.jpg
          zip.file(\`\${count}.jpg\`, blob);
          count++;
        }

        // 第四步:生成 ZIP 并触发浏览器下载
        statusEl.innerText = '正在生成 ZIP 文件,请稍候...';
        const zipBlob = await zip.generateAsync({type: 'blob'});
       
        const downloadLink = document.createElement('a');
        downloadLink.href = URL.createObjectURL(zipBlob);
        downloadLink.download = 'images.zip';
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);
        URL.revokeObjectURL(downloadLink.href);

        statusEl.innerText = \`完成!共成功打包了 \${count} 张图片。\`;

      } catch (e) {
        statusEl.innerText = '发生错误: ' + e.message;
      } finally {
        btn.disabled = false;
      }
    });
  </script>
</body>
</html>
    `;

    return new Response(html, {
      headers: { 'Content-Type': 'text/html;charset=UTF-8' }
    });
  }
}
TOP Posted: 03-27 13:50 #26樓 引用 | 點評
深蹲王


級別:聖騎士 ( 11 )
發帖:1000
威望:233 點
金錢:40219 USD
貢獻:28888 點
註冊:2025-12-03

感谢分享,真技术贴
------------------------
x

TOP Posted: 03-27 14:06 #27樓 引用 | 點評
夏季的季风


級別:騎士 ( 10 )
發帖:2173
威望:496 點
金錢:485 USD
貢獻:4529 點
註冊:2025-11-05

感谢楼主分享
TOP Posted: 03-27 14:48 #28樓 引用 | 點評
flysky0111


級別:俠客 ( 9 )
發帖:699
威望:153 點
金錢:1784 USD
貢獻:0 點
註冊:2016-05-26

1024
TOP Posted: 03-27 15:00 #29樓 引用 | 點評
爱巨乳


級別:新手上路 ( 8 )
發帖:238
威望:24 點
金錢:319 USD
貢獻:0 點
註冊:2025-12-22

感谢分享
TOP Posted: 03-27 15:28 #30樓 引用 | 點評
眼不见心还念


級別:新手上路 ( 8 )
發帖:73
威望:8 點
金錢:2574 USD
貢獻:0 點
註冊:2020-01-31

chrome一个插件就搞定了,还用的着那么复杂。我现在用的AixDownloader
TOP Posted: 03-27 15:29 #31樓 引用 | 點評
songweiya


級別:新手上路 ( 8 )
發帖:9
威望:1 點
金錢:21 USD
貢獻:0 點
註冊:2025-09-16

这才是技术贴 支持一下 多开发点安卓的哦
TOP Posted: 03-27 15:30 #32樓 引用 | 點評
快乐的图灵


級別:精靈王 ( 12 )
發帖:27520
威望:2753 點
金錢:61094 USD
貢獻:0 點
註冊:2022-02-12

谢谢分享
TOP Posted: 03-27 15:45 #33樓 引用 | 點評
wfcc


級別:聖騎士 ( 11 )
發帖:20042
威望:199 點
金錢:420 USD
貢獻:27774 點
註冊:2017-01-20

感谢分享
TOP Posted: 03-27 15:49 #34樓 引用 | 點評
老李推车


級別:俠客 ( 9 )
發帖:2414
威望:242 點
金錢:7375 USD
貢獻:0 點
註冊:2023-08-25

感谢分享
TOP Posted: 03-27 15:52 #35樓 引用 | 點評
唐僧爱泡妞


級別:風雲使者 ( 13 )
發帖:1732
威望:174 點
金錢:202723 USD
貢獻:260000 點
註冊:2018-08-23

感谢分享 
TOP Posted: 03-27 15:57 #36樓 引用 | 點評
社区高级会员


級別:俠客 ( 9 )
發帖:1089
威望:174 點
金錢:4965 USD
貢獻:11 點
註冊:2015-02-09

感谢分享
TOP Posted: 03-27 16:03 #37樓 引用 | 點評
镜湖人


級別:精靈王 ( 12 )
發帖:17027
威望:2754 點
金錢:3737 USD
貢獻:9999 點
註冊:2022-06-22

感谢分享技术贴
------------------------


TOP Posted: 03-27 16:30 #38樓 引用 | 點評
白虎大帝


級別:騎士 ( 10 )
發帖:3174
威望:388 點
金錢:3453 USD
貢獻:7526 點
註冊:2023-01-20

纯纯技术啊,感谢分享
TOP Posted: 03-27 16:39 #39樓 引用 | 點評
shineyg


級別:精靈王 ( 12 )
發帖:12620
威望:1570 點
金錢:45238 USD
貢獻:668 點
註冊:2021-06-08

纯技术贴,太厉害了!
------------------------


TOP Posted: 03-27 17:04 #40樓 引用 | 點評
一视同仁


級別:騎士 ( 10 )
發帖:3804
威望:381 點
金錢:12959 USD
貢獻:0 點
註冊:2011-11-01

感谢分享
TOP Posted: 03-27 17:11 #41樓 引用 | 點評
pepsi-cola


級別:騎士 ( 10 )
發帖:2317
威望:310 點
金錢:4029 USD
貢獻:0 點
註冊:2022-04-28

楼主好人 谢谢分享
TOP Posted: 03-27 17:31 #42樓 引用 | 點評
练练手


級別:聖騎士 ( 11 )
發帖:5571
威望:598 點
金錢:15162 USD
貢獻:1000 點
註冊:2020-11-26

感谢分享
TOP Posted: 03-27 18:11 #43樓 引用 | 點評
茎深


級別:天使 ( 14 )
發帖:43471
威望:60238 點
金錢:773777 USD
貢獻:118806 點
註冊:2023-11-21

不懂
已赞
------------------------


TOP Posted: 03-27 19:06 #44樓 引用 | 點評
牧场无糖


級別:精靈王 ( 12 )
發帖:10989
威望:1441 點
金錢:17679 USD
貢獻:4000 點
註冊:2025-04-16

感谢分享技术贴
------------------------


TOP Posted: 03-27 20:05 #45樓 引用 | 點評
kaovjj


級別:新手上路 ( 8 )
發帖:264
威望:27 點
金錢:821 USD
貢獻:0 點
註冊:2015-02-24

这才是技术区该有的帖子
TOP Posted: 03-27 20:55 #46樓 引用 | 點評
餐企服务商


級別:聖騎士 ( 11 )
發帖:8093
威望:810 點
金錢:13098 USD
貢獻:0 點
註冊:2024-10-11

感谢分享  勿忘提肛 
TOP Posted: 03-27 21:49 #47樓 引用 | 點評
操心


級別:俠客 ( 9 )
發帖:1850
威望:186 點
金錢:2700 USD
貢獻:0 點
註冊:2025-10-24

感谢分享 勿忘提肛
TOP Posted: 03-27 22:14 #48樓 引用 | 點評
苏筱熙


級別:天使 ( 14 )
發帖:137637
威望:62366 點
金錢:116715 USD
貢獻:69 點
註冊:2012-09-01

厉害了
------------------------


TOP Posted: 03-27 22:23 #49樓 引用 | 點評
.:. 草榴社區 » 技術討論區

電腦版 手機版 客戶端 DMCA
用時 0.01(s) x2 s.9, 03-30 10:04