2018年10月4日 星期四

LINE BOT 匯率提醒機器人(3/3) - 實作匯率提醒機器人

前情提要


前一篇文章 LINE BOT 匯率提醒機器人(2/3) - 使用GCP架設HTTPS server 完成後現在可以用HTTPS和domain name連接上server, 接著就來串接LINE messaging API完成自動推播功能吧

開發重點

  1. 使用GCP服務中的GCE(Google Compute Engine)建立一台Linux server
  2. 使用GCE服務架設網站server, 網站server使用Apache架設
  3. 加入HTTPS支援 - 使用Let’s Encrypt免費SSL憑證
  4. 註冊LINE developers, 並申請LINE messaging API
  5. 使用PHP + SQLite實作LINE Bot傳送匯率到LINE群組的頻道上

實作匯率提醒機器人 - 申請LINE messaging API


實作LINE定期推播訊息給群組前, 先讓我們要先完成LINE messaging API申請與相關設定
  1. 登入LINE developers網站
  2. 完成第一次申請的步驟, 此步驟請照LINE developers網站提示完成, 完成後即可進入以下的console頁面
  3. 點擊右上方的Create New Provider進入建立provider頁面
  4. 根據需求寫上provider後點選confirm和create

  5. 接下來點擊右下的Create Channel
  6. 填入App name, App description, Plan選取Developer Trial, Category和Subcategory照需求自己選, 最後再寫上email後即可送出confirm

  7. 接著將最下方的LINE@ Terms of Use和Messaging Terms of Use打勾後再按下Create完成
  8. 建立完成後可以看到剛剛輸入的chanel出現在畫面上
  9. 點擊剛建立好的channel
  10. 找到Allow bot to join group chats並按下edit, 改為enable後按下update

  11. 找到QR code, 使用手機上的LINE掃描QR code將機器人加入好友

  12. 加入好友後會跳出歡迎訊息
  13. 接下來找到Channel access token並點擊issue取得access token

    注意: access token是LINE用來認證的資料, 請勿外流出去
  14. 將 LINE BOT 匯率提醒機器人(2/3) - 使用GCP架設HTTPS server 中使用到的domain name後端加上/recv.php輸入到webhooks上, 例如 https://linebottest.alenshiun.tw/recv.php
    LINE會在機器人被加入好友、加入群組、封鎖等等時傳送個訊息到webhooks上

實作匯率提醒機器人 - 架站目標!


申請完LINE messaging API後即可開始架設網站, 架設目標如下

  1. 當LINE機器人被加入群組時, 網站會收到由LINE官方送來的通知
  2. 收到LINE官方的通知後將辨識群組用的唯一識別碼存進資料庫
  3. Linux server向政府開放的open data取得匯率資訊
  4. 將匯率資訊推播給資料庫中紀錄的全部群組
  5. 每天上午10:00重複步驟3~4
為達到以上目標, 筆者採用PHP + SQLite開發匯率機器人

 實作匯率提醒機器人 - 安裝PHP與SQLite


首先來安裝PHP和SQLite
  1. 更新apt套件資訊
    shiun@instance-1:$ sudo apt-get update
  2. 安裝PHP
    shiun@instance-1:$ sudo apt-get install php
  3. 安裝PHP apache模組
    shiun@instance-1:$ sudo apt-get install libapache2-mod-php
  4. 安裝SQLite指令程式
    shiun@instance-1:$ sudo apt-get install sqlite
  5. 重新啟動apache
    shiun@instance-1:$ sudo service apache2 restart
  6. 檢查php是否能正常運作
    shiun@instance-1:$ sudo vi /var/www/linebottest/web/info.php # 加入以下內容 <?php phpinfo(); ?>
    使用瀏覽器開網頁確定是不是出現PHP資訊頁面, 有看到下圖頁面就是PHP啟動成功
  7. 確認能正常運作後刪除info.php避免PHP資訊外洩
    shiun@instance-1:$ sudo rm /var/www/linebottest/web/info.php

實作匯率提醒機器人 - 安裝相依套件


匯率機器人會使用到許多現成網路上的套件, 請先安裝好這些套件
  1. composer: PHP相依套件管理程式
    shiun@instance-1:$ sudo apt-get install composer
  2. libfreetype6-dev, php-image-text: 繪圖套件, 畫折線圖會用到
    shiun@instance-1:$ sudo apt-get install libfreetype6-dev shiun@instance-1:$ sudo apt-get install php-image-text
  3. php-sqlite3: PHP專用的SQLite套件
    shiun@instance-1:$ sudo apt-get install php-sqlite3
  4. php-xml: PHP的xml parser套件
    shiun@instance-1:$ sudo apt-get install php-xml
  5. php-mbstring: PHP多國語言字串處理套件
    shiun@instance-1:$ sudo apt-get install php-mbstring
  6. php-curl: PHP進行HTTP/HTTPS連線用套件
    shiun@instance-1:$ sudo apt-get install php-curl

實作匯率提醒機器人 - 匯率機器人專案程式建置

  1. 從GitHub上clone一份LINE BOT專案, 專案名稱為foreignEX
    shiun@instance-1:$ https://github.com/AlenShiun/ForeignEX
  2. 將原先的linebottest資料夾整個刪除, 接著把專案檔改名並複製到linebottest原先的位置
    shiun@instance-1:$ sudo rm -rf /var/www/linebottest shiun@instance-1:$ sudo mv ForeignEX /var/www/linebottest
  3. 安裝專案相依套件
    shiun@instance-1:$ cd /var/www/linebottest/ shiun@instance-1:$ composer install
  4. 設定LINE access token, access token為「申請LINE messaging API」步驟中取得的access token
    shiun@instance-1:$ cd /var/www/linebottest/ shiun@instance-1:/var/www/linebottest$ sudo vi config.php #找到access token並修改 // LINE message API access token define("LINE_MESSAGE_API_ACCESS_TOKEN", 'Sm6xxxxxxx ...... xxxxxxxxxxxxxxlFU=');
  5. 回到LINE messaging API channel, 點擊verify驗證LINE是不是可連線上此webhooks

    驗證成功會顯示上圖中的 Success 訊息
  6. 設定折線圖存取用的URL
    shiun@instance-1:$ cd /var/www/linebottest/ shiun@instance-1:/var/www/linebottest$ sudo vi config.php #找到IMAGE_HTTP_PATH_BASE_RATE並修改 // HTTP URL for image files of chart define('IMAGE_HTTP_PATH_BASE_RATE', "https://linebottest.alenshiun.tw/pic");
  7. 修改資料夾權限, 讓匯率機器人可以存取資料庫和log資料夾
    shiun@instance-1:$ cd /var/www/linebottest/ shiun@instance-1:/var/www/linebottest$ sudo chown -R www-data:www-data db shiun@instance-1:/var/www/linebottest$ sudo chmod -R 755 db shiun@instance-1:/var/www/linebottest$ sudo chown -R www-data:www-data log shiun@instance-1:/var/www/linebottest$ sudo chmod -R 755 log
    修改後結果如下 shiun@instance-1:/var/www/linebottest$ ls -l total 56 -rw-r--r-- 1 shiun shiun 2381 Oct 4 07:57 chartGenerator.php -rw-r--r-- 1 shiun shiun 71 Oct 4 07:57 composer.json -rw-r--r-- 1 shiun shiun 3986 Oct 4 07:57 composer.lock -rw-r--r-- 1 shiun shiun 765 Oct 4 07:59 config.php -rw-r--r-- 1 shiun shiun 2862 Oct 4 07:57 dao.php drwxr-xr-x 2 www-data www-data 4096 Oct 4 08:00 db drwxr-xr-x 3 shiun shiun 4096 Oct 4 07:58 libs drwxr-xr-x 2 www-data www-data 4096 Oct 4 08:00 log -rw-r--r-- 1 shiun shiun 1024 Oct 4 07:57 parser.php -rw-r--r-- 1 shiun shiun 1120 Oct 4 07:57 README.md -rw-r--r-- 1 shiun shiun 1495 Oct 4 07:57 sender.php drwxrwxr-x 4 shiun shiun 4096 Oct 4 07:59 vendor drwxr-xr-x 3 shiun shiun 4096 Oct 4 08:00 web -rw-r--r-- 1 shiun shiun 1754 Oct 4 07:57 worker.php
  8. 在LINE上建立群組, 將匯率機器人加入群組
  9. 檢查資料庫是否有記錄到群組的唯一識別碼
    shiun@instance-1:$ cd /var/www/linebottest/ shiun@instance-1:/var/www/linebottest$ sqlite3 db/db.sqlite SQLite version 3.11.0 2016-02-15 17:29:24 Enter ".help" for usage hints. #輸入.tables, 出現的target代表資料表table有存在 sqlite> .tables target #輸入SELECT * FROM target; sqlite> SELECT * FROM target; #sqlite指令會列出資料表target下所有的資訊 #以下列為例, 在2018-10-04的8:17分機器人偵測到被加入群組, 群組ID為C0xxxxxxe2b 2|C0xxxxxxe2b|FOREIGN_EX_DB_TYPE_GROUP|2018-10-04 08:17:14| #按下ctrl+d離開sqlite指令功能 sqlite>
  10. 執行worker.php, 執行成功後群組會收到匯率資訊
    shiun@instance-1:$ cd /var/www/linebottest/ shiun@instance-1:/var/www/linebottest$ php worker.php LINE message API response: {}
  11. 設定crontab讓Linux定期執行worker.php
    shiun@instance-1:$ sudo vi /etc/crontab #在最後一行加入以下內容 00 2 * * * root   php /var/www/linebottest/worker.php
    每到UTC時間2:00(台灣時間10:00)Linux會自動啟動worker.php去寄送匯率資料給群組
  12. 等待到crontab指定的時間看是否能正常收到匯率資訊
  13. 收工~

後記

  1. GitHub上的專案是採用政府open data的匯率資訊所以並不會有當天資料, 讀者可以自行準備爬蟲去爬銀行網站抓到最新的資料
    簡單的爬蟲可以用php-html-parser處理DOM物件來做到
  2. GCE的VM預設會採用UTC+0的時間, 若使用台灣時間請自行+8小時, 或是自行研究怎麼修改GCE的時區

參考資料


沒有留言:

張貼留言