1. "龙虾"是什么,以及为什么这会成为一个值得读的教程
"微信可以连接龙虾了"?第一次看到这个标题的人,估计脑子里都是问号:微信和龙虾有什么关系?其实这是 Linux 用户圈子里流传已久的黑话——大家习惯把 Linux 叫做"龙虾"。具体来历已经很难考据,最流行的说法是 Linux 开头那个 "Lin" 的读音和拼写,跟"龙虾"莫名其妙搭上了关系,于是这个外号就在社区里传开了。
更巧的是,微信官方这一波 Linux 原生客户端发布,适配说明里还专门提到了龙芯 LoongArch 架构。这下"龙虾"这个外号就更贴切了——系统叫"龙虾",芯片也是"龙虾",从软件到硬件,微信是真的把手伸进了 Linux 生态。
如果你一直用 Linux 当主力开发机,又每天离不开微信,以前的日子确实不太好过。网页版微信经常提示"当前账号无法使用网页版";装个 Wine 跑 Windows 版微信,折腾完字体、剪贴板、文件路径,还是会遇到各种闪退;最省事的方案是虚拟机里挂一个 Windows,但每次切出去回消息都像做了一次系统级切换,效率低得让人烦躁。
所以当微信官方推出 Linux 原生客户端的时候,我第一时间就装了,用到现在整体感受可以总结成一句话:终于不用再为"在 Linux 上收一条消息"这件事费劲了。这篇内容会把我的安装过程、实测功能边界、以及顺手做的几个自动化开发实验都写清楚。既适合只想装个微信聊天的普通人,也适合想在 Linux 上做微信生态开发的工程师。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装之前,先把系统、架构和包格式这三个概念对齐
很多人拿到安装包第一反应是双击,然后发现双击没反应,就开始怀疑人生。其实大部分问题都出在前面三个概念没对齐。
2.1 你手里到底是哪个 Linux 发行版
Linux 不是只有一个系统,而是几百个发行版的统称。微信官方不会给每个发行版都做专属安装包,它只按包格式分成几类:
- Debian / Ubuntu / Deepin / UOS / Linux Mint 这一派,用的是
.deb包。 - Fedora / RHEL / OpenEuler / 麒麟这一派,用的是
.rpm包。 - 两者都不想管的发行版,可以用 AppImage 通用格式。
- Arch / Manjaro 这类滚动发行版,可以用 AUR 或 AppImage。
所以第一步就是在终端里跑一条命令,确认自己属于哪个阵营:
bash复制cat /etc/os-release
看到 ID=ubuntu 或者 ID=debian,走 deb 路线;看到 ID=fedora 或 ID=opensuse,走 rpm 路线;如果你用的是 Arch,直接看下面 AppImage 那一段。
2.2 微信官方提供了哪几种安装包
微信 Linux 版目前提供三种格式,我整理成了一张表:
| 包格式 | 适用系统 | 安装命令 | 推荐程度 |
|---|---|---|---|
| .deb | Debian、Ubuntu、Deepin、UOS、Mint | sudo dpkg -i xxx.deb |
强烈推荐 |
| .rpm | Fedora、RHEL、OpenEuler、麒麟 | sudo rpm -ivh xxx.rpm |
推荐 |
| AppImage | 几乎所有发行版 | chmod +x 后直接运行 |
适合 Arch 及冷门发行版 |
同时还区分架构,主流是 x86_64(Intel/AMD 处理器)和 aarch64(ARM 处理器),另外有 loongarch64 版本给龙芯用。下载之前先看自己的架构:
bash复制uname -m
输出 x86_64 就选 amd64 包,输出 aarch64 就选 ARM 包,别下错了。
2.3 从软件商店安装的版本和官网包有什么区别
Deepin、UOS、麒麟这些系统的应用商店里也能搜到微信,从商店安装本质上安装的也是官方包,但有两件事要注意:
一是商店版本可能不是最新的。官方在官网更新新版本后,商店上架有延迟,有时候你发现某些功能别人能用你不能,检查一下版本号就知道了。
二是商店安装会带上系统级的依赖管理,省去很多麻烦,对普通用户更友好。如果你不想在终端里折腾,直接从商店安装是完全 OK 的,效果和命令行安装没有本质区别,只是升级路径不同。
3. 不同发行版的安装步骤,照着复制就行
这一部分是全文最"抄作业"的环节,我按系统类型分别说。
3.1 Debian / Ubuntu / Deepin / UOS 系
先去微信 Linux 官网下载 .deb 包,文件名类似 wechat_4.0_x86_64.deb。拿到包之后,终端执行:
bash复制sudo dpkg -i wechat_4.0_x86_64.deb
sudo apt-get install -f -y
第一条命令是安装,第二条命令是自动修复依赖。因为微信安装包依赖一些图形界面库,比如 libnotify、libxss,如果不装依赖,直接 dpkg 会报错。apt-get install -f 会把缺的依赖自动拉起来,这也是很多新手第一次安装失败的原因——只跑了第一条,没有跑第二条。
装完直接在应用菜单里搜"微信"就能启动。如果终端启动,可以输入:
bash复制wechat
看到二维码窗口弹出来,说明安装成功。
Deepin 和 UOS 用户如果遇到弹窗提示"软件未签名",选择"仍然安装"即可,不影响使用。
3.2 Fedora / OpenEuler / 麒麟 系
下载 .rpm 包后:
bash复制sudo rpm -ivh wechat-4.0-1.x86_64.rpm
如果提示缺依赖,用 dnf 修复:
bash复制sudo dnf install -f
麒麟系统用户也可以直接在软件商店安装,麒麟商店里的微信适配做得比较完整,图形界面安装对普通用户来说更省心。
3.3 Arch、Manjaro 与 AppImage 通用方案
Arch 系的 AUR 里有打包好的微信,但 AUR 的包质量参差不齐,更新也不一定及时。我的建议是直接用官方 AppImage,最省事:
bash复制chmod +x wechat-4.0-x86_64.AppImage
./wechat-4.0-x86_64.AppImage
AppImage 是"单文件绿色软件",不需要安装,下载后给执行权限就能跑。想要图标出现在应用菜单里,可以用 appimaged 工具,也可以手动创建一个 .desktop 文件。
3.4 安装后的第一屏配置与登录
首次启动,微信会显示二维码,用手机微信扫码,在手机上确认登录。登录成功后,最近一段时间的聊天记录会同步过来,这点和手机端、Windows 端的体验是一致的。
登录环节有两个细节需要注意:
一个是扫码之后手机上的确认按钮弹出来,点了之后电脑端可能要转几秒,不要以为卡死了,第一次登录要拉取聊天记录,慢一点正常。
另一个是如果你在手机端开启了"自动登录该设备",下次打开 Linux 客户端就能直接进,不用再掏手机扫码,这个体验真的很舒服。
4. 装完之后的真实能力边界,别抱不切实际的期待
安装只是第一步,真正决定你用得开不开心的是功能完整度。我实测下来的结论是:日常聊天完全没问题,但别指望它和 Windows 版一模一样。
4.1 原生版、Wine 版、网页版的能力对照
我把三种常用方案放在同一张表里对比:
| 功能 | Linux 原生版 | Wine 跑 Windows 版 | 网页版 |
|---|---|---|---|
| 聊天 / 群聊 | 支持 | 支持 | 支持 |
| 文件传输 | 支持 | 支持 | 受限 |
| 语音 / 视频通话 | 看版本,较新版本支持 | 支持 | 不支持 |
| 朋友圈 | 部分版本支持浏览 | 支持 | 不支持 |
| 小程序 | 基本不能跑 | 支持 | 不支持 |
| 资源占用 | 低 | 高 | 最低 |
| 维护成本 | 官方维护,省心 | 依赖 Wine,脆弱 | 登录限制多 |
我个人的体会是:如果你只是收发消息、传文件、看聊天记录,原生版已经够用;但如果你天天要刷朋友圈、开小程序游戏、视频通话,那原生版还有很长路要走。不过这些问题正在逐步收敛,微信团队更新频率不低,我后面再提怎么检查更新。
4.2 企业微信 Linux 版一起装
除了个人微信,企业微信也发布了 Linux 客户端,而且在很多 Linux 发行版的软件源里都能直接装。企业微信的功能相对克制,主要是聊天、通讯录、审批、日程,这些在 Linux 版上都保留得不错。
对做开发的人来说,企业微信有个优势:它提供了明确的 API 和机器人能力。比如群机器人 Webhook 可以往群里推消息,自建应用可以接收消息回调,这些在 Linux 环境下跑得很稳。后面我会专门讲一个"企业微信接入 DeepSeek"的实战,那个例子就是在 Linux 服务器上跑的。
4.3 我实测中遇到的三个体验细节
第一个是通知弹窗。如果在 Wayland 桌面环境下收不到消息通知,大概率是缺 libnotify,装一下就好:
bash复制sudo apt install libnotify-bin
第二个是中文输入法。Fcitx5 用户在微信输入框里打不出中文的解决方案是设置环境变量:
bash复制export QT_IM_MODULE=fcitx
export GTK_IM_MODULE=fcitx
把这两行写进 ~/.bashrc 或者微信的 .desktop 启动文件里,重启微信就正常了。
第三个是双屏或远程桌面下窗口白屏。这个问题根源在显卡渲染,可以在启动微信时追加 --disable-gpu 参数来规避:
bash复制wechat --disable-gpu
如果加了参数之后窗口正常,说明问题确实出在 GPU 渲染兼容性上。
5. 装完微信后,我顺手做的三个自动化与开发小实验
Linux 上有了原生微信,不再只是"能聊天"这么简单。对我来说,真正好玩的是能不能基于它做一些自动化,下面三个实验是我自己跑过并且持续在用的。
先说一句安全合规的前提:个人微信的 Hook、逆向、协议抓包都属于平台禁止行为,轻则功能受限,重则封号。 我的所有实验都走官方接口,不碰灰色地带。个人号搞自动化风险太高,能用企业微信、公众号、小程序解决的,千万别自己去搞 Hook。
5.1 把 DAT 缓存图片还原成 JPG,原理和代码一起给
微信电脑端收的图片,在本地并不是以 .jpg 格式直接存储的,而是一种加密后的 .dat 文件。在 Linux 上,这个目录位于:
bash复制~/.xwechat_files/你的微信号/FileStorage/Image/年-月/
里面能看到一堆名字随机的 .dat 文件,直接改后缀名打不开。
原理其实不复杂:微信对图片文件的每个字节做了一次异或处理,密钥是固定的。我们要做的就是找到这个密钥,再对每个字节异或一次还原回去。判断密钥有个技巧:JPG 文件头固定是 FF D8 FF E0,PNG 文件头固定是 89 50 4E 47,用读到的第一个字节去跟标准文件头异或,就能推出密钥。
下面是完整的 Python 脚本,直接复制就能用:
python复制#!/usr/bin/env python3
import os
from pathlib import Path
src_dir = Path.home() / ".xwechat_files" / "你的微信号" / "FileStorage" / "Image"
out_dir = Path.home() / "wechat_images"
out_dir.mkdir(exist_ok=True)
def find_key(data):
# 用 JPG 和 PNG 两种文件头试探密钥
for (head1, head2) in ((0xFF, 0xD8), (0x89, 0x50)):
k1 = data[0] ^ head1
k2 = data[1] ^ head2
if k1 == k2:
return k1
return None
def dat_to_image(dat_path, out_path):
with open(dat_path, "rb") as f:
data = f.read()
key = find_key(data)
if key is None:
return False
with open(out_path, "wb") as f:
f.write(bytes(b ^ key for b in data))
return True
for dat_path in src_dir.rglob("*.dat"):
out_path = out_dir / (dat_path.stem + ".jpg")
if dat_to_image(dat_path, out_path):
print(f"转换成功: {out_path}")
如果你的 src_dir 不确定,可以先在终端里跑:
bash复制find ~/.xwechat_files -type d -name "Image"
找到真实路径后替换掉脚本里的"你的微信号"部分。
这里我只处理自己电脑上收到的图片缓存,转换完成之后建议确认一下目录里有原始隐私数据,不要在公共电脑上留下这些文件,处理完记得清理。
5.2 企业微信机器人接入 DeepSeek,做一个能回话的助手
企业微信官方开放了几个入口,适合不同的自动化需求:
- 群机器人 Webhook:只能推消息,不能接收消息,适合做告警通知。
- 自建应用:可以接收消息回调,配合大模型 API 就能做真正的对话机器人。
我这次做的是自建应用接入 DeepSeek,实现"在群里 @ 机器人,机器人用大模型回答"。
大致链路是这样的:
- 企业微信后台创建自建应用,拿到 CorpID、AgentId、Secret。
- 配置接收消息服务器 URL,企业微信会把用户在群里 @ 机器人的消息推送到这个 URL。
- 后端收到消息后,调用 DeepSeek 的 API 生成回复。
- 用企业微信应用消息接口把回复推回群里。
我用 FastAPI 写了一个简化版本:
python复制from fastapi import FastAPI, Request
import requests
app = FastAPI()
DEEPSEEK_API_URL = "https://api.deepseek.com/chat/completions"
DEEPSEEK_API_KEY = "你的 DeepSeek Key"
@app.post("/wecom/callback")
async def wecom_callback(request: Request):
data = await request.json()
# 这里需要做企业微信的签名校验和消息解密
# 简化示例直接取消息内容
content = data.get("Content", "")
reply = chat_with_deepseek(content)
# 调用企业微信应用消息接口回复
return {"errcode": 0, "errmsg": "ok"}
def chat_with_deepseek(prompt: str) -> str:
headers = {"Authorization": f"Bearer {DEEPSEEK_API_KEY}"}
payload = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}]
}
resp = requests.post(DEEPSEEK_API_URL, json=payload, headers=headers)
return resp.json()["choices"][0]["message"]["content"]
真实的回调接入还涉及 AES 解密和签名验证,企业微信官方提供了加密库,照着官方文档把 WXBizMsgCrypt 接进来就行。
这个方案的好处是全程走官方 API,消息稳定,没有封号风险,而且 DeepSeek 的 API 兼容 OpenAI 格式,以后想换其他大模型,只需要改 api_url 和 api_key,逻辑完全不用动。
5.3 用订阅消息给小程序用户做推送
如果你维护着小程序,一定遇到过"用户走了之后怎么再触达"的问题。公众号模板消息早就下线了,现在小程序的官方方案是订阅消息。
订阅消息分两种:
- 一次性订阅:用户每次点击"允许"按钮,你才能给他推送一条。
- 长期订阅:只对政务、医疗、金融等特定行业开放,普通小程序拿不到。
所以实际开发里最常用的是一次性订阅。用户在小程序里点击订阅授权后,后端拿到 openid,在需要的时候调用发送接口。
发送订阅消息的代码:
python复制import requests
ACCESS_TOKEN = "通过 appid+secret 获取的 access_token"
def send_subscribe_message(openid, template_id, data):
url = f"https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={ACCESS_TOKEN}"
body = {
"touser": openid,
"template_id": template_id,
"page": "pages/index/index",
"data": {k: {"value": v} for k, v in data.items()}
}
resp = requests.post(url, json=body)
print(resp.json())
调用示例:
python复制send_subscribe_message(
openid="用户openid",
template_id="模板ID",
data={"thing1": "订单发货", "time2": "2025-01-01 12:00"}
)
要注意的是,如果用户拒绝了订阅授权,调用发送接口会返回 43101 错误码,代表"用户拒绝接受消息"。所以在小程序端,最好在用户真正需要的场景下再弹订阅授权,比如用户下单后询问"是否接收发货通知",成功率会高很多。
6. 微信开发展常见问题排查:授权、经纬度、校验文件、支付
这几年做微信生态开发,下面的问题几乎每隔几天就会被拉出来问一次,我整理成一份排查清单,建议收藏。
6.1 授权登录需要两个 code?只有一个
这个问题在技术群里讨论频率特别高:微信授权登录是需要两个 code 吗?
结论是:不需要,整个流程只有一个 code。
小程序端流程:
- 前端调用
wx.login(),得到一个临时code。 - 前端把
code传给后端。 - 后端调微信接口
jscode2session,用这个code换openid和session_key。 code是一次性的,5 分钟内有效,用过就失效。
公众号网页登录流程:
- 用户点击授权,微信会跳转到一个带
code的回调地址。 - 后端用这个
code换access_token和openid。 - 同样是一次性,同一个
code只能用一次。
那"两个 code"的错觉从哪来的?常见于开发者把 wx.login 的 code 和网页 OAuth 的 code 混在一起讲,或者是把获取用户信息的授权和登录授权搞混了。记住一条原则:登录只需要一个 code,信息授权和登录是两件事。
6.2 小程序获取用户信息失败 wx1cb4398e1413dce7
这个错误码经常和 wx.getUserProfile 或 wx.getUserInfo 一起出现。排查顺序有讲究:
- 先看完整报错信息,而不是只看错误码。错误码只是入口,真正的原因在后面的 message 里。
- 确认 appid 是否正确。项目里的 appid 和微信公众平台后台不一致,是最常见的原因。
- 确认基础库版本。老版本基础库对新 API 支持不完整,在开发者工具右上角"详情"里看调试基础库版本,建议切到较新版本。
- 确认用户授权状态。用户第一次拒绝过授权,再次调用会直接失败,需要用
wx.openSetting引导用户去设置页重新打开授权。 - 确认调用时机。
wx.getUserProfile必须在用户点击事件的回调里调用,不能在页面onLoad里直接调,否则会被拦截。
按这个顺序排查,绝大多数问题都能定位到具体原因。
6.3 H5 能拿到小程序当前经纬度吗?不能
小程序里的 web-view 加载了一个 H5 页面,H5 能不能直接调 wx.getLocation 拿到小程序当时的定位?
答案是不能。小程序里的 H5 运行在 WebView 环境中,拿不到小程序容器的 API。H5 页面有独立的 JS-SDK,但那属于公众号网页的定位能力,依赖于公众号的授权和配置,跟小程序的定位授权不是一回事。
正确的做法是:小程序端先用 wx.getLocation 拿到经纬度,把经纬度拼在 URL 参数里传给 web-view 里的 H5:
javascript复制// 小程序端
wx.getLocation({
type: 'gcj02',
success(res) {
const url = `https://example.com/map?lat=${res.latitude}&lng=${res.longitude}`;
wx.navigateTo({ url: `/pages/webview/webview?url=${encodeURIComponent(url)}` });
}
});
H5 那边直接读 URL 参数就行,逻辑简单,也不存在跨环境权限问题。
6.4 SpringBoot 放置校验文件与微信支付回调配置
公众号或者小程序后台要求"下载校验文件放到域名根目录",这个校验文件通常是 MP_verify_xxxx.txt 之类。SpringBoot 项目如果打了 jar 包,不建议把文件硬塞到静态资源目录里,最稳妥的方式是写一个 Controller 直接返回内容:
java复制@RestController
public class VerifyController {
@GetMapping("/MP_verify_xxxx.txt")
public String verify() {
return "校验文件内容";
}
}
注意返回的 Content-Type 要设置成 text/plain,否则微信那边可能识别失败。
配套的微信支付 V3 回调,最常用的套路是:
java复制@PostMapping("/pay/notify")
public String payNotify(@RequestBody String body,
@RequestHeader("Wechatpay-Signature") String signature,
@RequestHeader("Wechatpay-Timestamp") String timestamp,
@RequestHeader("Wechatpay-Nonce") String nonce,
@RequestHeader("Wechatpay-Serial") String serial) {
// 1. 用微信平台证书验签
// 2. 解密请求体拿到订单数据
// 3. 更新订单状态
// 4. 返回 {"code": "SUCCESS", "message": "成功"}
return "{\"code\":\"SUCCESS\",\"message\":\"成功\"}";
}
支付回调里的坑主要集中在验签失败上。最常见的原因是证书序列号不匹配,或者本地没有保存微信平台证书。V3 版支付要求用平台证书验签,不是 API 证书,两者别搞混。
6.5 PHP 判断微信内置浏览器与抓包调试
PHP 端判断用户是不是在微信内置浏览器里打开的页面,标准做法是检查 User-Agent:
php复制$isWechat = strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false;
但记住:这个判断只能用于前端展示层面,比如"微信内直接打开,其他浏览器提示扫码"。伪造 UA 太容易了,永远不要用它做安全校验或支付鉴权。
微信小程序抓包这块,我建议优先用微信开发者工具自带的 Network 面板,查看请求和响应非常直观。真机调试时可以用代理工具抓 HTTPS 包,但必须安装对应的根证书。要注意的是,抓包工具只能抓自己开发测试的小程序,抓别人小程序的包涉嫌侵犯隐私,劝大家不要碰这条线。
7. 几个容易忽略的小问题与我的使用体会
微信相关的问题,越是看着玄学,越可能是细节没到位。
7.1 扫码登录失败、企业微信双击没反应这类"玄学"问题
"谷歌浏览器里微信扫码登录没反应"这个问题,我排查过好几次,最终原因通常是这几种:
- 系统时间不对。时间偏差超过几分钟,HTTPS 证书校验就会失败,页面看起来没反应,其实请求已经断了。校准系统时间一般能解决。
- 浏览器缓存了旧的登录态。换无痕模式试一次,能登录就是缓存问题。
- 电脑上安装了安全软件或本地 hosts 配置异常,把微信登录的轮询接口拦截了。检查 hosts 文件,清掉可疑条目。
"电脑企业微信双击没反应"是另一个高频问题,常见原因是进程残留。企业微信退出时经常有残留进程,导致下一次启动没反应。处理办法是先杀掉所有企业微信进程再重开:
bash复制pkill -f WXWork
然后重新启动。如果还不行,删掉配置文件目录再试,Windows 下路径是 %APPDATA%\Tencent\WXWork,Linux 下是 ~/.config/WXWork。删除前记得备份,这个目录里有本地缓存配置。
7.2 小程序自动更新要用 UpdateManager 主动做
很多小程序项目上线后,用户手机上迟迟不更新到最新版本,其实是因为没有主动处理更新机制。微信小程序的更新逻辑是:冷启动时检查更新,但需要在代码里调用 UpdateManager 才能提示用户重启生效。
官方推荐的写法:
javascript复制const updateManager = wx.getUpdateManager();
updateManager.onUpdateReady(function
