《Get_all_img_Library 2.0》超详细说明书
一、脚本能干什么
- 批量抓取任意网页里的「大图」链接(只要页面里能定位到
<img>或自定义属性即可)。 - 抓取结果实时弹出一个可点选、可预览的 ShowBox 面板。
- 一键把面板里选中的图片批量下载到本地(借助 Tampermonkey 的 GM_download,无跨域问题)。
- 全流程只需写「两行」业务函数:
- 给我一个索引,返回要抓的页面 URL;
- 给我返回的页面源码,返回要下的大图地址(支持数组)。
- 支持三种「取页面」方式: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 大全(按调用顺序)
new GAIL()
创建实例,所有配置/方法都挂在实例上。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),也可传自定义函数。
instance.Go(index)—— 真正开始抓
异步函数,内部流程:- 按
getWay把页面拉回来; - 把源码丢给
GetImgFn拿到图片地址; - 若没传
PutImgFn→ 自动ShowBox.Add(imgs); - 任何一步失败都在控制台打出
console.error,不会中断循环。
- 按
instance.ShowMass(msg)—— 在左上角打一条临时绿字提示,点字消失。
四、ShowBox 面板操作说明
- 弹窗右上角「✕」关闭。
- 每张图下方有「单张下载」图标。
- 底部「下载全部」→ 会把当前面板里已加载出来的图一次性塞进 DownloadBox。
- 若图片很多,面板默认分页,可滚动加载。
五、DownloadBox 子系统
- 基于
GM_download实现,无 CORS 限制。 - 自动在文件名前补
{index}_防止重名。 - 失败项会在控制台留日志,并继续下一张。
- 批量下载时按钮会加
.busy样式,可自己写 CSS 转菊花。
六、高级玩法示例
- 抓「懒加载」站点
const GetImg = html => {
// 先取 data-original,再回退 src
return $(html).find('img').toArray()
.map(img => img.dataset.original || img.src)
.filter(Boolean);
};
- 抓「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'
});
- 自定义下载 → 走自建后端
gail.SetFn({
downloadWay: urls => {
fetch('https://myserver/batch',{
method:'POST',
body: JSON.stringify({urls}),
headers:{'Content-Type':'application/json'}
});
}
});
- 想直接把图插到当前页面而不是弹窗
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 字段,可随意二开。
================================================================
说明书结束,祝你抓图愉快!