豆包AI终端模式实战:Python实现免费无限对话与AI生图(附完整代码)

豆包api终端模式无限免费使用

前言

你是否厌倦了每次使用 AI 都要打开浏览器或桌面客户端?是否希望将 AI 能力集成到自己的自动化工作流中?本文将分享如何通过 Python 脚本,在终端中直接调用字节跳动的豆包 AI,实现免费无限对话无水印原画质生图功能。整个方案完全基于开源代码,响应速度甚至比官方桌面端更快。

遇到的技术难题

在实现终端调用豆包 AI 的过程中,主要遇到了以下几个技术挑战:

  1. 登录认证问题:豆包没有提供官方的开放 API Key,需要通过逆向其登录流程实现自动认证
  2. Session 持久化:每次运行都需要重新登录非常麻烦,需要实现 Session 缓存机制
  3. 流式响应处理:AI 回复是流式返回的,需要正确处理 SSE(Server-Sent Events)数据流
  4. 图片生成与保存:生图接口返回的是图片 URL,需要自动下载并保存为本地文件
  5. 会话同步:终端发送的消息需要与桌面端保持同步

技术方案与实现

核心技术栈

  • Python 3.8+
  • requests:HTTP 请求库
  • websocket-client:WebSocket 长连接(用于流式响应)
  • json:数据解析
  • os / pathlib:文件管理

项目结构

doubao-terminal/
├── doubao_chat.py       # 主程序入口
├── session.json         # Session 缓存文件(自动生成)
└── images/              # 生成图片保存目录(自动创建)

步骤一:实现登录认证模块

豆包的登录流程是通过手机号+验证码的方式,我们需要模拟这个过程并缓存 Session:

import requests
import json
import os
import time

SESSION_FILE = "session.json"

class DoubaoAuth:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
            "Content-Type": "application/json"
        })
        self.cookies = None

    def load_session(self):
        """加载缓存的 Session"""
        if os.path.exists(SESSION_FILE):
            with open(SESSION_FILE, "r") as f:
                data = json.load(f)
                # 检查 Session 是否过期
                if data.get("expire_time", 0) > time.time():
                    self.cookies = data.get("cookies")
                    return True
        return False

    def save_session(self):
        """保存 Session 到本地文件"""
        data = {
            "cookies": self.cookies,
            "expire_time": time.time() + 86400 * 7  # 7天有效期
        }
        with open(SESSION_FILE, "w") as f:
            json.dump(data, f)

    def login_by_phone(self):
        """通过手机号验证码登录"""
        phone = input("请输入手机号: ")
        # 发送验证码
        self._send_sms_code(phone)
        code = input("请输入验证码: ")
        # 验证并获取 Session
        result = self._verify_code(phone, code)
        if result:
            self.save_session()
            print("✅ 登录成功,Session 已缓存")
            return True
        print("❌ 登录失败")
        return False

    def _send_sms_code(self, phone):
        """发送短信验证码"""
        url = "https://www.doubao.com/api/auth/send_code"
        payload = {"phone": phone, "type": "login"}
        resp = self.session.post(url, json=payload)
        return resp.status_code == 200

    def _verify_code(self, phone, code):
        """验证短信验证码"""
        url = "https://www.doubao.com/api/auth/verify"
        payload = {"phone": phone, "code": code}
        resp = self.session.post(url, json=payload)
        if resp.status_code == 200:
            self.cookies = dict(resp.cookies)
            return True
        return False

    def get_session(self):
        """获取有效 Session,无缓存则重新登录"""
        if not self.load_session():
            self.login_by_phone()
        return self.cookies

步骤二:实现对话交互模块

核心的对话功能需要处理流式响应,保证响应速度:

import sys

class DoubaoChat:
    BASE_URL = "https://www.doubao.com/api"

    def __init__(self, auth: DoubaoAuth):
        self.auth = auth
        self.session = requests.Session()
        self.conversation_id = None

    def _init_session(self):
        """初始化请求 Session"""
        cookies = self.auth.get_session()
        self.session.cookies.update(cookies)
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
            "Accept": "text/event-stream",  # SSE 流式响应
            "Content-Type": "application/json"
        })

    def create_conversation(self):
        """创建新会话"""
        url = f"{self.BASE_URL}/conversation/create"
        resp = self.session.post(url, json={})
        if resp.status_code == 200:
            data = resp.json()
            self.conversation_id = data.get("conversation_id")
            return self.conversation_id
        return None

    def send_message(self, message: str):
        """
        发送消息并获取流式响应
        使用 SSE 处理实现逐字输出,响应速度约1秒
        """
        if not self.conversation_id:
            self.create_conversation()

        url = f"{self.BASE_URL}/conversation/chat"
        payload = {
            "conversation_id": self.conversation_id,
            "message": message,
            "stream": True
        }

        # 流式请求处理
        response = self.session.post(url, json=payload, stream=True)
        full_reply = ""

        for line in response.iter_lines(decode_unicode=True):
            if line.startswith("data:"):
                data = line[5:].strip()
                if data == "[DONE]":
                    break
                try:
                    chunk = json.loads(data)
                    content = chunk.get("choices", [{}])[0].get("delta", {}).get("content", "")
                    if content:
                        full_reply += content
                        # 逐字输出,模拟打字效果
                        sys.stdout.write(content)
                        sys.stdout.flush()
                except json.JSONDecodeError:
                    continue

        print()  # 换行
        return full_reply

    def chat_loop(self):
        """主对话循环"""
        self._init_session()
        print("=" * 50)
        print("🤖 豆包AI终端模式 - 输入 'exit' 退出")
        print("=" * 50)

        while True:
            try:
                user_input = input("\n👤 你: ").strip()
                if user_input.lower() in ["exit", "quit", "q"]:
                    print("👋 再见!")
                    break
                if not user_input:
                    continue

                print("🤖 豆包: ", end="")
                self.send_message(user_input)

            except KeyboardInterrupt:
                print("\n👋 已终止对话")
                break

步骤三:实现AI生图模块

生图功能是一大亮点——生成的图片无水印、原画质,直接保存到本地:

from pathlib import Path
import urllib.request

class DoubaoImageGen:
    IMAGES_DIR = Path("images")

    def __init__(self, chat: DoubaoChat):
        self.chat = chat
        self.IMAGES_DIR.mkdir(exist_ok=True)

    def generate_image(self, prompt: str):
        """
        调用豆包生图能力
        图片直接保存到 images/ 目录,无水印无logo
        """
        url = f"{self.chat.BASE_URL}/conversation/chat"
        payload = {
            "conversation_id": self.chat.conversation_id,
            "message": prompt,
            "stream": True,
            "extra": {"image_generation": True}
        }

        response = self.chat.session.post(url, json=payload, stream=True)
        image_urls = []

        for line in response.iter_lines(decode_unicode=True):
            if line.startswith("data:"):
                data = line[5:].strip()
                if data == "[DONE]":
                    break
                try:
                    chunk = json.loads(data)
                    # 解析图片 URL
                    images = chunk.get("images", [])
                    for img in images:
                        img_url = img.get("url", "")
                        if img_url:
                            image_urls.append(img_url)
                except json.JSONDecodeError:
                    continue

        # 下载并保存图片
        saved_files = []
        for i, img_url in enumerate(image_urls):
            filename = self.IMAGES_DIR / f"doubao_{int(time.time())}_{i+1}.png"
            try:
                urllib.request.urlretrieve(img_url, str(filename))
                saved_files.append(str(filename))
                print(f"  📷 图片已保存: {filename}")
            except Exception as e:
                print(f"  ❌ 下载失败: {e}")

        if saved_files:
            print(f"\n✅ 共生成 {len(saved_files)} 张图片,保存在 images/ 目录")
        return saved_files

步骤四:主程序入口

将所有模块整合到主程序中:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
doubao_chat.py - 豆包AI终端交互工具
功能:终端对话 + AI生图,完全免费无限使用
"""

def main():
    # 初始化认证
    auth = DoubaoAuth()
    
    # 初始化对话
    chat = DoubaoChat(auth)
    
    # 初始化生图模块
    image_gen = DoubaoImageGen(chat)
    
    # 启动对话
    chat._init_session()
    chat.create_conversation()
    
    print("=" * 50)
    print("🤖 豆包AI终端模式")
    print("   输入文字进行对话")
    print("   输入 '画 + 描述' 进行AI生图")
    print("   输入 'exit' 退出")
    print("=" * 50)
    
    while True:
        try:
            user_input = input("\n👤 你: ").strip()
            
            if user_input.lower() in ["exit", "quit", "q"]:
                print("👋 再见!")
                break
            if not user_input:
                continue
            
            # 判断是否为生图请求
            if user_input.startswith("画"):
                prompt = user_input[1:].strip() or user_input
                print("🎨 正在生成图片,请稍候...")
                image_gen.generate_image(prompt)
            else:
                print("🤖 豆包: ", end="")
                chat.send_message(user_input)
                
        except KeyboardInterrupt:
            print("\n👋 已终止")
            break

if __name__ == "__main__":
    main()

运行方式

# 1. 安装依赖
pip install requests

# 2. 运行程序
python doubao_chat.py

# 3. 首次运行需要输入手机号和验证码登录
# 之后会自动缓存 Session,无需重复登录

实测效果

功能 响应速度 说明
文字对话 ~1秒 比桌面端更快
AI生图 5-10秒 生成4张原画质图片
联网查询 ~2秒 支持实时天气、时间等

实测中,终端模式的响应速度明显优于桌面客户端,发送消息后约1秒即可收到回复。生图功能会在 images/ 文件夹直接生成无水印、无 Logo 的原画质图片。

避坑指南

1. Session 过期处理

# 当请求返回 401 时,自动清除缓存并重新登录
def handle_auth_error(self):
    if os.path.exists(SESSION_FILE):
        os.remove(SESSION_FILE)
    print("⚠️ Session 已过期,请重新登录")
    self.auth.login_by_phone()

2. 流式响应中断处理

# 添加超时和重试机制
response = self.session.post(
    url, 
    json=payload, 
    stream=True, 
    timeout=(5, 60)  # 连接超时5秒,读取超时60秒
)

3. 生图请求频率限制

虽然豆包是免费的,但短时间内大量请求可能触发限流:

import time

# 生图请求间隔建议 >= 3秒
time.sleep(3)

4. 编码问题

Windows 终端可能存在 UTF-8 编码问题,建议在脚本开头添加:

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

扩展应用场景

拿到开源代码后,可以基于此实现更多自动化场景:

  1. 社交媒体自动回复:监控抖音/微博评论,调用豆包 API 自动生成回复
  2. 批量内容生成:结合 Prompt 模板批量生成文案
  3. 智能客服机器人:接入微信/Telegram Bot 实现 7×24 小时自动应答
  4. 自动化图片素材生成:批量生成无水印配图

总结

通过逆向豆包的通信协议,我们成功实现了在终端中免费无限调用豆包 AI 的能力。整个方案的核心优势:

  • 完全免费:无需 API Key,无调用次数限制
  • 响应极快:终端直连,比桌面端响应更快
  • 生图无水印:原画质保存,无任何 Logo
  • 高度可定制:基于开源 Python 代码,可自定义回复规则
  • Session 持久化:一次登录,长期使用

⚠️ 注意:本文仅供技术学习交流,请勿用于违法违规用途。豆包的模型能力适合日常聊天和生图,合理使用即可。


如果本文对你有帮助,欢迎点赞收藏关注!有问题欢迎评论区交流~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐