博客

WhatsApp 的 Linux 桌面版

常用网站 · · 约 6 分钟

WhatsApp 的下载页提供 Mac 和 Windows 版本,没有列出 Linux,所以 Linux 上通常的做法是在浏览器标签页里用 WhatsApp Web。Pake CLI 可以把 web.whatsapp.com 包成一个独立窗口,带托盘图标和桌面提醒,构建只要一条命令,然后用二维码和手机关联。它和浏览器里是同一个网页版客户端,只是跑在系统的 WebKitGTK 上,所以依赖它之前要先测一遍。

WhatsApp 官方提供什么

WhatsApp 的桌面版下载页上,WhatsApp Desktop 标注支持 64 位 Windows 10 1903 或更新版本,以及 macOS 11 或更新版本,其他系统页面都指向浏览器里的 WhatsApp Web,所以 Linux 上的入口是 web.whatsapp.com。构建前再看一眼下载页,以防它有变化。

WhatsApp Web 是和手机关联,不是取代手机。你打开网站,用手机上的已关联设备界面扫二维码,手机上的账号就出现在浏览器里。浏览器里能用,不代表在 Pake 内嵌的 WebKitGTK 里表现也一样,依赖这个应用之前,先确认需要的功能能用。

什么时候值得用 Pake 窗口

浏览器标签页够用,直到你希望 WhatsApp 像个应用:启动器里有自己的入口,切换窗口时有自己的位置,有托盘图标,窗口关着也能收到提醒,Pake 能给你这些。它不会添加 WhatsApp 自家应用才有的东西,它是网页版客户端的 web view,只有 Mac 和 Windows 应用才有的功能依然用不了,网页版没有的功能这里也没有。如果浏览器自带的「安装为应用」已经够用,那也一样可以。

准备工作

Pake CLI 需要 Node.js 20.9 或更新、Rust 1.85 或更新,以及你发行版的 WebKitGTK 开发包。CLI 常见问题里有清单,其中有 libwebkit2gtk-4.1-dev 和 libayatana-appindicator3-dev,缺了后者构建会停在 "Can't detect any appindicator library"。其余步骤见快速开始,同样的构建和包格式在 Linux 上的 ChatGPT 和 Claude 里讲得更细,这篇只讲 WhatsApp 特有的部分。

构建

npm install -g pake-cli
pake https://web.whatsapp.com --name WhatsApp --width 1100 --height 760 --show-system-tray --hide-on-close

--name 设置应用名,Linux 上会转成小写、空格换成连字符,所以包叫 whatsapp。--width 和 --height 是窗口起始大小,默认 1200 × 780。--show-system-tray 加托盘图标,--hide-on-close 让关闭按钮隐藏窗口而不是退出,Linux 上它默认是关的,两个一起用应用才会一直在后台,消息才能提醒你。想只出一种包就加 --targets deb 或 --targets appimage,见 CLI 选项。第一次构建要编译依赖,需要几分钟。

构建出来的包按本地包的方式安装就行,比如 Debian 或 Ubuntu 上 sudo apt install ./whatsapp.deb。

和手机关联

打开应用,WhatsApp Web 会显示二维码,在手机上打开 WhatsApp 的已关联设备界面,选择关联设备并扫描,聊天记录随后就在窗口里加载出来。具体的菜单文字是 WhatsApp 自己的,随手机和版本不同,照手机上的提示操作即可。

不加 --incognito 时 Pake 不会进入隐私模式,所以登录状态在两次启动之间会保留,退出再打开一次,确认不会再要求扫码。如果又要了,检查构建时是不是带了 --incognito。

窗口在底层是怎么工作的

Linux 上 Pake 应用是一个 Tauri 外壳,用系统的 WebKitGTK 绘制页面,没有内置 Chromium,引擎版本就是你发行版带的那个,所以包很小,不同发行版的表现也会有差别。WhatsApp Web 是一个整天开着的大页面,web 进程占用几百 MB 是正常的,常见问题里说这个数字由引擎和页面决定。

Pake 还会把页面的 Notification API 换成自己的实现,权限报告为已授予,每条提醒交给 Tauri 的通知插件,源码说明它经由 notify_rust,由你桌面的通知服务显示。细节见网页应用的桌面通知。Linux 上 Pake 无法知道你点了哪一条,只能在一分钟内根据窗口焦点猜,所以点击不一定打开正确的聊天。提醒只在应用运行时才能到达,这就是要用 --hide-on-close 和托盘的原因。

确认它能用

关联之后按顺序测:发一条消息,从另一台设备收一条,传一个文件,用语音的话再发一条语音。通话、上传和语音消息都要在实际使用的 Linux 系统上确认。注意三类问题。

  • 「浏览器不受支持」或要求更新的页面。 页面拒绝这个窗口时,可以用 --user-agent 改变应用对外报告的内容,见自定义 User Agent。Pake CLI 3.17.6 在 Linux 上默认发送 Safari 风格的字符串,可以用当前浏览器的 User Agent 重新构建,再看 WhatsApp 是否接受,改变这个字符串不会更换 WebKitGTK 引擎。
  • 没有提醒。 先查通知服务和勿扰模式,再看 WhatsApp 网页设置里自己的通知开关。
  • Wayland 下点击和按键没反应,或者窗口一片空白。 常见问题建议点击和输入到不了页面时用 PAKE_LINUX_WEBKIT_SAFE_MODE=0,窗口空白时用 =1,比如 PAKE_LINUX_WEBKIT_SAFE_MODE=1 ./whatsapp.AppImage。

如果 WhatsApp 完全不接受这个窗口,退回普通浏览器,Pake 改变不了网站的决定。

两个账号

WhatsApp Web 一个会话只关联一个账号,要分开用两个,就用不同的名字构建两个应用:

pake https://web.whatsapp.com --name WhatsApp-Work --show-system-tray --hide-on-close

Pake 按网址和名字生成应用标识,同一个地址、不同名字的两个应用会分别安装、分别保存数据,需要的话可以用 --identifier 手动指定。这个做法在同一网站用两个账号里有更多说明,第二个构建好之后,先确认它是未关联的状态再扫码。

更新

网站自己会在每次加载时更新,但它外面那层 Pake 运行时不会,想换新的,就更新 pake-cli,用同样的网址和名字再跑一遍同一条命令。

常见问题

WhatsApp 有官方的 Linux 应用吗?

它的下载页没有,页面列的是 Mac 和 Windows,其他系统都指向 WhatsApp Web,构建前再看一眼有没有变化。

Pake 桌面版能在 Linux 上用吗?

不能,桌面版只覆盖 Mac 和 Windows,Linux 用 CLI。

窗口关着也能收到消息吗?

只有应用还在运行时才行,用 --hide-on-close 和 --show-system-tray 构建,然后关窗口而不是退出。