linux (ubuntu) 微信几种解决方案比较与最终方案: Telegram + ehforwarderbot 2.0

2018-02-20


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

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

##

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

不想折腾或者不满足下面条件的可以试试上面几个。还有最后一个就是[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. 使用 部分会说

思路:

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

安装依赖

安装python3

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建安装目录
mkdir /tmp/python3

# 下载 Python 源码
wget --no-check-certificate https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz

# 解压源码包
tar -xzvf Python-3.6.4.tgz

# 进入解压目录
cd Python-3.6.4

# 编译安装三部曲
./configure
make
make install

安装pip3

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载源代码
wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.3.tar.gz

# 解压
tar -zvxf 9.0.3 -C pip-9.0.3

# 进入解压目录
cd pip-9.0.3

# 使用 Python 3 安装
python3.6 setup.py install

# 升级 pip
pip install --upgrade pip

安装 EH Forwarder Bot

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

1
2
3
4
5
6
7
8
# 通过pip安装稳定板
pip3 install ehforwarderbot

# 安装主端 ETM (EFB Telegram Master Channel)
pip3 install efb-telegram-master

# 安装从端 EWS (EFB WeChat Slave Channel)
pip3 install efb-wechat-slave

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

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

配置

配置 Telegram

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

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

创建Bot

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

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

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

注意:

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

配置Bot

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

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

完成后大概是这个样子:
设置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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建并编辑配置文件 config.yawl
vim ~/.ehforwarderbot/profiles/default/config.yaml

# 输入以下内容,master_channel后面是刚才安装的主端,slave_channels后面是从端,“从端书写方式必须用列表,即使只有一个从端”,这是官方文档里面的说明
master_channel: "blueset.telegram"
slave_channels:
- "blueset.wechat"

# 编辑主端配置文件
vim ~/.ehforwarderbot/profiles/default/blueset.telegram/config.yaml

# 加入以下内容,其中token后面接的是上面创建bot时所得到的,admins后面接的数字是刚才得到的Telegram ID
token: "88888888:dGDe890Pml9lmp9PO9j9pJ9Pn9NMPO0nnki"
admins:
- 88888888

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

1
ehforwarderbot

接下来在一大串提示之后就会显示出二维码,直接用手机微信扫描就可以了:
微信二维码扫描登陆.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 的运行

1
nohup ehforwarderbot&

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

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

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=EH Forwarder Bot instance
After=network.target
Wants=network.target
Documentation=https://github.com/blueset/ehForwarderBot

[Service]
Type=simple
Environment='EFB_PROFILE=~/.ehforwarderbot/profiles/default/' 'LANG=zh_CN.UTF-8' 'PYTHONIOENCODING=utf_8' 'EFB_DATA_PATH=~/.ehforwarderbot'
ExecStart=/usr/bin/ehforwarderbot --verbose
Restart=on-abort
KillSignal=SIGINT
StandardOutput=journal+file:/var/log/efb.debug
StardardError=journal+file:/var/log/efb.error

[Install]
WantedBy=multi-user.target
Alias=efb
Alias=ehforwarderbot

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动
sudo systemctl start ehforwarderbot

# 关闭
sudo systemctl stop ehforwarderbot

# 重启
sudo systemctl restart ehforwarderbot

# 查看运行详情
sudo systemctl status ehforwarderbot

# 查看更加详细的运行详情
sudo systemctl status ehforwarderbot -l

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

1
2
# 启动
sudo systemctl start efb

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

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

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

1
2
sudo systemctl daemon-reload
sudo systemctl start efb



评论