1.前置作業(以node js為例)

環境:

node版本:v6.11.0

npm版本:v3.10.10

express:4.X

2.安裝@line/bot-sdk

LINE官方有提供nodejs版本的SDK,可以到GitHub或使用npm指令安裝

npm install @line/bot-sdk

3.用express建立一個簡單的webhook應用程式

我們的程式資料夾最基本應該要長這樣:

打開app.js,首先我們導入3個必要的模組

const express = require('express'); //express web framework
const line = require('@line/bot-sdk');  //line sdk
const crypto = require('crypto');

定義必要的變數

const app = express(); //取得express實體
const client = new line.Client({
    channelID: 65464, //填入在Line developers得到的channel ID
    channelSecret:"your Channel Secret" //填入在Line developers得到的channelSecret金鑰
    channelAccessToken:"jowrwer" //填入在Line developers得到的channelAccessToken
});

接著設定webhook的路由,並指定該路由由line官方提供的SDK來parse request

//設定webhook路由
app.post('/webhook', line.middleware({ 
    channelID: 65464, //填入在Line developers得到的channel ID
    channelSecret:"your Channel Secret" //填入在Line developers得到的channelSecret金鑰
    channelAccessToken:"jowrwer" //填入在Line developers得到的channelAccessToken

}), (req, res) => {
    //後續處理...

});

parse完成後,我們還需要驗證這個request是否由LINE官方發出,而不是來自其他奇奇怪怪的地方

所以我們在後續處理的function加入header比對檢查。

根據LINE官方的文件,我們必須用crypto模組來產生對照組的header,需以sha256的方式加密,key則為channelSecret金鑰,update的data則為request,最後以base64編碼輸出。

app.post('/webhook', line.middleware({
  channelID:...//省略
}), (req, res) => {
    //後續處理
    let signInKey = '';
    try {
      //產生對照組header
      signInKey = crypto.createHmac('sha256', your_channelSecret).
      update(Buffer.from(JSON.stringify(req.body)), 'utf8').digest('base64');
    } catch (e) {
      //產生失敗的處理
    }

    //比對產生出的header是否與line官方的header相符,不符就回傳錯誤
    if(signInKey !== req.header('x-Line-Signature')){ 
      return res.send(error);
    }
});

驗證的作業結束後,就可以開始撰寫ChatRobot的具體行為了!這裡我們來建立一個簡單的應聲蟲程式!

首先建立一個function,並能夠傳入一個參數,這項參數為使用者傳送過來的訊息內容

接著是要作為回應的物件,這個物件的格式必須按照LINE官方文件給出的規範,這裡以純文字作為範例

function handleEvent(event) {
    let cReply = { //建立回應訊息
      type: 'text',  
      text: `你剛才說了"${event.message.text}"`
    };
}

type : 回應的種類,除了一般的純文字、貼圖以外,chatRobot還擁有其他種類,詳細可以參考官方文件

text : 回應的訊息內容,此項會根據type而改變。

接著寫一個簡單的判斷,我們判斷使用者傳送過來的訊息種類是不是文字訊息

是的話,機器人就會回應:你剛才說了XXX;不是的話,機器人就回應:"拍謝,看不懂" 的文字訊息

function handleEvent(event) {
    let cReply = { //建立回應訊息
      type: 'text',  
      text: `你剛才說了"${event.message.text}"`
    };
    //判斷發送過來的訊息種類
    if (event.type !== 'message' || event.message.type !== 'text') {
      cReply.text = '拍謝,看不懂';
    }
    return client.replyMessage(event.replyToken, cReply);//回覆訊息
}

應聲蟲的程式完成後,我們回到剛才路由的部份,在回應上呼叫剛剛完成的應聲蟲程式

app.post('/webhook', line.middleware({  
  channelID:...//省略
}), (req, res) => {
    //後續處理省略
    return res.json(handleEvent(req.body.events[0]));
});

最後開啟webServer,並自定port,此處port設為3060

app.listen(3060, () => {
      console.log(`Webhook listening on 3060`);
});

做到這裡,我們的應聲蟲應用程式完成了!下一章,我們就準備將他佈署到伺服器上!

results matching ""

    No results matching ""