Get_all_img_Library 2.0

Created at 21 days ago
Updated at 21 days ago
批量抓取任意网页里的「大图」链接
Total Installs
14
Today's New
+0
User Rating
- / 5.0 (0)
Current Version
2025.09.27
// @require https://scriptcat.org/lib/4717/2025.09.27/Get_all_img_Library%202.0.js?sha384-kSEh4/4GjwGO4l7mFfDPwDcRYk1gAUdXBDGKvxHiFD5SUCuIchTMxPUgjKFnrWsy
Library Details
This is a library used by userscripts, you can reference it directly in your scripts.

《Get_all_img_Library 2.0》超详细说明书

一、脚本能干什么

  1. 批量抓取任意网页里的「大图」链接(只要页面里能定位到 <img> 或自定义属性即可)。
  2. 抓取结果实时弹出一个可点选、可预览的 ShowBox 面板。
  3. 一键把面板里选中的图片批量下载到本地(借助 Tampermonkey 的 GM_download,无跨域问题)。
  4. 全流程只需写「两行」业务函数:
    • 给我一个索引,返回要抓的页面 URL;
    • 给我返回的页面源码,返回要下的大图地址(支持数组)。
  5. 支持三种「取页面」方式:ajax / fetch / 自定义;支持两种「下载」方式:GM_download 或自己写。

二、快速体验(5 分钟跑通)

步骤 1:安装脚本

  • 已装 Tampermonkey → 直接把整段代码「新建脚本」→ 保存。

步骤 2:找一个小图床站点做实验(例:xxx.com/gallery/1 … 100)。
打开任意一张帖子,F12 确认:

  • 帖子地址规律:xxx.com/gallery/{索引}
  • 大图路径在 <img class="big" data-src="xxx.jpg">

步骤 3:在浏览器控制台一次性粘贴:

// 1. 告诉脚本“如何拼 URL”
const GetUrl = i => `https://xxx.com/gallery/${i}`;

// 2. 告诉脚本“如何取大图”
const GetImg = html => $(html).find('img.big').toArray().map(img => img.dataset.src);

// 3. 实例化 & 跑 10 个
const gail = new GAIL();
gail.SetFn({ GetUrlFn: GetUrl, GetImgFn: GetImg });
for(let i=1;i<=10;i++) gail.Go(i);

回车 → 右上角立刻弹出 ShowBox → 点「下载全部」→ 10 组图片秒进下载栏。

三、API 大全(按调用顺序)

  1. new GAIL()
    创建实例,所有配置/方法都挂在实例上。

  2. instance.SetFn({...}) —— 唯一必须调用的配置函数
    参数对象可包含:

    • GetUrlFn(index) 【必传】返回第 index 个页面 URL(string | Promise<string>)。
    • GetImgFn(htmlString) 【必传】返回图片地址,支持三种格式:
      – 单字符串:一张图;
      – 字符串数组:多图;
      – jQuery 对象:内部自动提取 img.src
    • PutImgFn(imgs,index) 【可选】若提供,则「跳过」内置 ShowBox,把结果交给你自己处理。
    • getWay 【可选】取页面方式,默认 "ajax",可选 "fetch" 或自定义函数。
    • downloadWay 【可选】下载方式,默认 "GM"(即 GM_download),也可传自定义函数。
  3. instance.Go(index) —— 真正开始抓
    异步函数,内部流程:

    1. getWay 把页面拉回来;
    2. 把源码丢给 GetImgFn 拿到图片地址;
    3. 若没传 PutImgFn → 自动 ShowBox.Add(imgs)
    4. 任何一步失败都在控制台打出 console.error,不会中断循环。
  4. instance.ShowMass(msg) —— 在左上角打一条临时绿字提示,点字消失。

四、ShowBox 面板操作说明

  • 弹窗右上角「✕」关闭。
  • 每张图下方有「单张下载」图标。
  • 底部「下载全部」→ 会把当前面板里已加载出来的图一次性塞进 DownloadBox。
  • 若图片很多,面板默认分页,可滚动加载。

五、DownloadBox 子系统

  • 基于 GM_download 实现,无 CORS 限制。
  • 自动在文件名前补 {index}_ 防止重名。
  • 失败项会在控制台留日志,并继续下一张。
  • 批量下载时按钮会加 .busy 样式,可自己写 CSS 转菊花。

六、高级玩法示例

  1. 抓「懒加载」站点
const GetImg = html => {
  // 先取 data-original,再回退 src
  return $(html).find('img').toArray()
         .map(img => img.dataset.original || img.src)
         .filter(Boolean);
};
  1. 抓「JSON 接口」而不是 HTML
// 把 getWay 改成 fetch,返回 JSON
gail.SetFn({
  GetUrlFn: i => `https://api.xxx.com/list?page=${i}`,
  GetImgFn: json => JSON.parse(json).data.map(o => o.pic_url),
  getWay: 'fetch'
});
  1. 自定义下载 → 走自建后端
gail.SetFn({
  downloadWay: urls => {
    fetch('https://myserver/batch',{
      method:'POST',
      body: JSON.stringify({urls}),
      headers:{'Content-Type':'application/json'}
    });
  }
});
  1. 想直接把图插到当前页面而不是弹窗
gail.SetFn({
  PutImgFn: (imgs,idx) => {
    const box = $('#myGallery').append(`<h3>第${idx}页</h3>`);
    [].concat(imgs).forEach(src => box.append(`<img src="${src}" width="200">`));
  }
});

七、常见问题汇总

Q1: 点击「下载全部」没反应?
→ 确认浏览器弹出下载栏是否被拦截;Tampermonkey 图标上是否有个小红数字(被拦截数量)。

Q2: 图片下载后文件名乱?
→ 脚本默认用 URL 最后一段做文件名。如果想自定义,在 PutImgFn 里自己调用 GM_download(url, name)

Q3: 想中途停止?
→ 目前没做 AbortController,刷新页面即可;或把 Go 包在 setTimeout 里手动控制并发。

Q4: 会不会被封 IP?
→ 脚本本身无限速,如目标站有风控,请在外层自己加延迟/代理:

for(let i=1;i<=100;i++){ setTimeout(()=>gail.Go(i), i*1000) }

八、版本记录

2025.09.27 v2.0

  • 全面重构,引入 ShowBox + DownloadBox 双组件;
  • 支持 fetch、ajax 双引擎;
  • 支持自定义 PutImgFn,彻底解耦「抓取」与「展示」;
  • 新增 ShowMass 快捷提示;
  • 修复 TM 4.x 下 GM_download 冲突问题。

九、开源 / 反馈

脚本发布在 https://scriptcat.org/code/3246/,欢迎提 issue 或 PR。
作者留言:只要保留 @author 字段,可随意二开。

================================================================
说明书结束,祝你抓图愉快!