iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 28
1
Modern Web

從零開始認識 Node.js系列 第 28

[Day 28] 動手篇 - 「LINE BOT ,回話!」

已讀不回

本文

今天直接進入主題!

  1. Example Code 延續 [Day 26] 動手篇 - I have a Line Bot,I have a Koa Webhooks (2)

  2. 安裝 Request package ( npm install request request-promise --save )

    • request-promise 是 request 的 promise 版
      • 使用時需要安裝 request ,否則無法使用;原因可能是 request 沒有包進 request promise 裡
    • 安裝此 package 的原因是當 User 傳訊息給 Bot , Webhooks 收到 User Request 並經過解析後,我們需要發一個 User Request 給 Line ,告訴它要回覆什麼訊息給 User
  3. 下述動工的 Code 放進 Webhooks 或自定義的 Webhooks 裡

  4. User 傳得訊息會放在 Webhooks 收到的 Request 裡的 body.events ,內容大致長這裡

    {
      "events": [
        {
          "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
          //  User 傳訊息的型態
          "type": "message",
          "timestamp": 1462629479859,
          "source": {
            "type": "user",
            "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
          },
          "message": {
            "id": "325708",
            // 若外層的型態是 message 才會有再細分,詳細一樣可以從上述說明取得
            "type": "text",
            // User 傳過來的訊息內容
            "text": "Hello, world"
          }
        },
        {
          "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
          "type": "follow",
          "timestamp": 1462629479859,
          "source": {
            "type": "user",
            "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
          }
        }
      ]
    }
    

動工

這裡以 message 當範例,想知道更多可以使用的回覆格式看 這裡

// 使用 Request Promise 發送自定義的訊息
const request = require('request-promise');

// Line Bot 的 Channel Token
const lineBotToken = '...';

// 收到 User Request 時要發回給 User 的訊息放這裡
router.post('/webhooks', function *(ctx, next) {
  // User 給 Bot 的訊息是一個 Array
  const userMessages = ctx.request.body.events;
  
  // 準備回覆給 User 的訊息
  let replyMessages = [];
  replyMessages = userMessages.map((currentReplyMessages, userMessage) => {
    // 等下放我們要回給 User 的訊息,一次最多 5 則
    let messages;

    // User 傳來的訊息型態
    if ( userMessage.type === 'message' ) {
      messages = [
        {type: 'text', text: '你成功了!我回你就是了'},
        {type: 'image', originalContentUrl: 'http://i.imgur.com/xjTET8v.jpg', previewImageUrl: 'https://sdl-stickershop.line.naver.jp/stickershop/v1/product/1179553/iphone/main@2x.png'},
      ];
      
    }
    else {
      messages = [{type: 'text', text: '收到囉!'}];
    }
    
    // request 的 options
    let options = {
        method: 'POST',
        uri: 'https://api.line.me/v2/bot/message/reply',
        // 客制化 headers 內容,主要告訴 Line 收到的訊息格式和 Line Bot 的 Token
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${lineBotToken}`,
        },
        body: {
          // 告訴 Line 這個訊息回覆給誰
          replyToken: userMessage.replyToken,
          messages: messages,
        },
        json: true,
      };

    return request(options);
  });
  
  // 訊息處理好就等待所有 Request 發送出去
  yield Promise.all( replyMessages );
  
})
...

補充

若你和我一樣加回覆功能會再去 Line Bot 確認 Webhooks 是否正確的話,如果 Request 收到的 replyToken00000000000000000000000000000000ffffffffffffffffffffffffffffffff 請略過,因為這兩個 replyToken 是 Line Bot Webhooks 送出來的假 Token ,對這兩個 Token 回覆會導致 Webhooks 收到錯誤而顯示錯誤!

後記

Yeah! Line Bot 會回訊息,接下來相信就是大家發揮自己想法的時候!


上一篇
[Day 27] 動手篇 - Deploy Webhooks
下一篇
[Day 29] 動手篇 - Give me TEST AUTOMATION!
系列文
從零開始認識 Node.js31

1 則留言

0
King Tzeng
iT邦新手 4 級 ‧ 2016-12-28 12:20:56

好酷喔!!

看更多先前的回應...收起先前的回應...

PHP 可以用官方的 SDK ,步驟比 Node.js 簡化許多,妳也可以打造一個自己的 Line Bot

Line Bot - PHP SDK

weiclin iT邦高手 4 級‧ 2016-12-28 13:02:11 檢舉

我這裡有一個簡化官方 PHP SDK 用法的小玩具 https://github.com/weichenlin/LineBusType76

我有同事是用telegram寫寶可夢搜尋機器人XD
有空來玩玩~沒想到line也可以這樣完XD
謝謝Ivan大大^^

暫時捨棄 Telegram ,本來它是首選 :p

[Day 17] 動手篇 - 事前規劃 這篇我有說到選 Line Bot 的原因,其他日後在找時間玩玩 XD

我要留言

立即登入留言