你想天天定時向你的女友發一句早安嗎? 教你開發一個微信機器人

你想天天定時向你的女友發一句早安嗎?前端

wechaty 是一個使用 typescript 開發的機器人,我已經使用 wechaty 作了不少關於有趣的自動化的工做。node

你能夠經過 wechaty 把你的微信變成一個機器人,若是你有兩個微信號的話,那就收穫了一枚機器人小助手。經過編程的手段與它接入基金與股票的接口,再加一個兩點半的定時任務,這樣小助手就能夠在天天收盤前給你發一個最近的基金趨勢信息供你選擇。git

你還能夠把你的經常使用公衆號掛一個機器人,天天早上七點左右向你的女友道一句早安,這樣她就會在天天醒來時對你的問候充滿期待。程序員

哦對,忘了,程序員是沒有女友的。github

好了,來實現一個機器人吧。接下來本篇文章開始介紹微信機器人的常見使用場景,及如何用代碼來把你的微信變成小助手。面試

加我微信前端交流羣的小夥伴們知道我有一個小機器人在管理着羣,天天定時推送面試題。而這個微信機器人就是我本身敲代碼實現的,今天講一講如何實現一個簡單機器人。typescript

我經過 wechaty 也實現了一個自娛自樂的機器人編程

  1. 自動推送文章
  2. 自動推送技術面試題並在羣裏討論
  3. 基金、天氣預報、百科、名言、詩詞等自動回覆及每日推送功能

部分代碼開源在 wechat-bot,歡迎來玩小程序

另外也歡迎加入個人前端交流羣,添加微信 shanyue-botapi

微信機器人應用場景及私域流量

先來瞅一眼,常見的微信操做,而這些均可以經過機器人來完成

  • 消息
    • 收發我的名片、文本、圖片、小程序、圖文消息
    • 轉發文本、圖片、小程序、圖文消息
  • 羣組
    • 建羣、設置羣公告、獲取羣二維碼
    • 拉人、踢人,並監聽相關事件
    • 羣列表、羣詳情、羣成員
  • 聯繫人
    • 添加好友、自動經過好友
    • 好友備註、詳情及列表信息

關於機器人的應用,我總結爲三個大方面

  1. 社羣管理,根據關鍵字自動動過好友,對好友自動分組,添加備註並拉入相對應的羣。
  2. 智能對話,稍微笨一點如回覆資料,智能一些能夠真人與人工智能結合,來處理各類諮詢問題
  3. 定時任務,天天定時定點在微信羣發送行業信息促進活躍度。若是是中學高校或教育集團,能夠發送昨日學員學習信息統計等

若是中小企業內部有私域流量需求並把微信羣做爲私域流量池,經過微信機器人的社羣管理、智能對話及定時任務可增強管理效率。對於我的開發者來講,你能夠經過智能對話及定時任務把它做爲一個開發版的日曆及通知服務。

關於這三個應用場景的技術實現,將在如下代碼中涉及到

開始寫第一個微信機器人

使用 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/

Node Version

須要注意的是,目前 wechaty 版本是 0.41,須要 Node 版本最小爲 node12

畢竟如今 node12 已是處於活躍期的 LTS,node10 已進入維護期,因此趕快升級 node 版本吧。

Node Release

社羣管理

  • 自動經過好友
  • 自動拉人入羣
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)
    }
  }
}
複製代碼

定時任務

定時任務應該是社羣運營中最常使用的功能之一了,以下

  1. 每日九點統計羣活躍度信息
  2. 每日十點羣發每日資訊。結合公衆號能夠羣發公衆號內圖文信息,爲企業內公衆號甚至C端產品進行促活
  3. 每日十點向微信羣管理人員發送網站運營數據,如 UV/IP,活躍用戶數,新增用戶數,新增付費 (此類功能可用郵件及釘釘機器人替代,各有優劣)
  4. 備忘錄提醒功能,如每日十點半運營覆盤大會

固然,對於我的來講,也能夠作一作每日兩點半股票基金推薦的消息推送等等有趣的功能。

關於定時任務代碼以下,使用了一個簡單的非分佈式的定時任務庫 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 能夠對機器人添加警報着重監聽如下事件。

  1. 自動捕捉 unhandledPromiseRejection 異常
  2. 監控 bot.on('error') 事件並報告異常
Sentry.init({
  dsn
})

bot.on('error', (error) => {
  Sentry.captureException(error)
})
複製代碼

最後記着開通了 Sentry 的 Alerts,否則異常爆滿了都收不到郵件。

總結

經過 wechaty 開發機器人能夠很輕鬆實現如下功能並做爲私域流量管理,並擴展來更多的好玩的有趣的事兒

  1. 社羣管理
  2. 智能對話
  3. 定時任務

我經過 wechaty 也實現了一個自娛自樂的機器人,部分代碼開源在 wechat-bot,歡迎來玩

但前提是你須要有一個 WECHATY_PUPPET_PADPLUS_TOKEN,你能夠經過 開發者支持 來得到免費 Token

關注我

掃碼添加個人微信,備註進羣,加入高級前端進階羣

加我微信拉你進入面試交流羣

另外,歡迎關注公衆號 【互聯網大廠招聘】 接收各大廠招聘信息,直達大廠負責人。若是你是技術負責人,歡迎投遞內推信息。

更多大廠招聘,面試面經,技能要求,請關注公衆號【互聯網大廠招聘】
相關文章
相關標籤/搜索