你想天天定時向你的女友發一句早安嗎?前端
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
掃碼添加個人微信,備註進羣,加入高級前端進階羣
另外,歡迎關注公衆號 【互聯網大廠招聘】 接收各大廠招聘信息,直達大廠負責人。若是你是技術負責人,歡迎投遞內推信息。