動手做個 AI 機器人,幫我回訊息!

程式設計師魚皮發表於2021-12-20

大家好,我是魚皮,自從做了知識分享,我的微信就沒消停過,平均每天會收到幾百個訊息,大部分都是學程式設計的朋友向我諮詢程式設計問題。

但畢竟我只有一個人,沒法所有訊息都一個個回覆,所以也是很愧疚和無力吧;另外我發現,大家的很多問題是重複的,而且大多數我都專門寫文章來回答過。

所以,我決定自制一個 AI 問答機器人,幫我自動回覆大家的常見問題,減少重複工作。

結果沒想到,製作過程中被 Bug 坑慘了,鬧了不少笑話,感興趣的朋友可以看看視訊哈哈:

地址:https://www.bilibili.com/video/BV1Vq4y1B7zu/

由於製作方法實在太簡單,所以給大家分享下完整的教程,讓大家也能輕鬆製作自己的 AI 機器人。

自制 AI 機器人教程

預計整個製作過程 10 分鐘

先描述下需求:做一個能夠自動回答微信訊息的機器人。

要實現這個需求,有兩個要點:

  1. 如何讓程式接收到微信發來的訊息?
  2. 如何根據訊息來回復對應的內容?

這兩個問題,如果沒有一定的專業知識,是很難自行解決的。但如今是開源的時代,我們可以站在巨人的肩膀上,用現成的技術來解決這些問題。

接受訊息

可以使用開源的 wechaty 庫來實現對微信的自動化操作,比如收發訊息、通過好友、拉群等。

開源微信機器人庫

使用方法很簡單,在 wechaty 倉庫的專案介紹檔案中,有最簡單的入門示例程式碼,只需要 6 行程式碼 ,就能啟動一個幫你接受訊息的機器人!

wechaty 支援幾乎所有主流的程式語言,其中 JavaScript 的入門程式碼如下:

import { WechatyBuilder } from 'wechaty'
// 啟動
WechatyBuilder.build()
  .on('scan', (qrcode, status) => console.log(`Scan QR Code to login: ${status}\nhttps://wechaty.js.org/qrcode/${encodeURIComponent(qrcode)}`))
  .on('login',            user => console.log(`User ${user} logged in`))
  .on('message',       message => console.log(`Message: ${message}`))
  .start()

解釋一下上述程式碼,你會發現,wechaty 中定義了很多事件,比如掃碼、使用者登入、接受訊息、接受好友請求等。你不需要關心事件是如何被它觸發的,只需要針對不同事件來編寫處理方法就好,比如收到訊息後自動回覆同樣的訊息,示例程式碼如下:

// 初始化機器人
const bot = WechatyBuilder.build({
  name: 'yupi-wxrobot',
  // 用於相容不同 IM 協議,不用關心
  puppet: 'wechaty-puppet-wechat',
})
// 處理訊息
bot.on('message', async function (msg) {
  // 獲取訊息傳送人
  const contact = msg.talker()
  // 獲取訊息內容
  const text = msg.text()
  // 獲取群聊資訊
  const room = msg.room()
  // 是私聊
  if (contact && text) {
    // 回覆相同內容
    msg.say(text, contact);
  }
}

但是,大家 千萬不要 直接執行上述程式碼!因為一旦你啟動了機器人、又沒有限制回覆者暱稱的話,它會對所有給你發訊息的人生效!

我剛開始沒注意,就被坑了。。。

所以,如果你只想自動回覆某人或某群聊的訊息,記得在程式碼中補充相應的過濾邏輯,比如:

// 處理訊息
bot.on('message', async function (msg) {
  // 獲取訊息傳送人
  const contact = msg.talker()
  // 獲取訊息內容
  const text = msg.text()
  // 獲取群聊資訊
  const room = msg.room()

  // 不處理自己的訊息
  if (msg.self()) {
    return
  }
  // 群聊還是私聊
  if (room) {
    if(room.topic() === '魚皮群') {
      // 回覆
    }
  } else {
    if(contact.name() === '小號') {
      // 回覆
    }
  }
}

OK,使用上述程式碼,就能實現接受訊息和自動回覆啦!

那麼你是否好奇,wechaty 是如何接受到微信訊息的呢?其實原理很簡單,執行 wechaty 程式時,它會利用無頭瀏覽器技術悄悄開啟一個網頁版微信,然後在你執行程式的控制檯彈出微信網頁版的登入二維碼,在你掃碼登入後,程式只需要監聽頁面元素的變化、或者自動觸發點選事件即可。

網頁版微信

其實道理很簡單,就是把我們能對網頁進行的人工操作轉化為後臺自動化執行。

智慧回覆

第一個問題解決了,那麼如何根據不同的問題給出不同的回覆呢?

很多同學肯定上來就說 AI,那都是被我用的 “智慧” 一次帶偏了。其實如果只是簡單的自動回覆,問題規則可收斂、可列舉的情況下,直接用 if ... else ... 就能解決了!

if(/你好/.test(text)) {
  msg.say('好的');
} else if (/謝謝/.test(text)) {
  msg.say('不客氣');
} else if (/加群/.test(text)) {
  msg.say('公眾號[程式設計師魚皮],回覆[加群]');
} else {
  msg.say('我不懂');
}

不是說人工智慧的本質就是 if else 麼哈哈,只不過是讓機器來幫你去做 if else 而已。

但現實是,我的讀者對於同一個問題也會有不同的表達方式,比如 “怎麼學 Java?”、“我想學 Java,怎麼學?” 等等。因此,還是需要人工智慧登場了。

到哪裡去搞人工智慧呢?

我們可以直接利用 微信對話開放平臺 提供的強大能力,一行程式碼都不用寫,就能免費實現智慧對話!

地址:https://openai.weixin.qq.com/

登入後先建立一個機器人:

建立機器人


然後可以為機器人新增技能,你可以自定義技能,向機器人灌輸指定的問題和回答;也可以直接使用平臺提供的預設技能,比如聽歌、聊天、百科等:

配置技能

我的需求是自動回答讀者的程式設計相關問題,因此需要建立一個新技能。在這裡,可以靈活地自定義題目、不同的問法以及回答,全部用介面操作即可,輕鬆打造你的專屬機器人:

自定義技能

配置好之後,就可以釋出和使用機器人了。我們可以將機器人和公眾號 / 小程式繫結,自動回覆讀者訊息;可以直接在 H5 網頁中接入智慧客服;還可以在程式中呼叫開放介面來使用智慧對話能力:

釋出和使用

此處我們希望在 wechaty 程式中自動獲得回覆,所以要使用 開放介面 的方式,也很簡單,就是用個請求庫去呼叫介面,示例程式碼如下:

// 獲取 API 簽名,2小時過期
// token 需從平臺獲取
const url = `https://openai.weixin.qq.com/openapi/sign/${token}`;
const {signature} = (await axios.post(url, {
    userid: 'test'
})).data;

// 呼叫 AI 介面,獲取答案
async function getAnswer(userid, text) {
  const apiUrl = `https://openai.weixin.qq.com/openapi/aibot/${token}`;
  return (await axios.post(apiUrl, {
    "signature": signature,
    "userid": userid,
    "query": text,
  })).data?.answer;
}

大概就是這樣,又簡單又實用,感興趣的同學可以用它來做出很多有趣的功能~


我是魚皮,肝文不易,有幫助的話還希望能給個 點贊 支援下,謝謝大家。

相關文章