linux上使用微信确实麻烦,没有Linux客户端,网页版体验极差,毕竟某字母的做事原则就是:没钱赚的事绝对不做。

先后试过几个版本的第三方封装微信,体验都不怎么好,只是聊胜于无罢了,现在用的 telegram + ehforwarderbot 方案算是目前最好的了,但是网上的教程大部分存在不少坑,我在摸索几天后成功搭建,就此发布这篇文章把这些坑填一下,方便后来人。

除了wine之外,目前有几个在linux上可用的微信:

  • electronic-wechat:封装的网页版微信,体积略大,通知处理的很好,开箱即用,无需繁杂的设置,同时网页版的弊端也是继承下来,比如没有消息记录。实在不想折腾,想即开即用的,推荐这个。
  • 微信网页版助手:一个很不错的解决方案,集成在浏览器里,但是只支持火狐,chrome直接放弃。
  • libgin-wechat:作为libgin的一个插件,可以在之运行一个libgin的情况下,同时登录微信,qq(lwqq),facebook,gmail等。看起来不错,但我没弄成功。
  • weweChat:用ReactMobXElectron对网页版重构过、是目前见过最漂亮的网页版微信,没有之一,不过有些影响使用的小毛病,而且最新版的fedora 29ubuntu 18.04都不支持,界面可以感受一下:
wewechat.gif

不想折腾或者不满足下面条件的可以试试上面几个。还有最后一个就是[Telegram + ehforwarderbot]了,虽然初期配置麻烦,但用的是telegram美观的界面,又有消息记录,最后就敲定这个了。

注意:Telegram + ehforwarderbot 方案需要知道以下几个问题

  1. **有一个能 fq 的 vps:**telegram需要翻墙才能用,或者有其他方法解决 telegram 被墙的问题;
  2. **手机版微信必需保持在线:**因为这个方案是基于网页版微信,所以这个只是linux上的方案,虽然手机上的 telegram 也能接收信息,但若手机端微信不在线,服务器端也会掉,那么无论手机还是电脑的telegram都将收不到信息,所以这个方案暂时无法完全替代微信;
  3. **此教程适用于 ehforwarderbot 2.0:**2.0 版本改变不少,不仅安装方式变简单(不必通过源码安装),而且配置文件跟 1.x 版本的路径不一样,连后缀都不一样,3 配置 部分会说;
  4. **仅支持微信网页版所支持的功能以及消息类型:**即没有朋友圈、没有红包、不能发语音、不能发位置……等等诸如此类,部分文件、图片、表情等多媒体文件会被网页版微信截断,即收不到任何数据, 尤以表情为甚。因此造成的偶发现象,会提醒用户使用移动客户端查看。
  5. **信息必须自己分类:**telegram上会创建一个会话,这个会话里会显示来自微信的所有消息,也就是说微信的消息全部挤在一个窗口内,需要自己一个个分类,将每个人的会话窗口单独提取出来,这个在 4. 使用 部分会说

概要

  • 服务器上需要安装的部分:
    • python3:ehforwarderbot 的依赖项;
    • ehforwarderbot:接收微信消息并转发给 telegram 客户端;
    • ehforwarderbot主端:用来将消息发送至 telegram 的 ehforwarderbot 组件;
    • ehforwarderbot从端:本文中用到的是微信从端,即发送到 telegram 的是微信的消息;
  • 客户端需要安装的部分:
    • telegram:用于接收消息;

以下VPS系统以debian为例,其他发行版如centos等差别也不大,就是在安装依赖部分要把apt-get改成相应的命令。

安装依赖

python3

ehforwarderbot依赖于python3pip3,目前(2018.3.27)在Python.org上的python3版本是3.6.4,可以直接在软件仓库安装,版本会稍旧,

1# 安装python3依赖
2apt-get install python3-pip python3-dev python3-setuptools
3apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev
4apt-get install libmagic-dev ffmpeg

或者也可以直接从源码安装最新版本,实际上软件仓库里的python也能用,所以不必太纠结:

 1# 创建安装目录
 2mkdir /tmp/python3
 3
 4# 下载 Python 源码
 5wget --no-check-certificate https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
 6
 7# 解压源码包
 8tar -xzvf Python-3.6.4.tgz
 9
10# 进入解压目录
11cd Python-3.6.4
12
13# 编译安装三部曲
14./configure
15make
16make install
  • wget 对于 https 的网址需要加上 --no-check-certificate

pip3

目前(2018.3.27)最新版本是 9.0.3,不过初次安装时不必在意版本,如果有新版本出来,可以通过pip直接升级

 1# 下载源代码
 2wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.3.tar.gz
 3
 4# 解压
 5tar -zvxf 9.0.3 -C pip-9.0.3
 6
 7# 进入解压目录
 8cd pip-9.0.3
 9
10# 使用 Python 3 安装
11python3.6 setup.py install
12
13# 升级 pip
14pip install --upgrade pip
  • 注意用python3安装pip的时候,用到的命令是python3.6,也是当前的python版本,如果版本是3.7,则应该用python3.7安装。

安装

之前的 EH Forwarder Bot 1.0 版本安装需要从 github 下载源码,而 2.0 版本改进很多,通过PyPI安装就可以了

1# 通过pip安装稳定板
2pip3 install ehforwarderbot
3
4# 安装主端 ETM (EFB Telegram Master Channel)
5pip3 install efb-telegram-master
6
7# 安装从端 EWS (EFB WeChat Slave Channel)
8pip3 install efb-wechat-slave

如果想试新功能新特性,可以从 github 安装测试版,不推荐新手尝试:

1pip3 install git+https://github.com/blueset/ehforwarderbot.git

配置

Telegram

Telegram 是一个即时聊天工具,启动快捷,体积小,几乎支持全平台。Linux客户端可以在官网下载,移动端也可以从 Play 商店和 App Store 上面下载,需要注意的是,客户端的使用需要翻墙

Telegram Desktop下载一个Linux客户端然后注册一个帐号备用,注册只需要手机号码。

Telegram Bot 是 EFB(Telegram 主端)的出口,也就是用来接收信息的客户端所需要的功能。直接在搜索框输入 BotFather 可以找到,不区分大小写,但别找错了,下面图中第一个才是: 使用botfather.png

接下来就是向 BotFather 发送指令来创建 Bot,指令以 / 开头,引号左边是需要输入的内容,右边是解释,输入顺序不能错:

  • /newbot:启用向导;
  • WeChat:启用向导后要求输入名称,名称和下面的用户名以后都不能更改;
  • WeChat_bot:输入用户名,只能由字母和下划线组成,这个用户名只是举个例子;

创建之后大概是这个样子: 创建bot.png

注意:

  1. 名称 不等于 用户名,两者相当于昵称和帐号的区别,并且不能更改,实在需要更改的话只能重新建一个Bot;
  2. 要妥善保管好用户名和最后出现的token,token在接下来会用到;
  3. 为了自身信息安全最好别将用户名和token告诉别人,上面只是创建个新帐号举例子;

接下来都是在 BotFather里面的操作:

  1. 输入/setprivacy,选择刚创建的 Bot,选择 “Disable”.
  2. 输入/setjoingroups,选择刚创建的 Bot,选择 “Enable”.
  3. 输入/setcommands,选择刚创建的 Bot,输入以下内容,注意是每一行的内容全部都要输进去,包括中文注释:
1link - 将会话绑定到 Telegram 群组
2chat - 生成会话头
3recog - 回复语音消息以进行识别
4extra - 获取更多功能

完成后大概是这个样子: 设置bot.png

之后在搜索框输入 get_id_bot,仍然是选第一个 get-id-bot.png

get_id_bot 的聊天窗口输入 /start 可以获得 Telegram IDYour Chat ID 后面的那串数字就是需要的 ID。

EH Forwarder Bot

回到服务器端,EH Forwarder Bot 1.x 版本的配置文件是 config.py,但目前的 2.0 版本已经改成 config.yawl,而且需要自行创建:

 1# 创建并编辑配置文件 config.yawl
 2vim ~/.ehforwarderbot/profiles/default/config.yaml
 3
 4# 输入以下内容,master_channel后面是刚才安装的主端,slave_channels后面是从端,“从端书写方式必须用列表,即使只有一个从端”,这是官方文档里面的说明
 5master_channel: "blueset.telegram"
 6slave_channels:
 7- "blueset.wechat"
 8
 9# 编辑主端配置文件
10vim ~/.ehforwarderbot/profiles/default/blueset.telegram/config.yaml
11
12# 加入以下内容,其中token后面接的是上面创建bot时所得到的,admins后面接的数字是刚才得到的Telegram ID
13token: "88888888:dGDe890Pml9lmp9PO9j9pJ9Pn9NMPO0nnki"
14admins:
15- 88888888

此时已经配置完毕,可以直接运行看看

1ehforwarderbot

接下来在一大串提示之后就会显示出二维码,直接用手机微信扫描就可以了: 微信二维码扫描登陆.png

使用

上面已经让服务器开始接收微信消息了,现在就需要将信息接入到客户端的telegram。 在搜索框中搜索刚才创建的 bot 帐户,进入,点击 start即可开始聊天,需要和哪个联系人聊天就输入 /chat 名称,这个名称可以是昵称或备注,也可以是昵称或者备注的一部分,此时就相当于搜索联系人,或者直接输入 /chat 会显示所有联系人和公众号。

此时如果有消息来,微信所有的消息会直接被推送到这个窗口,注意是所有的消息,不管是谁发送的都在这个窗口,所以就需要另外手动把联系人分离到单独的窗口,方式是把联系人加入到一个个新创建的群组,每个群组只有自己和对应的联系人,也就是说,在这个群里只有两个人在这里发信息,也就相当于单独聊天了。

操作起来不难,只是每个联系人都要操作一遍:

  1. 菜单 -> NEW GROUP 中新建群组,输入群组名称,然后搜索自己的 bot 的名字,把自己添加进群组;
  2. 在自己的 bot 中输入 /link 联系人 ,例如添加微信支付,直接点击搜索结果 -> link -> 刚创建的微信支付群组 -> 确定,绑定成功是这样的:

绑定微信支付.png

设置守护进程

通过的方式运行ehforwarderbot之后会占着输出窗口,像这样:

设置守护进程.png

当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程,也就是说一关ssh窗口就会掉线。因此需要设置成后台进程,办法有两种:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

显然忽略 HUP 信号很常用,只要输入下面的命令就可以在关闭 ssh 窗口后仍保持 ehforwarderbot 的运行

1nohup ehforwarderbot&

但这种方法也有个问题,就是管理起来不方便,比如要重启或者关闭 ehforwarderbot 的时候,或者要查看 ehforwarderbot 运行状态的时候就会比较麻烦,而且什么时候这个进程被杀死都不知道,所以最好的方法还是用systemd设置成守护进程进行管理。

1# 创建 ehforwarderbot.service 配置文件
2vim /lib/systemd/system/ehforwarderbot.service

输入以下内容:

 1[Unit]
 2Description=EH Forwarder Bot instance
 3After=network.target
 4Wants=network.target
 5Documentation=https://github.com/blueset/ehForwarderBot
 6
 7[Service]
 8Type=simple
 9Environment='EFB_PROFILE=~/.ehforwarderbot/profiles/default/' 'LANG=zh_CN.UTF-8' 'PYTHONIOENCODING=utf_8' 'EFB_DATA_PATH=~/.ehforwarderbot'
10ExecStart=/usr/bin/ehforwarderbot --verbose
11Restart=on-abort
12KillSignal=SIGINT
13StandardOutput=journal+file:/var/log/efb.debug
14StardardError=journal+file:/var/log/efb.error
15
16[Install]
17WantedBy=multi-user.target
18Alias=efb
19Alias=ehforwarderbot

之后就可以直接用 systemd 管理 ehforwarderbot 了:

 1# 启动
 2sudo systemctl start ehforwarderbot
 3
 4# 关闭
 5sudo systemctl stop ehforwarderbot
 6
 7# 重启
 8sudo systemctl restart ehforwarderbot
 9
10# 查看运行详情
11sudo systemctl status ehforwarderbot
12
13# 查看更加详细的运行详情
14sudo systemctl status ehforwarderbot -l

配置文件里面也设置了别称,所以可以用简化的别称,例如:

1# 启动
2sudo systemctl start efb

当然,如果使用上面的配置文件启动服务时失败,需要检查的地方只有三个:第二部分中 Environment 后面的 EFB_PROFILEEFB_DATA_PATH,还有 ExecStart

  • EFB_PROFILE 后面接的是配置文件的路径,如果不是按照此教程安装设置的 ehforwarderbot 的话,配置文件可能不在这个路径,需要自己找,不过注意这里填的是配置文件所在文件夹的路径,而不是配置文件的完整路径;
  • EFB_DATA_PATH 一般默认是 ~ 路径,如果不是,直接运行 cd $EFB_DATA_PATH,看看打开的是哪个文件夹;
  • ExecStart如果出错,直接运行 whereis ehforwarderbot,将得到的路径替换掉 ExecStart= 后面的 /usr/bin/ehforwarderbot

关于更多systemd的详情,可以看看评论区中开发者Eana Hufwe的评论。

更改完记得重新加载配置文件,然后再启动:

1sudo systemctl daemon-reload
2sudo systemctl start efb