“person using smartphone” by Christian Wiediger on Unsplash

用 Telegram 收发微信消息

手机上装的 IM 实在太多,而不同应用的好友圈又不一样,所以不得不留下多个 IM 工具,像是微信、QQ for 学校,Telegram、Slack for 网友。在多个工具之间切换很是费神,而且有的屏蔽消息的群偶尔又会出现重要的消息,有时就不能及时看到。所以合并多个聊天工具真的很有必要。

其实我一直觉得微信和 QQ 留下一个就够了,无奈好友圈里既有只用微信的人,又有只用 QQ 的人,要和他们保持联系就必须把这两个应用挂在后台(有统一的通知推送机制还好,不然两个毒瘤在后台真是了不得)。但最近我觉得不用这俩 IM 还更舒服点,因为能收到的消息不外乎是 QQ 小冰、群签到、支付宝红包。

用 Telegram 收发微信消息主要依靠 ehForwarderBot,这是一个可扩展的聊天通道框架,用户可以通过它收发多个平台的消息。在本文要用到的是默认的 Telegram 主端和 WeChat 从端。官方有完善的 英文文档,网上也有很多相关教程了。本文安装使用的 ehForwarderBot 为 v1 版本,最新的 2.x 版本最近试用了下感觉还不是很稳定。

完成本文操作需要:

  • 一个 SSH 客户端。本文使用 MobaXterm。
  • 一个海外 VPS 或独立服务器,尽量用网络状况好的。本文用的是 DigitalOcean 512M VPS 阿姆斯特丹节点,点击 此处 新用户注册可获得 $10 余额。
  • 一个关注了 BenWong 新闻台 的 Telegram 账号(误)。

服务器环境准备

两种安装方法,请选其一:

1. 用 HyperApp 安装

HyperApp 是一个基于 Docker 的服务器管理应用,其商店内已内置 ehForwarderBot,只需简单几步即可完成部署。但是我部署好以后发现不能在后台保持运行,于是采取了添加 Docker Image 的方法:

商店 里找到 Docker Image,添加到你的服务器,在配置中,Imageroyx/docker-efbOption 里填上:

--restart=always -v $(pwd)/config.py:/opt/ehForwarderBot/config.py -v $(pwd)/tgdata.db:/opt/ehForwarderBot/plugins/eh_telegram_master/tgdata.db

其中 $(pwd)/config.py 指放置配置文件 config.py 的地方,$(pwd) 指的是执行命令的位置,一般是 /root 下,可以改成另外的位置; $(pwd)/tgdata.db 同理,指的是放置数据文件的地方。config.pytgdata.db 这两个文件需要自行准备,可以直接 touch 新建。

配置完以后安装到服务器里,安装完点击服务器,查看日志,点右上角的 Term,按 A- 缩小字体直到看见二维码,不行的话可以复制出现的链接,在电脑打开也能看见二维码,用微信扫码登陆。

其实不需要 HyperApp,直接用 Docker 部署也行,具体可看 royx/docker-efb,实际上就是自行 docker pull royx/docker-efb,然后输入上面图中 docker run 的整条命令。但是用 HyperApp 的话管理上会方便一点。

2. 普通安装方法

首先,克隆项目。

git clone https://github.com/blueset/ehForwarderBot.git
cd ehForwarderBot

然后,新建存储临时文件的文件夹并赋权。

mkdir storage
chmod +rw ./storage

安装非 Python 依赖。本文示例操作于 Ubuntu 16.04 x64 环境下。

sudo apt-get install python3-dev python3-setuptools
sudo apt-get install libwebp-dev
sudo apt-get install libmagic-dev ffmpeg

安装 Python 依赖。在 ehForwarderBot 文件夹下执行:

pip3 install -r requirements.txt

Telegram 准备

点击 @BotFather 发起会话,发送 /newbot 启动新建 Bot 向导,注意 Bot 的账号名(用户名)结尾必须是 Bot,建立好以后你会得到一串密钥(Token),请将之妥善保管并不要泄露。

接下来还要对 Bot 进行配置。

  • 发送 /setprivacy 到 @BotFather,选择刚刚创建好的 Bot 用户名,然后选择 “Disable”。
  • 发送 /setjoingroups 到 @BotFather,选择刚刚创建好的 Bot 用户名,然后选择 “Enable”。
  • 发送 /setcommands 到 @BotFather,选择刚刚创建好的 Bot 用户名,然后发送如下内容:
help - 显示指令列表
link - 将会话绑定到 Telegram 群组
info - 显示当前 Telegram 会话信息
chat - 生成会话头
recog - 回复语音消息以进行识别
extra - 获取更多功能

然后还需要获取你自己的 Telegram ID,有很多方法,下面介绍一个方法:与 @get_id_bot 对话,发送 /start,获得的一串数字就是你的 ID。

@BotFather 里还有很多指令,可以对自己的 Bot 进行个性化,如编辑头像和显示名。

配置 ehForwarderBot

如果使用 HyperApp / Docker 安装的话,config.py 需要建立在你指定的位置或是默认的 /root 下。

使用普通安装方法的话,进入 ehForwarderBot 文件夹。执行以下命令新建 config.py

cp config.sample.py config.py
editor config.py

在配置文件中,token 后引号里面的内容替换为你之前获得的 Bot 密钥,admins 后方括号里面填入你自己的 Telegram ID。

配置到这一步已经完成了,如果想进行额外的自定义,可以参考 EFB Telegram MasterEFB WeChat Slave Channel

实验性功能

我的 VPS 网络状况不佳(可能是太便宜了吧),所以经常会收到网络连接错误的提示,但我自知 VPS 没有网络问题,所以我把网络连接错误的提示关掉了:

eh_telegram_master = {
# ...
"flags": {
"network_error_prompt_interval": 0
}
}

ehForwarderBot 的微信端默认以好友 / 群组的名称为 uid 来保存数据,但是有的好友热衷于改微信名,导致绑定好的群组常常失效,这时可以把默认的 uid 改成备注名:

eh_wechat_slave = {
# ...
"flags": {
"uid_order": ["alias","NickName"]
}
}

想要解析微信消息内容中的 HTML 标签,可以这样做:

eh_telegram_master = {
# ...
"flags": {
"text_as_html": True
}
}

启动

用 HyperApp / Docker 部署的直接使用相应的启动方法即可,可忽略此节。

首先在 VPS 启动 ehForwarderBot。启动方法有两种,一是可以用自带的 daemon.py

python3 daemon.py start

第二种方法是使用 screen

sudo apt-get install screen
screen -S efb
python3 main.py

之后就会在 SSH 客户端里显示一个二维码,看不到的可以打开出现的链接。然后用微信扫一扫进行登录授权,然后手机会出现「网页微信已登录」的提示。之后就可以关闭输出:使用 daemon.py 的按 Ctrl + C;使用 screen 的按 Ctrl + A 再按 D

使用

现在到 Telegram,搜索你之前设定的 Bot 用户名并点击 Start 发起会话,就可以和微信互通消息了。

一开始所有的微信消息都会通过 Bot 发给你,要回复一条微信,需要选中消息,选择 Reply,再输入回复内容。要发起会话,需要给 Bot 发送 /chat 关键词,关键词可选,输入对方备注或昵称的关键词可以进行搜索。

要对微信消息进行分类(分流),可以新建一个空群组,并在搜索框输入 Bot 的用户名即可把 Bot 邀请入群组。然后向 Bot 发送 /link 关键词,选择一个会话,并点击 Link(在这里点击 Mute 可以屏蔽掉一个会话),选择刚刚建好的群组。这样以后,该会话的消息全都会发送到新群组里。

在绑定会话中,你可以像普通聊天一样直接发送消息。也可以通过指定回复的形式来 @ 其他人。

一个妙用:把所有订阅号绑定到一个群组里,就可以集合所有订阅号消息,不需要再逐个点进去看。

如果重装系统或是换服务器,不想丢失自己做的 LinkMute 设置,可以备份 tgdata.db 文件,HyperApp / Docker 安装的就在自己指定的位置或者 /root 下,普通安装方法在 /ehForwarderBot/plugins/eh_telegram_master 里。

参考资料

其他自定义功能及问题解答请参考: