DeepSeek Desktop 桌面客户端开发文档

一、项目简介

DeepSeek Desktop 是一款基于 DeepSeek 网页免费版封装的 Windows 桌面客户端。它将网页版 DeepSeek 以独立桌面窗口的形式运行,不依赖浏览器,同时支持登录态持久化、窗口记忆、系统托盘等桌面级功能。

核心功能

  • 独立桌面窗口运行 DeepSeek 网页版,不占用浏览器标签页
  • 登录态/Cookie 持久化,关闭重开无需重复登录
  • 窗口大小和位置自动记忆
  • 系统托盘支持,可最小化到后台驻留
  • 使用 DeepSeek 官方高清 logo 作为应用图标和托盘图标
  • 单文件 exe,无需安装,双击即用

技术栈

组件技术说明
GUI 框架pywebview 6.2轻量级 WebView 封装库
渲染引擎Edge WebView2Windows 11 自带,基于 Chromium
系统托盘pystray跨平台托盘图标库
图像处理Pillow 12.3图标生成与处理
打包工具PyInstaller 6.22打包为单文件 exe
开发语言Python 3.13

最终产物

  • 单文件 DeepSeek.exe,约 20.5 MB
  • 无需安装,双击即可运行
  • 配置和数据保存在 ~/.deepseek_desktop/

二、开发全流程

阶段一:环境准备与技术选型

需求分析:用户需要一个 DeepSeek 的 Windows 桌面端 exe,基于网页免费版。本质是将网页封装为桌面应用。

方案对比

方案优点缺点结论
Electron生态成熟,功能丰富包体积大(100MB+),内存占用高不选
Tauri体积小,性能好需要 Rust 环境,学习成本高不选
Python + pywebview轻量,Python 环境现成,WebView2 系统自带功能相对基础选用
C# + WPF原生体验好开发成本高不选

最终选择:Python + pywebview + Edge WebView2,理由:

  1. 本地已有 Python 3.13 环境
  2. pywebview 基于系统 WebView2,无需额外打包浏览器内核
  3. 打包后体积仅 20MB 左右
  4. 开发速度快,API 简洁

环境检查

python --version   # Python 3.13.13
node --version     # v20.20.2(未使用)

阶段二:项目初始化与核心代码编写

项目结构

deepseek-desktop/
├── main.py           # 主程序
├── generate_icon.py  # 图标生成脚本
├── requirements.txt  # 依赖清单
├── build.bat         # 一键打包脚本
├── README.md         # 说明文档
└── dist/
    └── DeepSeek.exe  # 打包产物

核心代码逻辑(main.py):

  1. 配置管理:窗口大小、位置保存在 ~/.deepseek_desktop/config.json
  2. 窗口创建webview.create_window() 加载 https://chat.deepseek.com
  3. 系统托盘:独立线程运行 pystray,支持显示/隐藏/退出
  4. 事件处理:窗口关闭时保存配置
  5. 持久化private_mode=False + storage_path 实现登录态保存

阶段三:依赖安装

pip install pywebview pystray Pillow pyinstaller

遇到的小插曲:pip install 过程中 PowerShell 将 pip 的 stderr 输出(进度条、notice)误判为命令失败,实际依赖已成功安装。通过 python -c "import xxx" 验证确认。

阶段四:图标生成(初版)

初版使用 Pillow 代码手绘图标:

  • 蓝紫色渐变圆形背景
  • 白色字母 "D"
  • 生成 16/32/48/64/128/256 多尺寸 ico

阶段五:首次打包

pyinstaller --onefile --windowed --name "DeepSeek" --icon "icon.ico" \
    --collect-all pywebview --collect-all pythonnet --collect-all pystray \
    --hidden-import "webview.platforms.winforms" main.py

打包参数说明:

  • --onefile:单文件输出
  • --windowed:无控制台窗口
  • --collect-all:收集 pywebview/pythonnet/pystray 的所有资源
  • --hidden-import:显式引入 WebView2 平台模块

首次打包结果:成功,20.42 MB。

阶段六:用户测试与问题反馈

用户测试后反馈两个问题:

  1. 关闭应用后再打开会重置登录状态
  2. 应用图标分辨率低,希望使用 DeepSeek 高清 logo

阶段七:问题修复——登录态持久化

根因分析:查看 webview.start() 函数签名,发现默认参数 private_mode=True,即隐身模式,每次启动都是全新的浏览环境,Cookie 和 LocalStorage 不保存。

修复方案

webview.start(
    debug=False,
    private_mode=False,              # 关闭隐身模式
    storage_path=WEBVIEW_DATA_DIR,   # 指定持久化目录
)

数据目录:~/.deepseek_desktop/webview_data/

阶段八:问题修复——高清图标

图标获取:通过图片搜索找到 DeepSeek 官方 4096×4102 高清 logo,下载到本地。

图标处理

  • HD logo 是横版(鲸鱼 + 文字),不适合直接做方形图标
  • 编写自动裁剪算法:通过 alpha 通道检测鲸鱼与文字之间的间隙,裁剪出左侧鲸鱼部分
  • 裁剪结果:906×906 的鲸鱼图标,透明背景

生成多尺寸 ICO

base_img = icon_source.resize((256, 256), Image.LANCZOS)
base_img.save("icon.ico", format="ICO", sizes=[(16,16),(32,32),(48,48),(64,64),(128,128),(256,256)])

同时生成 tray_icon.png(256×256)供托盘使用。

阶段九:重新打包与图标缓存问题

新问题:用户反馈图标没有更新。

排查过程

  1. 验证 icon.ico 文件——确认包含全部 6 种尺寸
  2. 验证 exe 已重新打包——确认时间戳更新
  3. 定位原因——Windows 图标缓存机制:同名 exe 替换后,系统仍显示缓存的旧图标

解决方案

  • 将新 exe 复制为不同文件名(DeepSeek-新版.exe),系统会重新读取图标
  • 提供图标缓存刷新方法:Win+R → 输入 ie4uinit.exe -show → 回车

三、遇到的问题与解决方法汇总

问题 1:pip install 报失败但实际成功

现象pip install 命令返回 exit code 1,提示错误。

原因:PowerShell 将 pip 输出到 stderr 的进度条和版本升级 notice 误判为错误。

解决:忽略 exit code,通过 python -c "import xxx" 验证包是否实际安装成功。

问题 2:PowerShell 不支持 &&curl -L

现象

  • cmd1 && cmd2 语法报错
  • curl -L -o file url 报参数错误

原因:PowerShell 中 curlInvoke-WebRequest 的别名,不支持 curl 的参数;&& 在旧版 PowerShell 中不支持。

解决

  • ; 替代 &&
  • curl.exe 替代 curl 调用真正的 curl

问题 3:关闭应用后登录状态丢失

现象:每次打开都需要重新登录 DeepSeek。

原因:pywebview 默认 private_mode=True(隐身模式),不持久化 Cookie。

解决:设置 private_mode=False 并指定 storage_path 为固定目录。

问题 4:应用图标分辨率低

现象:任务栏和桌面图标模糊,是手绘的"D"字母。

原因:初版用代码生成图标,质量有限。

解决:下载 DeepSeek 官方 4096px 高清 logo,自动裁剪鲸鱼图标部分,生成多尺寸高质量 ICO。

问题 5:ICO 文件看似只有一种尺寸

现象:用 Image.seek() 遍历 ICO 只看到 1 帧。

原因:Pillow 读取 ICO 时 seek 只能看到当前帧,但 ico.info['sizes'] 包含所有尺寸信息。

解决:用 ico.info.get('sizes') 验证,确认包含全部 6 种尺寸。

问题 6:替换 exe 后图标不更新

现象:重新打包替换同名 exe 后,Windows 仍显示旧图标。

原因:Windows 图标缓存机制,按文件路径缓存图标,同名文件替换不触发刷新。

解决

  • 短期:使用新文件名,系统会重新读取
  • 长期:运行 ie4uinit.exe -show 刷新图标缓存,或删除 %localappdata%\IconCache.db 后重启资源管理器

问题 7:PyInstaller 打包 pywebview 缺少模块

现象:打包后运行可能报模块找不到。

原因:pywebview 的平台相关模块(WinForms/WebView2)是动态加载的,PyInstaller 无法自动检测。

解决:添加 --collect-all pywebview --collect-all pythonnet --hidden-import "webview.platforms.winforms" 参数。


四、关键代码说明

4.1 登录态持久化

CONFIG_DIR = os.path.join(os.path.expanduser("~"), ".deepseek_desktop")
WEBVIEW_DATA_DIR = os.path.join(CONFIG_DIR, "webview_data")

# 启动时
webview.start(
    private_mode=False,            # 关键:关闭隐身模式
    storage_path=WEBVIEW_DATA_DIR, # 关键:指定数据持久化目录
)

4.2 窗口配置记忆

def load_config():
    # 从 ~/.deepseek_desktop/config.json 读取窗口大小和位置

def save_config():
    # 窗口关闭时保存当前窗口状态

window.events.closed += on_closed  # 注册关闭事件

4.3 系统托盘

def setup_tray():
    # 在独立线程中运行 pystray
    # 菜单项:显示窗口 / 隐藏窗口 / 退出
    tray_thread = threading.Thread(target=setup_tray, daemon=True)
    tray_thread.start()

4.4 高清图标裁剪算法

def crop_whale_icon(hd_logo_path):
    img = Image.open(hd_logo_path).convert("RGBA")
    alpha = img.split()[3]
    bbox = alpha.getbbox()  # 非透明区域边界

    # 分析每列的 alpha 总和,找到鲸鱼与文字之间的间隙
    col_alpha = [sum(alpha.getpixel((x, y)) for y in range(height)) for x in range(width)]

    # 在内容区域 15%~50% 范围内寻找低 alpha 列(间隙)
    for x in range(search_start, search_end):
        if col_alpha[x] < threshold:
            whale_right = x
            break

    # 裁剪鲸鱼部分并居中到方形画布

4.5 PyInstaller 打包资源文件

pyinstaller --onefile --windowed \
    --name "DeepSeek" \
    --icon "icon.ico" \
    --add-data "tray_icon.png;." \    # 打包托盘图标
    --add-data "icon.ico;." \         # 打包 ico 文件
    --collect-all pywebview \
    --collect-all pythonnet \
    --collect-all pystray \
    --hidden-import "webview.platforms.winforms" \
    main.py

运行时通过 sys._MEIPASS 获取打包后的资源路径:

def get_resource_path(relative_path):
    if getattr(sys, "_MEIPASS", None):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.dirname(os.path.abspath(__file__)), relative_path)

五、项目结构与文件说明

deepseek-desktop/
├── main.py                 # 主程序(窗口、托盘、持久化)
├── generate_icon.py        # 图标生成脚本(从 HD logo 裁剪并生成 ICO)
├── requirements.txt        # Python 依赖清单
├── build.bat               # 一键打包脚本(虚拟环境+依赖+打包)
├── README.md               # 用户使用说明
├── icon.ico                # 应用图标(6 种尺寸)
├── tray_icon.png           # 托盘图标(256x256)
├── deepseek_logo_hd.png    # DeepSeek 官方高清 logo(4096px)
├── deepseek_logo_circle.png # DeepSeek 圆形 logo(600px)
└── dist/
    └── DeepSeek.exe        # 最终可执行文件

运行时数据目录

~/.deepseek_desktop/
├── config.json       # 窗口配置(大小、位置)
└── webview_data/     # WebView2 持久化数据(Cookie、登录态、缓存)

六、使用说明

直接运行

双击 DeepSeek.exe 即可启动,首次使用需登录 DeepSeek 账号。

从源码运行

pip install -r requirements.txt
python main.py

重新打包

# 安装依赖
pip install -r requirements.txt

# 生成图标(如已修改 logo)
python generate_icon.py

# 打包
pyinstaller --onefile --windowed --name "DeepSeek" --icon "icon.ico" \
    --add-data "tray_icon.png;." --add-data "icon.ico;." \
    --collect-all pywebview --collect-all pythonnet --collect-all pystray \
    --hidden-import "webview.platforms.winforms" main.py

或直接双击 build.bat

系统要求

  • Windows 10/11
  • WebView2 运行时(Windows 11 自带,Windows 10 可从微软官网下载)

七、后续可扩展方向

  1. 全局快捷键:添加 Ctrl+Shift+D 快速唤起/隐藏窗口
  2. 多账号切换:支持多个 DeepSeek 账号的配置文件切换
  3. 始终置顶:窗口置顶功能,方便边写代码边提问
  4. 自定义 User-Agent:模拟移动端获取不同界面
  5. 页面注入 CSS/JS:自定义网页样式或添加辅助功能
  6. 自动更新:集成版本检查和自动更新机制
  7. 离线提示:网络断开时显示友好的离线页面
最后修改:2026 年 08 月 23 日
如果觉得我的文章对你有用,请随意赞赏