豆包生图有水印?开源插件 + Python 脚本帮你一键搞定

205 阅读7分钟

开源|两种方案教你获取豆包 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 这个字段,它包含的就是我们想要的无水印高清原图。

核心思路

既然知道了数据在哪里,接下来就是想办法拿到它:

  1. 浏览器插件方案:通过注入脚本拦截 fetchXMLHttpRequest,从 API 响应中提取 image_ori_raw 的 URL
  2. 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 生成的图片时,右上角会出现绿色的「下载无水印原图」按钮:

iShot_2026-01-02_20.45.21.png

点击按钮即可下载 2048x2048 的无水印高清原图。


🐍 方案二:Python 脚本(分享链接提取)

iShot_2026-01-02_20.45.58.png

如果你想从别人分享的豆包链接中提取原图,或者需要批量处理,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

效果展示

运行脚本后,会自动提取分享链接中的所有原图并下载:

Python 脚本运行效果截图转存失败,建议直接上传图片文件

[*] 正在获取分享页面: 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 一起完善这个项目

相关链接

技术交流欢迎加微信:yhw734058719