記一次 wechaty running on docker 之旅

開始

當被告知要結合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。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一、Docker 簡介 Docker 兩個主要部件:Docker: 開源的容器虛擬化平臺Docker Hub: 用...
    R_X閱讀 4,508評論 0 27
  • Docker簡介Docker是一個由GO語言寫的程序運行的“容器”; 目前云服務的基石是操作系統(tǒng)級別的隔離,在同一...
    gakiww閱讀 647評論 0 0
  • Docker基礎資料 安裝docker $ sudo apt-get install docker.io 查看本地...
    Sherry鳳閱讀 533評論 0 0
  • 查看系統(tǒng)信息 幫助: 我們可以看到運行結果如下圖所示。如果之前有學習過 docker 相關知識的同學,可能會發(fā)現(xiàn)一...
    夸克星閱讀 1,279評論 0 0
  • 月光穿過身體 在去往遠方的路上 遺下一疊浩浩蕩蕩的影子 只有一個不低頭看路的孩子 搭上了月亮的風車 星星們窺探出他...
    阿什塔爾閱讀 441評論 3 4

友情鏈接更多精彩內容