开始
当被告知要结合wechaty做一个自动发消息的微信机器人时,我真的有点懵。看了一下wechaty的文档,推荐通过docker运行。我当时的内心表情就是what? 什么鬼?前端的东西已经让我应接不暇,这些偏后台运维的就一点都不懂了。但能怎么办呢,还带着一个实习生一起做,老大安排的任务,跪着也得完成啊!
于是乎,咬着牙硬着头皮开始看各种文档,在本地把脚本运行起来,暴露http接口给我们的管理后台用。
环境
1、docker for mac
官网下载docker客户端就行下载地址
安装后,直接可以在Mac终端docker info,可以看到docker信息,就成功了。
2、npm和node
为了本地开发方便,不多说了,前端必备环境。
运行例子
1、在本地创建一个文件夹myWechaty
2、npm init
创建package.json
3、npm install --save qrcode-termial
4、创建mybot.js 官方6行代码
const { Wechaty } = require('wechaty') // import { Wechaty } from 'wechaty'
Wechaty.instance() // Singleton
.on('scan', (url, code) => console.log(`Scan QR Code to login: ${code}\n${url}`))
.on('login', user => console.log(`User ${user} logined`))
.on('message', message => console.log(`Message: ${message}`))
.start()
5、修改一下scan事件,引入qrcode-terminal
,方便直接在控制台显示二维码
const { Wechaty } = require('wechaty') // import { Wechaty } from 'wechaty'
const QrcodeTerminal = require('qrcode-terminal');
Wechaty.instance() // Singleton
.on('scan', (url, code) => {
console.log(`Scan QR Code to login: ${code}\n${url}`)
if (!(/201|200/).test(String(code))) {
const loginUrl = url.replace(/\/qrcode\//, '/l/')
QrcodeTerminal.generate(loginUrl)
}
})
.on('login', user => console.log(`User ${user} logined`))
.on('message', message => console.log(`Message: ${message}`))
.start()
6、在终端进入myWechaty文件夹,并运行docker run -ti --name=mybot --rm --volume="$(pwd)":/bot zixia/wechaty mybot.js
- 命令中的
zixia/wechaty
是wechaty包装好的docker镜像,mybot.js是运行于这个镜像之上的一段脚本,这个镜像运行依赖的环境可以通过docker hub 上wechaty的dockerfile看到:
依赖了一系列命令,有熟知bash, curl, git, sudo, vim等等,还下载了nodejs,还运行了npm install,也就是说,这个镜像依赖的环境也是我们需要的,我们无需再获取。 - 关于docker run 命令解释:
a、-ti 可命令交互
b、--name=mybot 创建容器的名称是mybot
c、--rm 退出命令后,自动删除容器
d、--volume="$(pwd)":/bot 在镜像外层目录上挂载一个bot文件夹,里面存放的是myWechaty里的内容。 - 新开终端,
docker ps
列出当前所有容器,可以看到有我们的mybot
7、终端显示二维码,用微信扫码即可。这样,就可以在终端查看到微信消息了。
了解了以上之后,我们就可以在mybot.js
中开发我们需要的功能了。
mybot.js中暴露接口
难以入手的问题
在写接口之前,我在想怎么在本地访问呢?现在的环境node已经有了,wechaty本身也有服务,我又该怎么做呢?这个问题困扰了我很久,总之,还是因为对docker环境不了解。
几番周折查找,原来就在docker run命令里面设置一个参数就能解决。
-p 8888:8888
: 将虚拟机器(即mybot容器)的地址端口映射到我们本地端口。
在myWechaty mybot.js中,引入:
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
再对body解析:
app.use(bodyParser.json({limit: '20mb'}));//设置前端post提交最大内容
app.use(bodyParser.urlencoded({limit: '20mb', extended: false}));
app.use(bodyParser.text());
再添加一段监听日志代码:
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(8888, () => {
console.log('Example app listening on port 3000!');
});
终端:
1、npm install --save express body-parser
2、docker run -ti --name=mybot --rm --volume="$(pwd)":/bot -p 8888:8888 zixia/wechaty mybot.js
看到监听日志打出来了,也有微信消息。 在浏览器中访问localhost:8888
, Hello World!
到这里了,暴露接口不就是顺手拈来的事情了么!
后续
到此,基本上开发就是这样了,跟平常做node开发一样。最后,就是看是否需要将开发的内容打包成镜像发布,还是直接就这样运行就行了。打包镜像的话,就是注意Dockerfile的配置,进行docker build。