如何建立LineBot圖文選單

一般的chat,像是Line或是messenger都是屬於文字介面,我之前有介紹過LineBot也可以透過程式來產生文字選單,但是最多只能產生四個選單,且選單也是文字介面,並且會隨著聊天室的聊天訊息一多而慢慢被頂到畫面外面。(請參閱:LineBot也可以做觸控選單)。

2017年10月,在Line裡也可以有圖文的選單了,而且不需要靠程式便能在Line的聊天室產生。有了這個圖文選單的選項,很多事情都能夠用LineBot很方便的控制一些東西了,例如控制電器用品開關、遠端遙控視訊監控或是控制自走車等等,都不需要另外寫手機的app,直接用大家手機都有的Line就可以搞定一切。我能夠想到的應用還有可以設計餐廳的點單系統,使用者用Line就可以在手機訂餐,選定主餐、湯品、甜點、飯後飲料等,都可以在Line上面用選單來點餐。

以下的例子,就是以LineBot圖文選單的方式控制micro:bit自走車而不需要輸入任何的文字就可以輕鬆控制,有需要的朋友可以研究一下Line的圖文選單,為您創造LineBot的無限可能。

Line的圖文選單設定步驟

一、首先必須要有LineBot的帳號才可以製作圖文選單,申請LineBot的步驟請參考我之前的文章:如何申請LineBot

二、登入「LINE@MANAGER」,網址:https://admin-official.line.me/

三、選擇要新增圖文選單的LineBot帳號

四、點選圖文選單,建立新頁面,便可進入新增圖文選單的畫面

五、開始建立圖文選單,在建立之前,要先設計好圖文選單的圖片;如果沒時間設計,也可以在底下選擇以「文字+圖標」的方式建立圖文選單。

六、建立好並儲存後,在Line上進入和這個LineBot的聊天室,便馬上可以看到您建立的圖文選單了,按一下,測試一下正不正常。

用Line的圖文選單控制自走車

在這裡用Line控制micro:bit自走車為例:

一、須要準備的東西:

1.二個micro:bit(一個連接電腦,發射廣播訊號,一個放在自走車上控制馬達)

2.一個micro:bit的馬達擴展板:KSB037

3.一台雙馬達的自走車

二、LineBot程式必須放在個人電腦裡(raspberry pi 也行),用序列埠連接一個micro:bit,主要是傳送訊號給自走車的micro:bit,相關的資訊請參看我之前的文章:LineBot控制micro:bit。LineBot程式請取名叫index.js,程式內容如下:

var linebot = require('linebot');
var express = require('express');
var SerialPort = require('serialport');
var bot = linebot({
  channelId: '這裡改成自己Line的channelId',
  channelSecret: '這裡改成自己Line的channelSecret',
  channelAccessToken: '這裡改成自己Line的channelAccessToken'
});
//以下的com5請自行修改成自己的micro:bit和電腦連接時的com port名稱
//但是baudRate,115200的值,請勿修改
var mySerial = new SerialPort('com5', {baudRate: 115200});
const Delimiter = SerialPort.parsers.Delimiter;
var myId;
const parser = mySerial.pipe(new Delimiter({ delimiter: Buffer.from('\n') }));

//LineBot處理文字訊息的函式
//這一段的程式是專門處理當有人傳送文字訊息給LineBot時,我們的處理回應
bot.on('message', function(event) {
  if (event.message.type = 'text') {
    myId=event.source.userId;
    var msg = event.message.text;
    console.log(msg);
    sendToMicrobit(msg);
  }
});

function sendToMicrobit(msgFromLine){
  var myMsg='';
  if (msgFromLine=='溫度')
     myMsg='temperature\n';
  else if (msgFromLine=='前進'){
     myMsg='foreward\n';
  } else if (msgFromLine=='後退'){
     myMsg='backward\n';
  } else if (msgFromLine=='左轉'){
     myMsg='leftward\n';
  } else if (msgFromLine=='右轉'){
     myMsg='rightward\n';
  } else if (msgFromLine=='停車'){
     myMsg='stop\n';
  }
  if (myMsg!=''){
     if (msgFromLine!='溫度')
        bot.push(myId,msgFromLine+'中......');
        mySerial.write(myMsg, function(err) {
           if (err) {
              return console.log('Error on write: ', err.message);
           }
           console.log('訊息已傳送至micro:bit:'+myMsg);
        });
  }
}

parser.on('data', function (data) {
  var myString=data.toString();
  console.log('Data:',myString);
  if (myString.startsWith('temperature')){
     myString=myString.replace('temperature','溫度');
  } else if (myString.startsWith('light')){
     myString=myString.replace('light','光線');
  }  else if (myString==='A\r' || myString==='B\r'){
     myString=myString.replace('\r','')+'鍵已被按下!';
  }
  bot.push(myId,myString);
});

//LineBot處理使用者按下選單的函式
bot.on('postback', function (event) {
   var myMsg=event.postback.text;
   if (myMsg!=''){
      console.log(myMsg);
   }
});

const app = express();
const linebotParser = bot.parser();
app.post('/', linebotParser);

//因為 express 預設走 port 3000,而 heroku 上預設卻不是,要透過下列程式轉換
var server = app.listen(process.env.PORT || 8080, function() {
  var port = server.address().port;
  console.log("App now running on port", port);
});

三、和電腦連接的micro:bit,它的工作主要是將LineBot傳來的訊號送給micro:bit自走車,以及把自走車的訊號傳送給電腦裡的LineBot,在這個範例中是用廣播的方式,它的程式碼如下:

四、自走車上的micro:bit程式: