- 本系列教程力求简洁明了,务必保证你的环境以及所有依赖的版本跟教程保持一致。
- 使用TypeScript完成一个微信机器人,即给一个微信号发送一个"ding",此微信号自动回复一个"dong"
项目介绍#
Wechaty是一个开源的微信对话机器人SDK,原生使用的是TS构建的node.js应用。当然也有别的作者基于此开发的python、Go等版本的wechaty,方便不熟悉ts语言的人使用。
通俗的说,你如果想开发一个微信机器人,从wechaty、python-wechaty、go-wechaty等中间选择一个你喜欢的,然后写代码就可以了。
Wechaty生态目前来说不是很好,虽然核心代码一直在更新但是教程老且少,很多文档说的不是很明白,开发复杂的项目的时候需要看源码才能去解决,坑比较多,后面我也会给出相关文档地址,有兴趣的同学切记仅仅作为参考看即可,如果开发过程中遇到照着文档做却不成功的情况建议去发issue
前置条件(重要,以下条件缺一不可)#
- Puppet:想使用wechaty开发微信机器人,需要使用一个中间件Puppet来控制微信的操作,官方把Puppet翻译为傀儡,目前有多种Puppet可以使用,不同版本的Puppet区别是可以实现的机器人功能不同。比如你想让你的机器人将用户踢出群聊,那就需要使用Pad协议下的Puppet。有关各个版本Puppet的区别请查看各版本区别
- 目前来说功能最全最好用的Puppet版本是PadPro,此系列教程不管是基于python版本还是TS版本的都是使用的PadPro,当然这个不是免费的,使用它需要去申请一个token即可点我申请token注意:一个手机号可以申请7天免费的token,之后需要付费,200RMB一个月,购买多月会有优惠。总体来说,token是比较贵的,建议测试或者仅是尝鲜的同学可以多用几个手机号轮流注册使用(有免费版本的Puppet,有兴趣的同学可以自行研究)
- 安装node(相关教程自行百度即可)
正式开始#
TS版本因为是原生支持,所以仅需要一个token即可,不需要像python-wechaty那样启动docker服务
编写package.json代码#
在根目录下建立main.ts, package.json,
package.json代码如下
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
| {
"name": "wechaty-puppet-padlocal-demo",
"version": "0.1.2",
"description": "Demo for wechaty-puppet-padlocal",
"author": "haoda",
"license": "Apache-2.0",
"dependencies": {
"qrcode-terminal": "^0.12.0",
"wechaty": "^1.19.10",
"wechaty-puppet": "^1.19.6",
"wechaty-puppet-padlocal": "^1.11.18"
},
"devDependencies": {
"cross-env": "^7.0.3",
"ts-node": "^10.7.0",
"typescript": "^4.6.4"
},
"scripts": {
"init": "npx ts-node main.ts",
"demo-esm": "cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node main.ts"
},
"engines": {
"node": ">= 16",
"npm": ">=7"
}
}
|
在根目录下运行npm i安装相关依赖(如果之前没有用过npm的同学可能会因为网络环境的问题安装失败,可以换成国内源尝试)
编写main.ts代码#
main.ts代码如下
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
| // main.ts
import {
config,
Wechaty,
log,
ScanStatus,
WechatyBuilder,
Message
} from 'wechaty'
import {PuppetPadlocal} from "wechaty-puppet-padlocal";
// 这里填写申请的token
const puppet = new PuppetPadlocal({
token: "puppet_padlocal_8ef8ef4g2fec4d8a1220da132554a940"
})
async function onMessage(message: Message) {
try {
const room = message.room()
const sender = message.talker()
const content = message.text()
if (message.self()) {
return
}
if (content === 'ding') {
await message.say('dong')
}
} catch (e) {
console.error(e)
}
}
const bot = WechatyBuilder.build({
name: "PadLocalDemo",
puppet,
})
.on("scan", (qrcode, status) => {
if (status === ScanStatus.Waiting && qrcode) {
const qrcodeImageUrl = [
'https://wechaty.js.org/qrcode/',
encodeURIComponent(qrcode),
].join('')
log.info(`onScan: ${ScanStatus[status]}(${status}) - ${qrcodeImageUrl}`);
require('qrcode-terminal').generate(qrcode, {small: true}) // show qrcode on console
} else {
log.info(`onScan: ${ScanStatus[status]}(${status})`);
}
})
.on("login", (user) => {
log.info(`${user} login`);
})
.on("logout", (user, reason) => {
log.info(`${user} logout, reason: ${reason}`);
})
.on('message', onMessage)
bot.start().then(() => {
log.info("started.");
});
|
之后运行npm run init,一切正常的情况下会在终端出现一个二维码,使用做微信机器人的微信号扫码登陆,之后使用别的微信向此微信发送ding,微信机器人回复dong即代表成功。