记一次 wechaty running on docker 之旅

开始

当被告知要结合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。

你可能感兴趣的:(记一次 wechaty running on docker 之旅)