開始
當被告知要結合wechaty做一個自動發(fā)消息的微信機器人時,我真的有點懵。看了一下wechaty的文檔,推薦通過docker運行。我當時的內心表情就是what? 什么鬼?前端的東西已經(jīng)讓我應接不暇,這些偏后臺運維的就一點都不懂了。但能怎么辦呢,還帶著一個實習生一起做,老大安排的任務,跪著也得完成?。?br> 于是乎,咬著牙硬著頭皮開始看各種文檔,在本地把腳本運行起來,暴露http接口給我們的管理后臺用。
環(huán)境
1、docker for mac
官網(wǎng)下載docker客戶端就行下載地址
安裝后,直接可以在Mac終端docker info,可以看到docker信息,就成功了。
2、npm和node
為了本地開發(fā)方便,不多說了,前端必備環(huán)境。
運行例子
1、在本地創(chuàng)建一個文件夾myWechaty
2、npm init創(chuàng)建package.json
3、npm install --save qrcode-termial
4、創(chuàng)建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是運行于這個鏡像之上的一段腳本,這個鏡像運行依賴的環(huán)境可以通過docker hub 上wechaty的dockerfile看到:
依賴了一系列命令,有熟知bash, curl, git, sudo, vim等等,還下載了nodejs,還運行了npm install,也就是說,這個鏡像依賴的環(huán)境也是我們需要的,我們無需再獲取。 - 關于docker run 命令解釋:
a、-ti 可命令交互
b、--name=mybot 創(chuàng)建容器的名稱是mybot
c、--rm 退出命令后,自動刪除容器
d、--volume="$(pwd)":/bot 在鏡像外層目錄上掛載一個bot文件夾,里面存放的是myWechaty里的內容。 - 新開終端,
docker ps列出當前所有容器,可以看到有我們的mybot
7、終端顯示二維碼,用微信掃碼即可。這樣,就可以在終端查看到微信消息了。
了解了以上之后,我們就可以在mybot.js中開發(fā)我們需要的功能了。
mybot.js中暴露接口
難以入手的問題
在寫接口之前,我在想怎么在本地訪問呢?現(xiàn)在的環(huán)境node已經(jīng)有了,wechaty本身也有服務,我又該怎么做呢?這個問題困擾了我很久,總之,還是因為對docker環(huán)境不了解。
幾番周折查找,原來就在docker run命令里面設置一個參數(shù)就能解決。
-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());
再添加一段監(jiān)聽日志代碼:
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
看到監(jiān)聽日志打出來了,也有微信消息。 在瀏覽器中訪問localhost:8888, Hello World!
到這里了,暴露接口不就是順手拈來的事情了么!
后續(xù)
到此,基本上開發(fā)就是這樣了,跟平常做node開發(fā)一樣。最后,就是看是否需要將開發(fā)的內容打包成鏡像發(fā)布,還是直接就這樣運行就行了。打包鏡像的話,就是注意Dockerfile的配置,進行docker build。