DeepSeek Desktop 桌面客户端开发文档
一、项目简介
DeepSeek Desktop 是一款基于 DeepSeek 网页免费版封装的 Windows 桌面客户端。它将网页版 DeepSeek 以独立桌面窗口的形式运行,不依赖浏览器,同时支持登录态持久化、窗口记忆、系统托盘等桌面级功能。
核心功能
- 独立桌面窗口运行 DeepSeek 网页版,不占用浏览器标签页
- 登录态/Cookie 持久化,关闭重开无需重复登录
- 窗口大小和位置自动记忆
- 系统托盘支持,可最小化到后台驻留
- 使用 DeepSeek 官方高清 logo 作为应用图标和托盘图标
- 单文件 exe,无需安装,双击即用
技术栈
| 组件 | 技术 | 说明 |
|---|---|---|
| GUI 框架 | pywebview 6.2 | 轻量级 WebView 封装库 |
| 渲染引擎 | Edge WebView2 | Windows 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,理由:
- 本地已有 Python 3.13 环境
- pywebview 基于系统 WebView2,无需额外打包浏览器内核
- 打包后体积仅 20MB 左右
- 开发速度快,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):
- 配置管理:窗口大小、位置保存在
~/.deepseek_desktop/config.json - 窗口创建:
webview.create_window()加载https://chat.deepseek.com - 系统托盘:独立线程运行 pystray,支持显示/隐藏/退出
- 事件处理:窗口关闭时保存配置
- 持久化:
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。
阶段六:用户测试与问题反馈
用户测试后反馈两个问题:
- 关闭应用后再打开会重置登录状态
- 应用图标分辨率低,希望使用 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)供托盘使用。
阶段九:重新打包与图标缓存问题
新问题:用户反馈图标没有更新。
排查过程:
- 验证 icon.ico 文件——确认包含全部 6 种尺寸
- 验证 exe 已重新打包——确认时间戳更新
- 定位原因——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 中 curl 是 Invoke-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 可从微软官网下载)
七、后续可扩展方向
- 全局快捷键:添加
Ctrl+Shift+D快速唤起/隐藏窗口 - 多账号切换:支持多个 DeepSeek 账号的配置文件切换
- 始终置顶:窗口置顶功能,方便边写代码边提问
- 自定义 User-Agent:模拟移动端获取不同界面
- 页面注入 CSS/JS:自定义网页样式或添加辅助功能
- 自动更新:集成版本检查和自动更新机制
- 离线提示:网络断开时显示友好的离线页面