一个计算机技术爱好者与学习者

0%

Wechaty入门篇

1. Wechaty简介

Wechaty 是一个开源聊天机器人框架SDK,具有高度封装、高可用的特性,支持NodeJs, Python, Go 和Java 等多语言版本。在过去的4年中,服务了数万名开发者,收获了 Github 的 1w+ Star。同时配置了完整的 DevOps 体系并持续按照 Apache 的方式管理技术社区。

参考文档:

2. Wechaty核心概念

2.1. 协议

运行微信机器人有多种协议可以使用,有以下几种不同的协议方式:

  • Padlocal协议(推荐使用)
  • Paimon协议(最简单)
  • 免费Web协议(目前已不可用)
  • puppet-xp协议(仅windows下可用)

每个协议都有不用的特点,如果不知道选什么,那么建议使用Padlocal协议。

2.2. Token

Token 是 Wechaty 开放源代码项目中,所设计和支持的一种认证技术,可以使用第三方的 Wechaty Puppet Service 服务。Wechaty 社区中,提供 Puppet Service 的第三方,称之为 Wechaty Puppet Service Provider 。句子互动公司是 Wechaty PadPlus, WxWork, Donut 等 Puppet Service 的 Provider,提供对应 Puppet Service 的 Token ,实现开发者可以使用对应的协议服务。

在设置 Token 后,每个 Token 将可以使得一个微信号以 iPad 或 Mac 登录的方式进行登录,避免了既有网页端登录受限的问题。

每个 Token 可以使得一个微信号登录,如果希望多个号同时登录,需要获取多个 Token 。 但 Token 不与微信号绑定,即可以多个号不同时段轮流使用一个 Token 进行登录。

2.3. Puppet

Wechaty 中的术语 Puppet 是用于实现协议插件的抽象类。插件是帮助控制 微信/Whatspp/TikTok 的组件,这就是我们称之为Puttet(傀儡)的原因。

3. Padlocal Getting Started

参考文档:

3.1. 申请Token

申请 Padlocal Token 链接:Padlocal
免费试用Token可以使用7天,续费200元/月。建议成为Wechaty开发者,可以免费续期Token,参考文档How to be a Wechaty Contributor

3.2. 启动Gateway

1、启动Gateway Docker

1
2
3
git clone https://github.com/voidking/python-wechaty-template.git
cd python-wechaty-template/
./start_gateway_docker.sh puppet_padlocal_xxx

其中 puppet_padlocal_xxx 要替换成自己的Token。

最后一行的链接,是一个微信登录的二维码,python-wechaty连接gateway之后能够自动获取到这个链接并展示,以便我们登录。
当然,直接在浏览器中也能访问这个二维码,微信扫码可以登录,不过没什么用。

Gateway启动时,会生成一个WECHATY_TOKEN,Gateway使用;同时会填入到 .env 文件中,给机器人使用。
运行自己的机器人代码时,也要用到这个 WECHATY_TOKEN

2、验证Gateway是否启动成功

1
curl https://api.chatie.io/v0/hosties/$WECHATY_TOKEN

3.3. 运行机器人

1
make bot

报错:

1
2
3
4
5
6
7
8
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/wechaty/wechaty.py", line 445, in start
await self.puppet.start()
File "/usr/local/lib/python3.9/site-packages/wechaty_puppet_service/puppet.py", line 911, in start
self._init_puppet()
File "/usr/local/lib/python3.9/site-packages/wechaty_puppet_service/puppet.py", line 894, in _init_puppet
raise WechatyPuppetConfigurationError(
wechaty_puppet.exceptions.WechatyPuppetConfigurationError: WechatyPuppetConfigurationError("can't not ping endpoint: 42.194.xxx.xxx:8080", None, None)

这是因为,机器人连接Gateway Docker时,使用了外网IP,而外网IP的8080端口并未开放。
有两个解决办法:(1)开放外网IP的8080端口;(2)配置使用 WECHATY_PUPPET_SERVICE_ENDPOINT 变量。

这里选择第二种方法:

1
2
3
4
5
6
7
docker run -it --name bot -d \
-v $(pwd):/bot \
-p 8004:8004 \
-e WECHATY_PUPPET_SERVICE_ENDPOINT="192.168.56.101:8080" \
py-wechaty-template-bot:latest

docker logs -f bot


这里有个错误:Wechaty - ERROR - internal error <>
参考Wechaty - ERROR - internal error and failed to scan,忽略即可。

扫描登录,第一次登录时,会询问你登录的是 mac、windows还是ipad,这里要选择ipad。

登录成功后,半分钟左右,会自动退出,提示为了你的账号安全,请重新登录。

然后,再扫描登录,登录成功后还是会退出,后来再扫描二维码就没有反应了。。。

Padlocal Get Started,以失败告终。

4. Paimon Get Started

Paimon相对于Padlocal,缺点很多:发送/接收图片、文件较慢;不支持接收/转发动图;不支持接收/发送语音消息;不支持转发音频/视频等。
不过,Paimon最大的优点就是简单,这就够了,关键是能用。

参考文档:

4.1. 申请Token

申请Token链接:Puppet Service: Paimon
免费试用Token可以使用7天,续费200元/月。建议成为Wechaty开发者,可以免费续期Token,参考文档How to be a Wechaty Contributor

4.2. 运行机器人

1、安装依赖

1
pip install wechaty -i https://pypi.tuna.tsinghua.edu.cn/simple

2、编写脚本 test.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import asyncio, os
from typing import List, Optional, Union

from wechaty_puppet import FileBox # type: ignore

from wechaty import Wechaty, Contact
from wechaty.user import Message, Room


class MyBot(Wechaty):

async def on_message(self, msg: Message):
"""
listen for message event
"""
from_contact: Optional[Contact] = msg.talker()
text = msg.text()
room: Optional[Room] = msg.room()
if text == 'ding':
conversation: Union[
Room, Contact] = from_contact if room is None else room
await conversation.ready()
await conversation.say('dong')
# file_box = FileBox.from_url(
# 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/'
# 'u=1116676390,2305043183&fm=26&gp=0.jpg',
# name='ding-dong.jpg')
file_box = FileBox.from_url(
'https://cdn.voidking.com/img/about/about.png?imageView2/0/w/1000',
name='ding-dong.jpg')
await conversation.say(file_box)

os.environ['TOKEN'] = "puppet_paimon_1fe5f846-3cfb-401d-b20c-XXXXX"
asyncio.run(MyBot().start())

3、启动脚本

1
python test.py


使用微信号B扫码登录微信。

4、测试 ding dong
使用微信号A给微信号B发送一个ding,可以收到自动回复的dong,但是并没有接收到图片消息。
代码出现了报错:

经查,是因为教程中给的图片地址过期了,换成可用的地址后,可以正常接收到图片消息了。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-wechaty-start/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~