Day13-Webhook 实作(二)LINEBot 之 Echo bot

大家好~
昨天我们已经将 LINEBot 安装完成啦~
今天来做个 Echo bot 简单认识一下 LINEBot 的实作过程吧~

Webhook 测试

首先来为我们的 Webhook 准备好 Route 与 Controller 吧!

php artisan make:controller LinebotController
routes/api.php
Route::post('/linebot-reply',[LinebotController::class,'reply']);
app/Http/Controllers/LinebotController.php
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 格式。

Echo bot 实作

app/Http/Controllers/LinebotController.php
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 喔~
成果如下图。

LINEBot::parseEventRequest($body, $signature, $eventOnly = true)

这个 Function 可以帮我们验证签名与判断 Event type。

LINEBot::replyText($replyToken, $text, $extraTexts = null)

LINEBot 有着多种的 MessageBuilder,
不过以我们目前的 Echo bot 来说,
使用 replyText() 就足够应付了。

今天就先这样啦~
大家明天见!
若文章有任何问题,
还请大家不吝赐教!

参考资料:


<<:  事件监听的this:「这个」到底是哪一个?

>>:  Android学习笔记19

Day 27 (Js)

1.变数不影响他人的方式(合作时要用) (1)把自己的计划包起来,变数执行完之後就舍弃 IIFE =...

团队共生

前言 感谢我们一同坚持到第 30 天,本篇以「团队共生」为题,总括前述所谈,萃取我认为在团队共同成长...

【Day11】测试方法、Jest、Ezyme的介绍(•‿•)

要进入写测试之前呀~我们必须要先了解为什麽要写测试,及我们会说明一种测试的开发方法(TDD) 写测试...

【在 iOS 开发路上的大小事-Day06】透过 Delegate 来传值

前情提要 一般我们在做传值动作的时候,会有好几种方式可以做,像是用 Segue、Closure、De...

[Day0] 参赛初衷

我的背景 目前自己前端的程序能力只学过基础 html+css+js,没有独立开发过大型专案的经验,算...