开源|两种方案教你获取豆包 AI 生图的无水印原图(浏览器插件 + Python 脚本)
本文介绍一个开源项目,通过逆向分析豆包 API 响应,实现一键获取 AI 生成图片的 2048x2048 无水印高清原图。提供浏览器插件和 Python 脚本两种方案,满足不同使用场景。
🎯 痛点:豆包生图好用,但下载有水印
相信不少开发者都用过字节跳动的「豆包」AI 助手来生成图片。不得不说,豆包的图片生成能力确实强悍,画质细腻、风格多样。
但有一个让人头疼的问题:下载的图片都带有水印。
官方提供的下载功能,图片右下角会有明显的「豆包」水印标识。对于想要将图片用于设计素材、社交媒体配图、或者二次创作的用户来说,这个水印就很影响体验了。
作为一名开发者,遇到问题当然是想办法解决。于是我花了点时间逆向分析了豆包的前端代码和 API 响应,发现了一个有趣的事实:
豆包的 API 响应中其实包含了无水印原图的 URL,只是前端没有暴露给用户。
基于这个发现,我开发了一个开源工具,提供两种方案来获取无水印原图:
- 浏览器插件:实时拦截,一键下载
- Python 脚本:通过分享链接批量提取
项目已开源:GitHub - doubao-download
🔍 技术原理:逆向分析豆包 API
在动手写代码之前,我们先来看看豆包是怎么处理图片的。
抓包分析
打开浏览器开发者工具,在豆包生成图片时观察 Network 面板,可以发现图片生成完成后会有一个 API 响应,其中包含了多个图片 URL:
{
"image_thumb": {
"url": "https://xxx/preview.jpeg~tplv-xxx-downsize_watermark_1_5.png",
"width": 384,
"height": 384
},
"image_ori": {
"url": "https://xxx/xxx.jpeg~tplv-xxx-image_dld_watermark_1_5.png",
"width": 2048,
"height": 2048
},
"image_ori_raw": {
"url": "https://xxx/xxx.jpeg~tplv-xxx-image_raw.png",
"width": 2048,
"height": 2048
}
}
注意看 URL 中的参数:
downsize_watermark- 缩略图 + 水印image_dld_watermark- 原图 + 水印image_raw- 原图,无水印!
关键就在 image_ori_raw 这个字段,它包含的就是我们想要的无水印高清原图。
核心思路
既然知道了数据在哪里,接下来就是想办法拿到它:
- 浏览器插件方案:通过注入脚本拦截
fetch和XMLHttpRequest,从 API 响应中提取image_ori_raw的 URL - Python 脚本方案:访问分享页面,从 SSR 渲染的 HTML 中解析出图片数据
📦 方案一:浏览器插件(实时下载)
这是最方便的使用方式,安装插件后在豆包网站预览图片时会自动出现下载按钮。
核心代码解析
1. 注入脚本拦截网络请求(inject.js)
// 重写 fetch 方法拦截响应
window.fetch = async function(...args) {
const response = await originalFetch(...args);
const url = typeof args[0] === 'string' ? args[0] : args[0]?.url || '';
// 检查是否是豆包的图片生成 API
if (url.includes('/samantha/chat/completion')) {
const clonedResponse = response.clone();
clonedResponse.text().then(text => {
// 从响应中提取 image_ori_raw URL
const regex = /"image_ori_raw"\s*:\s*\{\s*"url"\s*:\s*"([^"]+)"/g;
let match;
while ((match = regex.exec(text)) !== null) {
// 发送消息给 content script
window.postMessage({
type: 'DOUBAO_IMAGE_URL',
payload: match[1]
}, '*');
}
});
}
return response;
};
2. 内容脚本添加下载按钮(content.js)
// 监听来自注入脚本的消息
window.addEventListener('message', function(event) {
if (event.data.type === 'DOUBAO_IMAGE_URL') {
const imageId = extractImageId(event.data.payload);
// 存储 URL,建立图片 ID 与原图 URL 的映射
window.doubaoImageMap.set(imageId, event.data.payload);
// 尝试添加下载按钮
tryAddButton();
}
});
// 创建下载按钮
function createDownloadButton(container) {
const btn = document.createElement('button');
btn.textContent = '下载无水印原图';
btn.onclick = () => {
const url = getCurrentOriginalUrl();
chrome.runtime.sendMessage({
action: 'download',
url: url,
filename: `doubao_${imageId}.png`
});
};
container.appendChild(btn);
}
安装使用
# 1. 克隆仓库
git clone https://github.com/yinhw0210/doubao-download.git
# 2. 打开 Chrome 扩展管理页面
# 地址栏输入:chrome://extensions/
# 3. 开启「开发者模式」
# 4. 点击「加载已解压的扩展程序」,选择 browser_extension 文件夹
效果展示
安装插件后,在豆包网站预览 AI 生成的图片时,右上角会出现绿色的「下载无水印原图」按钮:
点击按钮即可下载 2048x2048 的无水印高清原图。
🐍 方案二:Python 脚本(分享链接提取)
如果你想从别人分享的豆包链接中提取原图,或者需要批量处理,Python 脚本是更好的选择。
技术栈
- Python 3.8+
- Selenium:模拟浏览器访问,绕过防盗链
- BeautifulSoup:解析 HTML
- webdriver-manager:自动管理 ChromeDriver
核心代码解析
1. 从页面 HTML 提取图片 URL
def _extract_images_from_html(self, html: str) -> List[Dict]:
"""从 HTML 中提取图片信息"""
images = []
seen_ids = set()
# 预处理 HTML,统一转义字符
normalized = html.replace('\\u002F', '/').replace('\\u0026', '&')
# 匹配 image_ori_raw URL(包含 image_raw 的是无水印原图)
pattern = r'image_ori_raw.*?url.*?"(https[^"]+image_raw[^"]+)"'
matches = re.findall(pattern, normalized)
for url in matches:
# 提取图片 ID 用于去重
id_match = re.search(r'rc_gen_image/([a-f0-9]{32})', url)
image_id = id_match.group(1) if id_match else None
if image_id and image_id not in seen_ids:
seen_ids.add(image_id)
images.append({
'id': image_id,
'original_url': self._decode_url(url),
'width': 2048,
'height': 2048,
})
return images
2. 使用浏览器 fetch API 下载图片(绕过防盗链)
def download_image(self, url: str, filename: str) -> bool:
"""使用 Selenium 执行 JS 下载图片"""
# 直接用 requests 下载会被 403,需要借助浏览器环境
result = self.driver.execute_async_script('''
var callback = arguments[arguments.length - 1];
var url = arguments[0];
fetch(url)
.then(function(response) {
return response.blob();
})
.then(function(blob) {
var reader = new FileReader();
reader.onloadend = function() {
callback(reader.result); // 返回 base64 数据
};
reader.readAsDataURL(blob);
})
.catch(function(e) {
callback('ERROR:' + e.message);
});
''', url)
if result and not result.startswith('ERROR:'):
# 解析 base64 并保存
base64_data = result.split(',')[1]
image_data = base64.b64decode(base64_data)
with open(save_path, 'wb') as f:
f.write(image_data)
return True
return False
安装使用
# 1. 进入脚本目录
cd python_scripts
# 2. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 运行脚本
python extract_with_selenium.py https://www.doubao.com/thread/xxxxx --download
效果展示
运行脚本后,会自动提取分享链接中的所有原图并下载:
[*] 正在获取分享页面: https://www.doubao.com/thread/a77438730f565
[+] 提取到 4 张图片
============================================================
共找到 4 张无水印原图:
============================================================
[图片 1]
ID: 483a8d45a6ad4f928230f1a1e3459078
尺寸: 2048x2048
原图URL: https://p3-flow-imagex-sign.byteimg.com/...
[*] 开始下载图片到: downloads/
[1/4] 下载: doubao_483a8d45a6ad4f928230f1a1e3459078.png
✓ 保存成功
...
[+] 下载完成!
⚖️ 两种方案对比
| 特性 | 浏览器插件 | Python 脚本 |
|---|---|---|
| 使用场景 | 实时浏览下载 | 分享链接批量提取 |
| 安装难度 | ⭐ 简单 | ⭐⭐ 需要 Python 环境 |
| 依赖 | Chrome/Edge 浏览器 | Python + Chrome |
| 是否需要登录 | 需要(在豆包网站操作) | 不需要 |
| 批量处理 | 不支持 | 支持 |
| 适合人群 | 普通用户 | 开发者/有批量需求 |
建议:
- 日常使用推荐浏览器插件,安装简单,一键下载
- 需要从分享链接提取或批量处理时使用 Python 脚本
🔐 隐私与安全
这个项目完全在本地运行,不会上传任何数据:
- ✅ 不收集用户信息
- ✅ 不读取账号或聊天内容
- ✅ 不与第三方服务器通信
- ✅ 代码完全开源,可自行审计
🚀 未来规划
- 支持批量下载当前会话的所有图片
- 添加图片压缩/格式转换功能
- 支持更多 AI 图片生成平台
- 开发 Tampermonkey 油猴脚本版本
📝 写在最后
这个项目源于一个简单的需求:我只是想要一张没有水印的图片。
通过逆向分析,我发现豆包的 API 设计其实已经提供了无水印原图,只是前端没有暴露出来。作为开发者,我们有能力通过技术手段来改善自己的使用体验。
当然,这个工具仅供学习和个人使用,请尊重原创内容的版权,不要用于商业用途或侵权行为。
如果这个项目对你有帮助,欢迎:
- ⭐ 给仓库点个 Star:GitHub - doubao-download
- 💬 在评论区分享你的使用场景
- 🐛 提交 Issue 反馈问题或建议
- 🔀 提交 PR 一起完善这个项目
相关链接:
- GitHub 仓库:github.com/yinhw0210/d…
- 作者博客:www.solitude.top/
技术交流欢迎加微信:yhw734058719