【技術分享】於 Laravel 專案中套用 LINE Notify 做各項通知

此網站營運至今約莫 2 年的時間,
在撰寫這篇文章之前,
我必須三不五時去主機查看 Log 資訊,
來確認網站有沒有出現嚴重錯誤,
屬於比較後知後覺的應對方式。

這次將在 Laravel 架設的網站中引入 LINE Notify,
在網站有出現錯誤時,能夠即時的利用 LINE 通知我。

首先簡單介紹 LINE Notify,
本次將使用其中的 Notification 功能,
利用 LINE Notify 的 API 串接,
即可收到 LINE 所提供的官方帳號「LINE Notify」通知。

優點的話就是這是完全免費的,
缺點則是一組 token 只能應用於一個群組的通知,
但如果是作為自己看的,那也足矣。




首先先到 LINE Notify 官方頁面,
點擊右上角的登入,並登入您的 LINE 帳號。

接著一樣點擊右上角的自己的名字,
並選擇個人頁面的選項。


接著選擇發行權杖,
如果是英文介面則是 Generate token。

填寫完成後會產生一組 token,
請將 token 收好,後續會使用到。

且同時個人頁面會有一組像上圖那樣的連動服務,
到這一步 LINE Notify 頁面的部分就已完成。

接著到 LINE 應用程式中,
將 LINE Notify 這個官方帳號加進對應群組中,
若是傳送給個人則不用設定。



接著要我們要使用 API 文件中的 Notification 功能。

API 文件可點擊此處查閱

這次的系統通知以出現 4XX,5XX 等錯誤代碼時,
就寄送通知至群組中告知我們。

在 Laravel 專案中找到 app/Exceptions/Handler.php,
並參考下方程式碼寫入對應內容。
 
<?php

namespace App\Exceptions;

use GuzzleHttp\Client;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Throwable;

class Handler extends ExceptionHandler
{
    // 省略前面預設程式碼


    /**
     * 報告或記錄異常
     *
     * @param  \Throwable  $exception
     * @return void
     */
    public function report(Throwable $exception)
    {
        parent::report($exception);

        // 檢查是否為 HTTP 異常,是則傳送 LINE Notify
        if ($this->isHttpException($exception)) {
            $this->sendLineNotify($exception);
        }
    }

    protected function sendLineNotify(Throwable $exception)
    {
        $accessToken = 'YOUR_LINE_NOTIFY_ACCESS_TOKEN'; // 替換成你的 token

        // 撈出錯誤狀態碼
        $statusCode = $exception instanceof HttpException ? $exception->getStatusCode() : 500;

        // 撈出錯誤訊息
        $message = $exception->getMessage();

        // 撈出錯誤網址
        $url = request()->fullUrl();

        $lineMessage = "\n";
        $lineMessage .= "Error {$statusCode}: \n";
        $lineMessage .= "URL: " . $url . "\n";
        $lineMessage .= "Message: " . $message . "\n";

        // 利用 GuzzleHttp\Client 呼叫 API
        $client = new Client();

        try {
            $response = $client->post('https://notify-api.line.me/api/notify', [
                'headers' => [
                    'Authorization' => 'Bearer ' . $accessToken,
                ],
                 'form_params' => [
                   'message' => $lineMessage,
                ],
            ]);

            if ($response->getStatusCode() !== 200) {
                logger()->error('Failed to send LINE Notify message', [
                    'status' => $response->getStatusCode(),
                    'body' => (string) $response->getBody(),
                ]);
            }
        } catch (\Exception $e) {
            logger()->error('Failed to send LINE Notify due to an error', [
                'error' => $e->getMessage(),
            ]);
        }
    }
}
在完成之後就可以去測試各項錯誤,
來確定是否有收到來自 LINE Notify 的錯誤訊息。



確認有收到通知就代表完成了,
這樣可以做出很多廣泛的應用,
像是排程正確執行完成就發送通知、
寫好一篇新文章就發送通知、
有使用者發送聯絡我們表單就發送通知... 等等的功能。



雖然目前我的聯絡我們表單通知是發送至 telegram,
但在未來或許可以將兩者整合統一使用,
才不會接收通知的地方到處都是,
造成管理上的麻煩。

本篇文章紀錄於此,
方便自己日後有需要可以反查相關資訊,
希望也對有這類需求的讀者有所幫助!