大家好~
昨天我們已經將 LINEBot 安裝完成啦~
今天來做個 Echo bot 簡單認識一下 LINEBot 的實作過程吧~
首先來為我們的 Webhook 準備好 Route 與 Controller 吧!
php artisan make:controller LinebotController
Route::post('/linebot-reply',[LinebotController::class,'reply']);
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Log;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot;
public function reply(Request $request)
{
Log::info($request->all());
return response('HTTP_OK',Response::HTTP_OK);
}
先來測試 Webhook 連線是否正常吧~
順便看看 Request body 長怎樣。
至於 URL 就先用 ngrok 協助我們測試吧!
在 Messaging API settings 的頁面下可以設定 Webhook URL,
按下 Verify 可以測試我們的 API 是否可以成功接收 Request。
然後記得要啟用 Webhook 喔。
下圖就是用 Line 傳送文字訊息給我們的 LINEBot 後所獲得的 Request body 格式。
public function reply(Request $request)
{
$httpClient = new CurlHTTPClient(env('LINE_BOT_CHANNEL_ACCESS_TOKEN'));
$bot = new LINEBot($httpClient, ['channelSecret' => env('LINE_BOT_CHANNEL_SECRET')]);
try {
$bot->parseEventRequest($request->getContent(), $request->header('X-Line-Signature'));
}catch (LINEBot\Exception\InvalidSignatureException $exception){
return response('An exception class that is raised when signature is invalid.',Response::HTTP_FORBIDDEN);
}catch (LINEBot\Exception\InvalidEventRequestException $exception){
return response('An exception class that is raised when received invalid event request.',Response::HTTP_FORBIDDEN);
}
$text = $request['events'][0]['message']['text'];
$replyToken = $request['events'][0]['replyToken'];
$response = $bot->replyText($replyToken, $text);
if ($response->isSucceeded()){
return response('HTTP_OK', Response::HTTP_OK);
}else{
Log::debug($response->getHTTPStatus());
Log::debug($response->getRawBody());
return response('HTTP_UNPROCESSABLE_ENTITY', Response::HTTP_UNPROCESSABLE_ENTITY);
}
要記得將 Channel access token 與 Channel secret 寫入 .env
喔~
成果如下圖。
這個 Function 可以幫我們驗證簽名與判斷 Event type。
LINEBot 有著多種的 MessageBuilder,
不過以我們目前的 Echo bot 來說,
使用 replyText()
就足夠應付了。
今天就先這樣啦~
大家明天見!
若文章有任何問題,
還請大家不吝賜教!