豆包图片/视频一键无水印下载
原脚本地址:https://scriptcat.org/zh-CN/script-show-page/6329
📖 项目简介
这是一个针对豆包(Doubao)平台的Tampermonkey用户脚本,主要功能是一键下载无水印的图片和视频。当你在豆包中生成图片或视频后,脚本会在媒体卡片右上角自动添加下载按钮,点击即可获取无水印原文件。
✨ 主要功能
| 功能模块 |
说明 |
| 图片下载 |
识别豆包生成的图片,提取无水印原图URL,在图片卡片右上角添加“原图”下载按钮 |
| 视频下载 |
识别视频消息,通过豆包内部API获取无水印视频链接,并提供“视频”下载按钮 |
| 资源发现面板 |
悬浮面板显示已发现的图片/视频数量,支持拖拽、最小化、关闭 |
| 网络嗅探 |
自动拦截XHR/Fetch请求,从SSE流和JSON响应中提取媒体信息 |
🎯 使用场景
- 使用豆包AI生成图片后,需要保存无水印原图
- 使用豆包生成视频后,想要下载不带水印的版本
- 需要批量管理豆包生成的媒体资源
🛠️ 技术实现
核心工作流程
flowchart TD
A[打开豆包聊天页] --> B[拦截XHR/Fetch请求]
B --> C[提取messages/patch_op数据]
C --> D[解析出图片/视频URL]
D --> E[存入缓存Map]
E --> F[DOM观察器扫描页面]
F --> G[为媒体卡片添加下载按钮]
G --> H[点击按钮获取无水印链接]
H --> I[开始下载]
关键技术点
网络拦截
- 拦截
chain/single 接口的XHR请求
- 拦截
chat/completion 接口的Fetch请求
- 处理SSE(Server-Sent Events)流式响应,实时解析
patch_op 中的媒体数据
视频无水印获取(三重后备策略)
- 方法一:调用
/samantha/media/get_play_info 接口,将URL参数 lr=video_gen_watermark 替换为 lr=video_gen_no_watermark
- 方法二:通过
doubaoShareSave 消息获取分享ID,再调用 /creativity/share/get_video_share_info 接口获取无水印地址
- 方法三:失败时提示重试
图片无水印提取
- 从
creation_block.creations[].image.image_ori_raw.url 获取原图地址
- 使用文件key(
rc_gen_image/{key})作为缓存索引
- 将无水印URL与DOM中的
<img> 元素关联
UI注入
- 找到图片/视频的父容器,设置为相对定位
- 在卡片右上角添加半透明下载按钮(不遮挡原有底部按钮)
- 使用
MutationObserver 监听动态加载的新内容
资源管理
processedUrls:已处理的请求URL去重(Set,最多100条)
videoCache:messageId → videoId 映射
imageDataMap:文件key → 图片元数据
📦 安装方法
- 首先安装Tampermonkey或Violentmonkey浏览器扩展
- 点击原脚本地址页面的 “安装脚本” 按钮
- 在脚本管理页面确认安装
- 访问
https://www.doubao.com/* 即可自动生效
🖱️ 使用说明
图片下载
- 当豆包生成图片后,鼠标移动到图片卡片上
- 卡片右上角会出现 “原图” 按钮
- 点击即可下载无水印PNG图片
视频下载
- 当豆包生成视频后,鼠标移动到视频卡片上
- 卡片右上角会出现 “视频” 按钮
- 点击后脚本自动获取无水印链接并开始下载
悬浮面板
- 页面左下角有一个 “发现资源” 悬浮面板
- 显示当前页面已检测到的无水印图片和可下载视频数量
- 可以拖拽面板位置,点击
− 最小化,点击 ✕ 关闭
- 点击 “刷新” 按钮可重新扫描页面资源
⚠️ 注意事项
- 仅限豆包平台:脚本仅在
https://www.doubao.com/* 域名下生效
- 登录状态:需要保持豆包账号登录状态才能调用API
- API变化:豆包平台更新可能导致接口失效,请关注脚本更新
- 下载限制:部分视频可能因平台限制无法获取无水印版本,会提示重试
🔧 脚本配置
脚本开头的元数据可以修改:
// @name 豆包图片/视频一键无水印下载
// @match https://www.doubao.com/* // 匹配的网站
// @grant GM_download // 授权API
// @run-at document-start // 运行时机(尽早拦截)
📊 版本历史
| 版本 |
更新内容 |
| 1.0 |
初始发布,支持图片/视频无水印下载,按钮位于右下角 |
| 2.x |
优化代码结构,增强数据提取,按钮移至右上角 |
🐛 常见问题
Q:点击下载按钮没有反应?
A:请检查是否保持豆包登录状态,刷新页面后重试。
Q:刷新按钮检测不到图片?
A:脚本会自动拦截网络请求,如果仍无法检测,请尝试刷新整个页面。
Q:视频下载失败?
A:脚本会自动尝试三种获取方式,如果全部失败,可能是平台限制了该视频,可稍后重试。
Q:按钮遮挡了原有功能?
A:最新版本已将按钮移至右上角,不会遮挡原有的底部操作按钮。
📝 开发说明
如果你想修改或二次开发这个脚本,主要文件结构如下:
- 网络拦截层:
setupNetworkInterceptors() 函数
- 数据提取层:
extractImagesFromObject()、extractFromMessages() 等
- API调用层:
callGetPlayInfo()、callDoubaoShareSave() 等
- UI注入层:
injectImageButton()、injectVideoButton() 等
- 面板组件:
createFloatPanel() 悬浮面板
脚本内部使用 window.postMessage 在不同模块间通信,便于调试和扩展。
原脚本地址:https://scriptcat.org/zh-CN/script-show-page/6329