前言

  • 本系列教程力求简洁明了,务必保证你的环境以及所有依赖的版本跟教程保持一致。

目标

  • 使用Python完成一个微信机器人,即给一个微信号发送一个"ding",此微信号自动回复一个"dong"

项目介绍

  • 看过前面教程的同学应该都了解了如果想用wechaty搭建一个微信机器人必须要有一个puppet的支持,而目前来说最稳定的puppet当属padlocal,但是需要收费且价格不算便宜,对于那些只是想尝鲜或者做测试的同学来说很不友好。今天要介绍的是一个免费的puppet—UOS微信,其实也就是一款桌面版微信。
  • UOS版的优点就是免费,且搭建也很简单;缺点也很明显:不稳定、功能少。但是对于想尝鲜或做测试的同学来说已经足够了
  • 和padloacl类似,除了原生TS的wechaty,其他语言使用wechaty都需要一个gateway来供你的业务代码连接。之前使用padlocal的时候,gateway直接使用了官方封装的docker来连接。但是UOS下不知道什么原因,官方的docker我测试的一直连接失败,所以只能通过npm运行gateway的方式来实现了。如果有同学研究出来了docker镜像的方式烦请告知我,谢谢。
  • 重要说明:UOS版随时有可能因为官方某些原因无法使用,所以如果你是恰巧过了很长时间看到这篇教程且运行失败的话,那可能就是已经失效而不是你的原因

前置条件

  • 安装node

正式开始

  • Shell中依次运行下面命令
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 安装wechaty
npm install -g wechaty wechaty-puppet-wechat

# 设置环境变量,linux和mac使用export代替set
# WECHATY_PUPPET_SERVICE_TOKEN随机字符串,最好唯一,建议使用python的uuid.uuid4()生成
set  WECHATY_PUPPET_WECHAT_PUPPETEER_UOS=true
set  WECHATY_PUPPET_SERVICE_TOKEN="insecure_40fc7334-1234-5678-7777-780948c983d41"
set  WECHATY_PUPPET="wechaty-puppet-wechat"
set  WECHATY_LOG="verbose"
set  WECHATY_PUPPET_SERVER_PORT="8080"
set  WECHATY_PUPPET_SERVICE_NO_TLS_INSECURE_SERVER=true

# 运行wechaty网关服务
wechaty gateway --token %WECHATY_PUPPET_SERVICE_TOKEN% --port %WECHATY_PUPPET_SERVER_PORT%  --puppet wechaty-puppet-wechat
# mac or linux
wechaty gateway --token $WECHATY_PUPPET_SERVICE_TOKEN --port $WECHATY_PUPPET_SERVER_PORT --puppet wechaty-puppet-wechat

正常情况下会提示一个URL,打开使用微信机器人账号登陆

  • 业务代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# python环境要有wechaty,这里的wechaty和上面npm安装的不是一回事(pip install wechaty)
from wechaty import Wechaty, Message
import asyncio, os

os.environ["WECHATY_PUPPET_SERVICE_ENDPOINT"] = "127.0.0.1:8080"
os.environ["WECHATY_PUPPET_SERVICE_TOKEN"] ="insecure_40fc7334-1234-5678-7777-780948c983d41"

os.environ["WECHATY_PUPPET_WECHAT_PUPPETEER_UOS"] = "true"

bot = Wechaty()

class MyBot(Wechaty):
    async def on_message(self, msg: Message) -> None:
        text = msg.text()
        if text == "ding":
            res = "dong"
            await msg.say(res)

asyncio.run(MyBot().start())

运行python代码,一切正常的话,使用别的微信号在机器人账号发送ding,机器人回复dong即代表成功。