你想天天定时向你的女友发一句早安吗?前端
wechaty
是一个使用 typescript
开发的机器人,我已经使用 wechaty 作了不少关于有趣的自动化的工做。node
你能够经过 wechaty
把你的微信变成一个机器人,若是你有两个微信号的话,那就收获了一枚机器人小助手。经过编程的手段与它接入基金与股票的接口,再加一个两点半的定时任务,这样小助手就能够在天天收盘前给你发一个最近的基金趋势信息供你选择。git
你还能够把你的经常使用公众号挂一个机器人,天天早上七点左右向你的女友道一句早安,这样她就会在天天醒来时对你的问候充满期待。程序员
哦对,忘了,程序员是没有女友的。github
好了,来实现一个机器人吧。接下来本篇文章开始介绍微信机器人的常见使用场景,及如何用代码来把你的微信变成小助手。面试
加我微信前端交流群的小伙伴们知道我有一个小机器人在管理着群,天天定时推送面试题。而这个微信机器人就是我本身敲代码实现的,今天讲一讲如何实现一个简单机器人。typescript
我经过
wechaty
也实现了一个自娱自乐的机器人编程
- 自动推送文章
- 自动推送技术面试题并在群里讨论
- 基金、天气预报、百科、名言、诗词等自动回复及每日推送功能
部分代码开源在 wechat-bot,欢迎来玩小程序
另外也欢迎加入个人前端交流群,添加微信
shanyue-bot
api
先来瞅一眼,常见的微信操做,而这些均可以经过机器人来完成
关于机器人的应用,我总结为三个大方面
若是中小企业内部有私域流量需求并把微信群做为私域流量池,经过微信机器人的社群管理、智能对话及定时任务可增强管理效率。对于我的开发者来讲,你能够经过智能对话及定时任务把它做为一个开发版的日历及通知服务。
关于这三个应用场景的技术实现,将在如下代码中涉及到
使用 wechaty 经过几行就能够写一个具备核心功能的微信机器人
import { Wechaty } from 'wechaty'
const bot = new Wechaty({
// 微信机器人使用了 iPad 协议登陆,puppet 为 `PuppetPadplus`
puppet: new PuppetPadplus(),
name: 'daxiange'
})
bot
.on('scan', (qrcode, status) => console.log(`Scan QR Code to login: ${status}\nhttps://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(qrcode)}`))
.on('message', message => console.log(`Message: ${message}`))
.start()
复制代码
把以上文件存为 index.ts
,此时须要一个 token 来运行它。
$ WECHATY_PUPPET_PADPLUS_TOKEN=HELLOSHANYUE ts-node index.ts
复制代码
若是你须要得到一个永久的 token,能够参考这里:github.com/juzibot/Wel…
你能够在这里得到更全面的开发文档: wechaty.github.io/wechaty/
须要注意的是,目前 wechaty
版本是 0.41
,须要 Node 版本最小为 node12
。
毕竟如今 node12
已是处于活跃期的 LTS,node10
已进入维护期,因此赶快升级 node 版本吧。
import { Friendship } from 'wechaty'
bot
.on('friendship', handleFriendShip)
const handleFriendShip = async (friendship) => {
// 若是是添加好友请求
if (friendship.type() === Friendship.Type.Receive) {
// 经过好友请求
await friendship.accept()
const room = await bot.Room.find({ topic: 'wechat' })
if (room) {
try {
// 添加好友入群
await room.add(friendship.contact())
} catch(e) {
console.error(e)
}
}
}
复制代码
智能对话,简单来讲就是你一嘴,我一嘴。
与微信公众号开发自动回复差很少,你能够经过自定义关键词来回复
// index.ts
bot
.on('message', message.handleMessage)
// message.ts
const defaultRoute = { keyword: '', handle: covid.keyword }
const routes = [
{ keyword: '基金', handle: fund.topFund },
{ keyword: '面试', handle: interview.randomQuestion },
{ keyword: '文章', handle: recentArticle },
defaultRoute
]
async function reply (msg: Message, _data) {
const data = _.concat(_data)
for (const text of data) {
if (text) {
await msg.say(text)
}
}
}
export async function handleMessage (msg: Message) {
// 若是收到了文本消息
if (msg.type() === Message.Type.Text) {
// 若是不是微信群
if (!msg.room()) {
const text = msg.text()
// 经过用户回复关键字,进行路由处理,找到对应的处理函数
const route = routes.find(route => {
return text.includes(route.keyword)
}) || defaultRoute
const data = await route.handle(text)
await reply(msg, data)
}
}
}
复制代码
定时任务应该是社群运营中最常使用的功能之一了,以下
固然,对于我的来讲,也能够作一作每日两点半股票基金推荐的消息推送等等有趣的功能。
关于定时任务代码以下,使用了一个简单的非分布式的定时任务库 node-cron。
// index.ts
import { schedule } from './schedule'
bot
.start()
.then(() => {
schedule(bot)
})
// schedule/index.ts
import { Wechaty } from 'wechaty'
import articleBot from './article'
export async function schedule (bot: Wechaty) {
await articleBot(bot)
// await schedule1(bot)
// await schedule2(bot)
}
// schedule/article.ts
// 定时定点群发消息
import { Wechaty } from 'wechaty'
import { CronJob } from 'cron'
export default async (bot: Wechaty) => {
return new CronJob('13 12 * * *', async () => {
const rooms = await bot.Room.findAll()
const article = await recentArticle()
await pMap(targetRooms, async room => {
await room.say(article)
}, {
concurrency: 6
})
}, null, true, 'Asia/Shanghai')
}
复制代码
异常处理在某种程度上比应用系统更加剧要,否则有可能应用挂掉了 N 天都不知道。
sentry
是一个关于异常上报的系统,而且提供完善的 SDK
及文档,经过 sentry
能够对机器人添加警报着重监听如下事件。
unhandledPromiseRejection
异常bot.on('error')
事件并报告异常Sentry.init({
dsn
})
bot.on('error', (error) => {
Sentry.captureException(error)
})
复制代码
最后记着开通了 Sentry
的 Alerts,否则异常爆满了都收不到邮件。
经过 wechaty
开发机器人能够很轻松实现如下功能并做为私域流量管理,并扩展来更多的好玩的有趣的事儿
我经过 wechaty
也实现了一个自娱自乐的机器人,部分代码开源在 wechat-bot,欢迎来玩
但前提是你须要有一个 WECHATY_PUPPET_PADPLUS_TOKEN
,你能够经过 开发者支持 来得到免费 Token
扫码添加个人微信,备注进群,加入高级前端进阶群
另外,欢迎关注公众号 【互联网大厂招聘】 接收各大厂招聘信息,直达大厂负责人。若是你是技术负责人,欢迎投递内推信息。