iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
Modern Web

每日1%,你會累趴。系列 第 27

Day27 過不去的檻就先繞過它 - LINE Notification

原本於Day26打算利用Message API來完成LINE Bot功能,但發現Webhook需要搭配https,而且SSL從購買的價錢到設定的步驟我對新手沒有到非常友善,為了以完成功能為主採用另外一種方法來完成推播匯率的功能。

這次採用的是LINE Notification,一樣先利用LINE的帳號註冊登入,登入後於右上角點選個人頁面後點選發行權杖

https://ithelp.ithome.com.tw/upload/images/20210927/201150488lchthQluu.png

權杖名稱自行設定一個想用的名字即可,接收通知的聊天室先選擇透過1對1聊天接收LINE Notify的通知

https://ithelp.ithome.com.tw/upload/images/20210927/201150488mVaH3KHkt.png

此時將此Token複製起來保存好,關閉之後就看不到Token要重新開一個權杖了。

接著開始程式的撰寫,先下指令創建一個Command

php artisan make:command lineNotification

參數設定

protected $signature = 'line:notification';
protected $description = 'Notification exchange rate by line';

接著點開發行權杖下方的LINE Notify API Document,看一下官方提供的API要怎麼操作

直接看到這隻APIPOST https://notify-api.line.me/api/notify

https://ithelp.ithome.com.tw/upload/images/20210927/20115048Jy4XHgZ83J.png

這邊是我覺得很重要的地方,官方有限定傳輸資料的格式

在Laravel的官方可以看到如果要傳出application/x-www-form-urlencoded格式的資料的話需要多一個asForm()function,我自己實作時因為沒有注意到這項訊息所以卡關了一下。

接著於Command上方引入Http套件use Illuminate\Support\Facades\Http;,於handle寫入邏輯。

$response = Http::withHeaders([
    'Authorization' => 'Bearer ' . 'your token',
])
->asForm()
->post('https://notify-api.line.me/api/notify', [
    'message' => 'test',
]);

withHeaders的地方要填寫權杖,Token的前方要加上Bearer ,不要忘記空白鍵一格
asForm是為了讓傳輸資料的格式變為application/x-www-form-urlencoded
接著將資料以POST method傳送至指定API

此時就可以下指令測試了php artisan line:notification

https://ithelp.ithome.com.tw/upload/images/20210927/20115048igzBUzEV9c.png

此時已經會收到通知了,所以開始來撰寫匯率的邏輯

篩選出最新一筆美金對台幣的匯率

$exchangeRate = ExchangeRate::select(
            'exchange_rate',
            'currency',
            'created_at',
)
    ->where('currency', 'TWD')
    ->orderBy('created_at', 'DESC')
    ->first();

組合一下要傳送的字串

$message = '今日 USD 對 ' . 
    $exchangeRate->currency . 
    ' 匯率為 ' . 
    $exchangeRate->exchange_rate . 
    ' 更新時間 ' . 
    $exchangeRate->created_at;

替換要傳送的變數

->post('https://notify-api.line.me/api/notify', [
    'message' => $message,
]);

此時再下一次指令php artisan line:notification可以看到功能已經完成了

https://ithelp.ithome.com.tw/upload/images/20210927/20115048pd8QQK7JV8.png

最後只要在Kernal加上定時推播即可,將時間訂在串接匯率API後的半小時,這樣就可獲得比較新的匯率

$schedule->command('line:notification')->dailyAt('08:30');

如此一來就完成了一開始想要的功能,一早起床打開手機就可以馬上獲得最新的匯率了。

今天的介紹就到這邊結束了,謝謝觀看的各位,請記得按讚分享開啟小鈴鐺,你的支持會讓按讚數+1。


上一篇
Day26 Project3 - LINE Bot 註冊
下一篇
Day28 Project4 - web crawler
系列文
每日1%,你會累趴。30

尚未有邦友留言

立即登入留言