前情提要
前一篇文章 LINE BOT 匯率提醒機器人(2/3) - 使用GCP架設HTTPS server 完成後現在可以用HTTPS和domain name連接上server, 接著就來串接LINE messaging API完成自動推播功能吧
開發重點
- 使用GCP服務中的GCE(Google Compute Engine)建立一台Linux server
- 使用GCE服務架設網站server, 網站server使用Apache架設
- 加入HTTPS支援 - 使用Let’s Encrypt免費SSL憑證
- 註冊LINE developers, 並申請LINE messaging API
- 使用PHP + SQLite實作LINE Bot傳送匯率到LINE群組的頻道上
實作匯率提醒機器人 - 申請LINE messaging API
實作LINE定期推播訊息給群組前, 先讓我們要先完成LINE messaging API申請與相關設定
- 登入LINE developers網站
- 完成第一次申請的步驟, 此步驟請照LINE developers網站提示完成, 完成後即可進入以下的console頁面
- 點擊右上方的Create New Provider進入建立provider頁面
- 根據需求寫上provider後點選confirm和create
- 接下來點擊右下的Create Channel
- 填入App name, App description, Plan選取Developer Trial, Category和Subcategory照需求自己選, 最後再寫上email後即可送出confirm
- 接著將最下方的LINE@ Terms of Use和Messaging Terms of Use打勾後再按下Create完成
- 建立完成後可以看到剛剛輸入的chanel出現在畫面上
- 點擊剛建立好的channel
- 找到Allow bot to join group chats並按下edit, 改為enable後按下update
- 找到QR code, 使用手機上的LINE掃描QR code將機器人加入好友
- 加入好友後會跳出歡迎訊息
- 接下來找到Channel access token並點擊issue取得access token
注意: access token是LINE用來認證的資料, 請勿外流出去 - 將 LINE BOT 匯率提醒機器人(2/3) - 使用GCP架設HTTPS server 中使用到的domain name後端加上/recv.php輸入到webhooks上, 例如 https://linebottest.alenshiun.tw/recv.php
LINE會在機器人被加入好友、加入群組、封鎖等等時傳送個訊息到webhooks上
實作匯率提醒機器人 - 架站目標!
申請完LINE messaging API後即可開始架設網站, 架設目標如下
- 當LINE機器人被加入群組時, 網站會收到由LINE官方送來的通知
- 收到LINE官方的通知後將辨識群組用的唯一識別碼存進資料庫
- Linux server向政府開放的open data取得匯率資訊
- 將匯率資訊推播給資料庫中紀錄的全部群組
- 每天上午10:00重複步驟3~4
為達到以上目標, 筆者採用PHP + SQLite開發匯率機器人
實作匯率提醒機器人 - 安裝PHP與SQLite
首先來安裝PHP和SQLite
- 更新apt套件資訊
shiun@instance-1:$ sudo apt-get update - 安裝PHP
shiun@instance-1:$ sudo apt-get install php - 安裝PHP apache模組
shiun@instance-1:$ sudo apt-get install libapache2-mod-php - 安裝SQLite指令程式
shiun@instance-1:$ sudo apt-get install sqlite - 重新啟動apache
shiun@instance-1:$ sudo service apache2 restart - 檢查php是否能正常運作
shiun@instance-1:$ sudo vi /var/www/linebottest/web/info.php# 加入以下內容 <?php phpinfo(); ?>
使用瀏覽器開網頁確定是不是出現PHP資訊頁面, 有看到下圖頁面就是PHP啟動成功
- 確認能正常運作後刪除info.php避免PHP資訊外洩
shiun@instance-1:$ sudo rm /var/www/linebottest/web/info.php
實作匯率提醒機器人 - 安裝相依套件
匯率機器人會使用到許多現成網路上的套件, 請先安裝好這些套件
- composer: PHP相依套件管理程式
shiun@instance-1:$ sudo apt-get install composer - libfreetype6-dev, php-image-text: 繪圖套件, 畫折線圖會用到
shiun@instance-1:$ sudo apt-get install libfreetype6-devshiun@instance-1:$ sudo apt-get install php-image-text - php-sqlite3: PHP專用的SQLite套件
shiun@instance-1:$ sudo apt-get install php-sqlite3 - php-xml: PHP的xml parser套件
shiun@instance-1:$ sudo apt-get install php-xml - php-mbstring: PHP多國語言字串處理套件
shiun@instance-1:$ sudo apt-get install php-mbstring - php-curl: PHP進行HTTP/HTTPS連線用套件
shiun@instance-1:$ sudo apt-get install php-curl
實作匯率提醒機器人 - 匯率機器人專案程式建置
- 從GitHub上clone一份LINE BOT專案, 專案名稱為foreignEX
shiun@instance-1:$ https://github.com/AlenShiun/ForeignEX - 將原先的linebottest資料夾整個刪除, 接著把專案檔改名並複製到linebottest原先的位置
shiun@instance-1:$ sudo rm -rf /var/www/linebottestshiun@instance-1:$ sudo mv ForeignEX /var/www/linebottest - 安裝專案相依套件
shiun@instance-1:$ cd /var/www/linebottest/shiun@instance-1:$ composer install - 設定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='); - 回到LINE messaging API channel, 點擊verify驗證LINE是不是可連線上此webhooks
驗證成功會顯示上圖中的 Success 訊息 - 設定折線圖存取用的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"); - 修改資料夾權限, 讓匯率機器人可以存取資料庫和log資料夾
shiun@instance-1:$ cd /var/www/linebottest/shiun@instance-1:/var/www/linebottest$ sudo chown -R www-data:www-data dbshiun@instance-1:/var/www/linebottest$ sudo chmod -R 755 dbshiun@instance-1:/var/www/linebottest$ sudo chown -R www-data:www-data logshiun@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 - 在LINE上建立群組, 將匯率機器人加入群組
- 檢查資料庫是否有記錄到群組的唯一識別碼
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> - 執行worker.php, 執行成功後群組會收到匯率資訊
shiun@instance-1:$ cd /var/www/linebottest/shiun@instance-1:/var/www/linebottest$ php worker.php LINE message API response: {} - 設定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去寄送匯率資料給群組 - 等待到crontab指定的時間看是否能正常收到匯率資訊
- 收工~
後記
- GitHub上的專案是採用政府open data的匯率資訊所以並不會有當天資料, 讀者可以自行準備爬蟲去爬銀行網站抓到最新的資料
簡單的爬蟲可以用php-html-parser處理DOM物件來做到 - GCE的VM預設會採用UTC+0的時間, 若使用台灣時間請自行+8小時, 或是自行研究怎麼修改GCE的時區
沒有留言:
張貼留言