这个方案使用了docker的–restart always参数,以及memory-card.json,wechaty严重错误出现Exit(1)导致程序崩溃后,能够自动用上次登录的微信号重新启动服务,代码更新后,只需要restart一下容器即可更新至最新代码。
自有镜像
镜像名称:minirplus/wechaty
- 基础镜像:wechaty/wechaty:0.73
说明:目前跟随官方镜像,以下内容均可以使用官方镜像替换wechaty/wechaty
安装方法
安装docker
已有docker可跳过此步
1 |
apt update && apt upgrade -y && apt install curl -y && curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh |
测试用例
测试程序,官方用例,example-bot.js
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 |
import { Wechaty,ScanStatus,log, } from 'wechaty' import qrcodeTerminal from 'qrcode-terminal' function onScan (qrcode, status) { if (status === ScanStatus.Waiting || status === ScanStatus.Timeout) { qrcodeTerminal.generate(qrcode, { small: true }) // show qrcode on console const qrcodeImageUrl = [ 'https://wechaty.js.org/qrcode/', encodeURIComponent(qrcode), ].join('') log.info('StarterBot', 'onScan: %s(%s) - %s', ScanStatus[status], status, qrcodeImageUrl) } else { log.info('StarterBot', 'onScan: %s(%s)', ScanStatus[status], status) } } async function main () { const bot = new Wechaty(({name: 'example-bot',puppet: 'wechaty-puppet-wechat',})) bot .on('scan', onScan) .on('login', user => console.log(`User ${user} logged in`)) .on('message', message => console.log(`Message: ${message}`)) await bot.start() } main() .catch(console.error) |
将以上代码保存为/root/wechaty/example-bot.js,或自定义路径,但是记得修改后续路径
测试运行
1 |
docker run -ti --rm -v /root/wechaty:/bot minirplus/wechaty example-bot.js |
运行后,用微信扫码登录。
生产运行
创建生产wechaty容器
1 |
docker run -d --restart always -v /root/wechaty:/bot --name wechaty minirplus/wechaty example-bot.js |
注意,其中
-d,后台运行(必填)
–restart always,程序崩溃后自动重启(必填)
-v /root/wechaty:/bot,是指定工作目录为/root/wechaty(必填)
example-bot.js,指定运行的入口名称,注意,这里入口的真实路径为/root/wechaty/example-bot.js,替换为生产程序入口即可(必填)
扫二维码登录微信
如果是首次执行程序,需要连入容器的logs,进行扫码登陆
1 |
docker logs -f wechaty |
输出及查看实时日志
在程序中使用类似 console.log(`Message: ${message}`)) 即可输出日志,但是是没有时间戳的。
如果需要按日志格式输出,可以加载wechaty内置的log模块来格式化日志输出
1 2 |
import { Wechaty,log,} from 'wechaty' log.info('StarterBot', 'Starter Bot Started.')) |
输出的日志类似 02:58:05 INFO StarterBot Starter Bot Started.
查看日志和上面的登录微信方法一样,唯一的区别是可能日志太多,需要加一个时间限制,这里用–since=5m来同步5分钟前的历史日志,-f同步显示实时日志。
1 |
docker logs -f --since=5m wechaty |
自动重启方案原理
wechaty会自动保存上次扫码登陆的用户信息,但是前提是需要在创建bot的时候设置bot的名称
1 |
const bot = new Wechaty(({name: 'example-bot',})) |
之后,每次崩溃后自动重启容器,都不需要再重新扫码登陆了
然后,当我们代码有更新,需要重启容器的时候,基于上述的原理,只需要刻意导致程序崩溃即可,可以在代码中植入一个崩溃点
例如,可以绑定一个当接收到 #restart 消息时,返回一个web登录不支持的url链接 await msg.say(urlLink); ,容器就会崩溃然后自动重启,达到了发送命令重启容器的目的
Know More
什么是wechaty?
微信机器人,自动回复、定时消息
There are no comments yet