LINE Bot聊天機器人程式開發教學(七):從ESP8266/Arduino控制板觸發Line發布訊息

美國亞馬遜Amazon購物商城於2015年三月底推出名叫Dash Button的物聯網裝置,它是一個無線聯網的按鈕,按一下按鈕就能下單購買該按鈕代表的商品:

Amazon Dash Button

本文將使用ESP8266控制板(如:NodeMCU或Wemos D1 mini)製作「一鍵」發Line訊息的物聯網按鈕。假設在廚房放一個物聯網按鈕,按下它就發Line通知老公洗碗;在門口放一個按鈕,按一下Line就會發送空氣品質訊息;把按鈕改成「磁簧開關」安裝在門窗,或者「PID人體紅外線偵測器」,這個小裝置就變成防盜器,若門窗被打開,Line就會發送入侵通知。

從ESP8266控制板觸發Line發送訊息

透過Line推送(push)與群發(multicast)訊息

Line開發者帳號支援推送訊息功能,指令語法如下:

psuh(推送)訊息指令

其中的使用者ID並不是Line App的「個人資料」欄位裡顯示的ID,而是Line指派的唯一識別碼,你可以在你的Line應用程式的Channel settings(頻道設定)頁面QR Code下方的Other(其他)單元看到你的Line ID:

Line使用者ID

或者,對「LINE Bot聊天機器人程式開發教學(六):讀取並傳回空氣品質狀況給使用者」文章的Line聊天機器人發送‘Me’訊息,它也會回覆你的Line ID。「訊息物件」的「訊息類型」,可以是文字、圖像、貼圖…等格式,詳請參閱Line技術文件的Message objects單元

若要同時發送訊息給多人,可先用陣列存放使用者的Line ID

用陣列存放使用者的Line ID

再透過multicast()方法傳送訊息:

multicast()方法傳送訊息

底下的程式片段將會同時發送文字和圖像

其中的「預覽圖像」尺寸上限240 x 240,檔案大小不得超過1MB;「原始圖像」尺寸上限1024 x 1024,檔案大小不得超過1MB,詳閱Line API文件的image單元

由於本文使用的Heroku雲端應用程式平台不支援寄存圖檔,所以筆者直接引用放在本網站裡的圖片。你可以先把圖檔上傳到flikr, dropbox, google drive….等任何雲端儲存空間,再分享網址給你的Line程式使用。

處理ESP8266訊息發送請求的Node.js程式

假設我們打算佈署3個連接Line的ESP8266控制板,為了區別這些板子,每個控制板都被設置了唯一的識別名稱

設置唯一識別名稱的ESP8266控制板

負責處理Line訊息的node.js程式,將新增一個處理/btn路徑的路由,並接收包含key(密碼)和id(裝置識別名稱)參數的查詢字串:

處理Line訊息的/btn路徑

設置密碼是為了避免Node路由被隨意觸發,處理/btn資源請求的node.js程式片段如下,若密碼錯誤,它將回應HTTP 401認證錯誤訊息,在網頁上顯示“ERROR!”;若密碼驗證成功,則在網頁上呈現接收到的識別名稱

處理/btn資源請求的node.js程式片段

加上推送Line訊息的程式碼如下,它將依據控制板傳入的識別名稱,決定要發送什麼訊息。

加上推送Line訊息的程式碼

底下是完整的node.js碼(index.js檔),請參閱「LINE Bot聊天機器人程式開發教學(六):讀取並傳回空氣品質狀況給使用者」文末的操作說明,將它上傳到Heroku雲端應用程式平台。

上傳到Heroku之後,你可以先用瀏覽器測試,輸入底下的網址,你的Line聊天機器人將會推送「洗碗」的訊息:

處理Line訊息的/btn路徑

觸發Line聊天機器人的ESP8266/Arduino程式

本範例程式修改自《超圖解物聯網IoT實作入門》第12章「讓NodeMCU扮演網路前端上傳資料(IFTTT)」一節,使用NodeMCU內建的Flash按鈕來觸發執行前端程式。

完整的ESP8266程式碼如下,請自行修改Heroku應用程式名稱,以及你在上文的Node.js程式裡面設定的密碼。此控制板的名稱設定成 “wash_dish”:

編譯並上傳到NodeMCU控制板後,開啟序列埠監控視窗,等待控制板Wi-Fi連線成功,再按下控制板的Flash按鈕,它將連結到你的Heroku應用程式並接收伺服器的回應,而Line機器人也將推送訊息給你。

序列埠監控視窗

延伸閱讀

16 thoughts on “LINE Bot聊天機器人程式開發教學(七):從ESP8266/Arduino控制板觸發Line發布訊息

  1. Hello Cubie,

    每次看完你的文章, 總是會想再把東西拿出來實作一遍. 想請教一下, 是否有想過出一本專門針對ESP8266的教學書?! 因為它真的CP值很高, 而且台灣針對ESP8266的教學書, 真的很少… 目前我只有看過一本而已. 超圖解的二本書籍我都入手了, 很期待你下一次的新作~~~

  2. 老師您好:
    在LINE Bot聊天機器人程式開發教學中,您使用了Heroku平台應用程式,有兩個問題想請教

    1. 如果Heroku平台應用程式未來不提供這個服務或是有修改這個服務的話的話,這個LINE Bot聊天機器人程式就失效了
    2. 如果要主動推送訊息給已經是line好友,很難去取得他們的user id,您提供了兩種方式去取得自己的user id如下
    (1) 在你的Line應用程式的Channel settings(頻道設定)頁面QR Code下方的Other(其他)單元看到你的Line ID:
    (2) Line聊天機器人發送‘Me’訊息,它也會回覆你的Line ID

    但是這兩種方式還是很不容易取得line好友的user id,等於必須要問好友的user id 是甚麼,不知道有沒有不用麻煩line好友就可以知道line好友的line user id的方式

    關於第一個問題,我想到的就是直接佈署在自己的樹莓派就可以了

    1. 1. 提供雲端應用平台和網站空間服務的公司很多,如果Heroku不存在了,換一家就好……我覺得這個機率比Line公司修改開發人員服務條款還要低,不用擔心。
      2. 使用者將Line聊天機器人加入好友之後,後端程式就能取得他們的User ID了,所以這應該不成問題。

      thanks,
      jeffrey

    2. 老師您好:
      在LINE Bot聊天機器人程式開發教學中,有一些問題想請教

      1. 雖然提供雲端應用平台和網站空間服務的公司很多,但是或多或少還是有些限制,

      (1)例如您在LINE Bot聊天機器人程式開發教學(七)文中提到Heroku雲端應用程式平台不支援寄存圖檔,
      (2)或者不支援MongoDB資料庫或MySQL資料庫的功能,
      (3)或者如果推送的型態視訊類型的話,我們把index.js佈署在樹苺派上,並且把網路攝影機接在樹莓派上,就可以將樹莓派錄好的視訊或串流的視訊推送給line好友,不知道是否可行

      2. 另外老師提到line好友加入Line聊天機器人後,可以透過後端程式取得line好友的User ID,不知道這個後端程式該如何撰寫呢?

    3. 1. 我二月份會更新文章說明佈署在樹莓派的方式。
      2. 附加照片的例子可用書本第六章的「雲端蒐證∕拍照自動寄送e-mail」範例來修改。
      3. group id和user id都位於Webhook事件物件的source物件裡面,Line官方的API文件有說明。

      thanks,
      jeffrey

  3. 老師您好:

    我把line機器人的Allow bot to join group chats選項設定成enable,並將line機器人加入我的line群組,群裡的人只要對群裡發 ‘空氣’ 文字和貼圖都會有反應,想請問這個line機器人也可以推送訊息、貼圖、影片、圖片、聲音到這個line群組嗎? 可是group id要如何取得呢?

    我參考了https://developers.line.me/en/docs/messaging-api/reference/#common-properties,還是沒看到,請老師指導一下,感謝老師的幫忙

  4. 老師您好:
    我改您的程式可以得到Group id

    case ‘Me’:
    event.source.profile().then(function (profile) {
    return event.reply(‘Hello ‘ + profile.displayName + ‘ ‘ + profile.userId);
    });
    break;
    case ‘Group’:
    event.reply(‘Hello ‘ + event.source.groupId);
    break;

    另外改

    const users = [‘XXXXXXXXXXXX’,
    ‘XXXXXXXXXXXX’];

    const groups = [‘XXXXXXXXXXXX’,
    ‘XXXXXXXXXXXX’];

    bot.push(groups, {
    type: ‘text’,
    text: msg
    });
    bot.push(users, {
    type: ‘text’,
    text: msg
    });

    並不需要用到multicast,謝謝

  5. 老師您好:

    在Line官方的API文件中,看到了以下:

    Get group member profile

    HTTP request
    GET https://api.line.me/v2/bot/group/{groupId}/member/{userId}

    Response
    1. displayName
    2. userId
    3. pictureUrl

    以及

    Get group member user IDs

    HTTP request
    GET https://api.line.me/v2/bot/group/{groupId}/members/ids

    Response
    1. memberIds
    2. next

    從老師的程式中增加了三項如下,因為程式佈署在Heroku平台,沒辦法看到終端機程式執行的結果,所以只能從
    line中去看結果,但是其中Group_member_profile 和 Group_user_ids 沒辦法顯示出來,所以想請教老師程式該如何修改,才能得到
    line群裡user的displayName,userId,pictureUrl以及line群裡所有人的memberIds

    case ‘Group’:
    event.reply(‘Hello ‘ + event.source.groupId);

    case ‘Group_member_profile’:
    bot.get(‘/group/’ + event.source.groupId + ‘/member/’ + event.source.userId).then(function (res) {
    return event.reply(res.json());
    });

    case ‘Group_user_ids’:
    bot.get(‘/group/’ + event.source.groupId + ‘/members/ids’).then(function (res) {
    return event.reply(res.json());
    });

  6. 老師您好

    在超圖解物聯網IoT書中第12-30頁中,有示範如何在區域網路中用網頁去控制連接在NodeMCU的LED的開關,
    請問如果改用line輸入文字來控制NodeMCU的LED開關,以老師這個LINE Bot聊天機器人程式該如何延伸修改呢?

    因為無法排版,所以硬體架構改用文字敘述,

    1. Led連接nodemcu,nodemcu無線連線到ip分享器
    2. 樹莓派(webhook url)無線連線到ip分享器
    3. ip分享器連上internet
    4. 在line上發送文字訊息透過internet連到ip 分享器及樹莓派上的webhook,webhook接收來自line的訊息,傳送http request 給nodemcu上的web server控制連接在nodemcu上的led

    謝謝老師

    1. 程式架構一樣,ESP8266當作Web Server,只是網頁端的程式改用Node.js的request模組連結家中的ESP8266控制板(此Node.js程式可放在Heroku)。

      為了讓外部程式透過IP位址連結到家中的控制板,你的IP分享器必須開啟虛擬非軍事區之類的服務,詳細設置步驟請參閱你的IP分享器說明書。

      thanks,
      jeffrey

    2. 老師您好

      在超圖解物聯網IoT書中第12-30頁中,有示範如何在區域網路中用網頁去控制連接在NodeMCU的LED的開關,我使用了在樹莓派的方式直接去控制同區域網路的NodeMCU上的LED,並使用了ngrok這個工具,讓我的樹莓派能直接使用https協定,並把ngrok產生https 的webhook設定在line Message API上,已經可以在line上用文字開關LED,這個做法好處是可以不用去設定ip 分享器的虛擬伺服器,且可以存取樹莓派上的資源,供老師做參考,謝謝老師的幫忙

      參考網址
      https://simonhsu.blog/2017/01/25/%E4%B8%8D%E5%BF%85%E7%9C%9F%E7%9A%84%E6%9E%B6%E7%AB%99%E4%B9%9F%E8%83%BD-5-%E5%88%86%E9%90%98%E5%AF%A6%E6%A9%9F%E9%AB%94%E9%A9%97-line-bot-message-api-%E6%87%89%E7%94%A8-by-node-js-ngrok/

  7. 老師您好
    另外想到一個line聊天機器人的應用,就是當line使用者拍一張花的照片傳給line聊天機器人後,照片能自動下載到樹莓派上做分析,經過樹莓派上的影像辨識程式(node.js 程式)辨別是哪一個花種,分析完後便將結果傳回給line使用者,有兩個問題需要解決

    1.如何讓line使用者拍的照片能傳給line聊天機器人後,自動下載到樹莓派
    2.如何針對已經下載到樹莓派上的照片做影像辨識花種

    在第1個問題,我還沒找到如何讓line使用者拍的照片能傳給line聊天機器人後,自動下載到樹莓派
    在第2個問題,我在參考超圖解物聯網IoT書中6-42頁的openCV,正在研究當中

    以上兩個問題,希望老師能給予建議,謝謝老師的幫忙

    1. Line的影像有解析度和檔案大小限制,而且就使用情境來說,我覺得你設想的程式應該是個獨立的App,開啟之後直接掃描,或者是相機App的外掛。像三星的Bixby Vision(人工智慧影像比對和搜尋)功能,可以識別葡萄酒的標籤,拍照之後回應葡萄酒的產地、年份以及建議搭配的食物等資訊,如這段YouTube影片所示;市面上有許多OpenCV和機器學習等的相關書籍,預祝你研究順利!

      thanks,
      jeffrey

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *