豆包图片去水印
一个运行在豆包网页上的用户脚本,用于提取当前页面中可匹配到的原始图片,并提供预览、单张下载和批量下载功能。
借鉴了https://scriptcat.org/zh-CN/script-show-page/7835 作者辻弌20的插件
当前版本:1.6.0
功能
- 提取当前豆包页面中的原始图片链接。
- 只显示当前页面或当前对话中能够匹配到的图片。
- 以缩略图网格展示素材,并显示图片尺寸。
- 点击缩略图查看大图预览。
- 支持单张下载。
- 支持勾选多张图片后批量下载。
- 支持全选和取消选择。
- 浮动按钮支持拖动。
- 自动保存浮动按钮位置,下次打开页面时恢复。
- 使用 Shadow DOM 隔离脚本界面样式,减少与豆包页面样式冲突。
- 拦截页面中的 JSON、Fetch 和 XHR 数据,尽早记录图片原始链接。
- 自动将页面中的相关图片预览和下载链接改写为原始图片链接。
安装
- 安装一个支持用户脚本的浏览器扩展,例如 Tampermonkey、Violentmonkey 或其他兼容扩展。
- 打开用户脚本管理器的新增脚本页面。
- 将
doubao-fixed.user.js 的完整内容复制进去,保存脚本。
- 打开或刷新 豆包,等待页面加载完成。
脚本的匹配范围是:
https://www.doubao.com/*
使用方法
- 进入包含图片内容的豆包对话页面。
- 页面右侧会出现“无水印素材”浮动按钮,按钮上的数字表示已识别的图片数量。
- 点击浮动按钮打开图片列表。
- 点击图片缩略图可以预览大图。
- 点击图片卡片右侧的下载图标可以下载单张图片。
- 勾选需要的图片后,点击“批量下载”。
- 使用“全选”或“取消”可以快速修改选择状态。
首次打开页面时,脚本需要等待页面数据返回并完成图片匹配。如果列表暂时为空,可以等待片刻,或重新打开素材列表。
当前页面过滤规则
脚本不会把所有曾经访问过的对话图片一直保留在列表中。它会根据当前页面中的图片元素建立索引,并将网络数据中找到的图片与当前页面进行匹配:
- 图片出现在当前页面后,才会加入素材列表。
- 切换豆包对话或路由变化时,脚本会清空旧列表并重新索引。
- 同一张图片只显示一次。
- 如果图片数据已经返回,但页面图片元素尚未出现,脚本会暂存数据,待页面出现对应图片后再加入列表。
- 只处理能够识别到原始图片地址的图片。
图片预览与下载
缩略图使用脚本识别到的原始图片地址加载。点击缩略图会打开预览层,点击关闭按钮、预览层空白区域或按 Esc 可以关闭预览。
下载时脚本优先使用用户脚本管理器提供的 GM_download 接口,并根据图片地址生成文件名,例如:
IMG_20260914_153000.PNG
脚本会根据地址中的扩展名识别 PNG、JPG、WEBP 和 HEIC。如果无法识别扩展名,默认使用 PNG。
浮动按钮
- 按住浮动按钮并拖动,可以调整按钮位置。
- 松开后位置会自动限制在浏览器窗口范围内。
- 位置保存在浏览器本地
localStorage 中,仅用于恢复按钮位置。
- 普通点击浮动按钮仍然会打开素材列表。
权限说明
脚本元数据中声明了以下权限:
| 权限 |
用途 |
GM_download |
使用用户脚本管理器下载图片,并设置文件名。 |
unsafeWindow |
访问豆包页面自身的 window 对象,以便拦截页面数据和网络请求。 |
@connect * |
允许 GM_download 访问图片实际所在的域名。 |
脚本还使用浏览器的 localStorage 保存浮动按钮位置。
当前限制
- 当前版本只处理图片,视频相关功能已经移除。
- 只有当前页面中能与网络数据匹配的图片才会显示。
- 如果图片数据没有包含可识别的原始地址,脚本不会将其加入列表。
- 图片下载是否弹出浏览器提示、是否自动保存,取决于用户脚本管理器和浏览器设置。
- 批量下载按列表顺序逐张进行,图片较多时需要等待一段时间。
- 页面结构或接口发生变化时,图片字段名称和匹配逻辑可能需要调整。
常见问题
打开列表后没有图片
先确认当前对话确实包含图片,然后等待页面数据加载完成。如果仍然为空,可以刷新豆包页面后重新打开列表。
列表中出现了其他对话的图片
刷新页面并等待当前对话完成加载。脚本会在路由变化时清理旧数据,并根据当前页面的图片元素重新匹配。
下载的仍然是带水印图片
脚本只能使用网络响应中实际提供的原始图片地址。如果当前图片没有返回可识别的原始地址,下载结果会退回到当前可用的图片地址。
浮动按钮挡住页面内容
拖动浮动按钮到合适位置即可。位置会被保存,之后打开页面会继续使用该位置。
批量下载没有反应
请先勾选至少一张图片。如果浏览器或用户脚本管理器限制了多个下载,还需要在对应设置中允许批量下载。
代码结构
主要模块及职责如下:
| 模块或函数 |
职责 |
imageStore |
保存图片列表、原始地址映射、待匹配图片和文件名缓存。 |
observeCurrentPageImages() |
监听当前页面图片元素的增加、删除和地址变化。 |
processImageItem() |
从响应对象中提取图片原始地址。 |
walkImagePayload() |
遍历 JSON 数据,查找图片对象。 |
installNetworkHooks() |
安装 JSON、Fetch 和 XHR 数据拦截。 |
downloadFile() |
下载单张图片。 |
batchDownload() |
按选择顺序逐张下载图片。 |
UI_CSS、UI_HTML |
定义界面样式和 HTML 模板。 |
createUI()、bindUIEvents() |
创建 Shadow DOM 界面并绑定交互。 |
installDownloadHooks() |
改写页面图片和链接的下载地址。 |
initializeEarly()、initializeDOM() |
分别完成早期拦截和页面界面初始化。 |
版本信息
- 版本:
1.6.0
- 脚本名:豆包图片去水印
- 许可证:MIT
- 处理范围:图片