Extreme Thinking
Line api 串接

2024-11-26


line bot 申請建立一個群組 line bot 可以接收一些訊息,line bot 回答一些訊息 例如回答簡單的加法運算,利用php laravel 的 webhook 做收與答

ChatGPT:

要使用 PHP Laravel 開發一個簡單的 Line Bot,能夠接收訊息並回答(例如執行簡單的加法運算),可以按照以下步驟進行設置:


步驟 1: 設置 LINE Bot 帳號

  1. 註冊 LINE Developer 帳號LINE Developers 註冊或登入帳號。

  2. 建立 Channel

    • 選擇 Messaging API ,建立一個新 Channel。
  • 記下 Channel SecretAccess Token (需要在程式中使用)。
  1. Webhook 設置
    • 在 LINE Messaging API 的設定中,啟用 Use webhook
  • 設定 Webhook URL,URL 應該指向你的伺服器,例如 https://yourdomain.com/webhook

步驟 2: Laravel 專案準備

  1. 建立 Laravel 專案 使用 Composer 建立新的 Laravel 專案:
composer create-project laravel/laravel line-bot
  1. 安裝 LINE SDK 套件 使用 Composer 安裝 LINE 官方提供的 SDK:
composer require linecorp/line-bot-sdk
  1. 設置環境變數.env 文件中新增 LINE 的 Channel Secret 和 Access Token:
LINE_CHANNEL_SECRET=your_channel_secret
LINE_ACCESS_TOKEN=your_access_token

步驟 3: 設置 Webhook 控制器

  1. 建立控制器 使用 Artisan 指令建立一個控制器:
php artisan make:controller LineBotController
  1. 實作接收訊息與回應邏輯LineBotController 中新增以下程式碼:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use LINE\LINEBot;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\MessageBuilder\TextMessageBuilder;

class LineBotController extends Controller
{
    private $bot;

    public function __construct()
    {
        $httpClient = new CurlHTTPClient(env('LINE_ACCESS_TOKEN'));
        $this->bot = new LINEBot($httpClient, ['channelSecret' => env('LINE_CHANNEL_SECRET')]);
    }

    public function webhook(Request $request)
    {
        $events = $request->events;
        foreach ($events as $event) {
            // 確認是文字訊息事件
            if ($event['type'] === 'message' && $event['message']['type'] === 'text') {
                $replyToken = $event['replyToken'];
                $userMessage = $event['message']['text'];

                // 處理加法運算
                if (preg_match('/^(\d+)\+(\d+)$/', $userMessage, $matches)) {
                    $result = (int)$matches[1] + (int)$matches[2];
                    $replyMessage = "計算結果是:$result";
                } else {
                    $replyMessage = "請輸入加法運算,例如:3+5";
                }

                $this->replyMessage($replyToken, $replyMessage);
            }
        }
    }

    private function replyMessage($replyToken, $message)
    {
        $textMessageBuilder = new TextMessageBuilder($message);
        $this->bot->replyMessage($replyToken, $textMessageBuilder);
    }
}
  1. 設定路由routes/web.php 中新增路由:
use App\Http\Controllers\LineBotController;

Route::post('/webhook', [LineBotController::class, 'webhook']);

步驟 4: 部署到伺服器

  1. 部署到支援 HTTPS 的伺服器 LINE Webhook URL 必須是 HTTPS,將 Laravel 專案部署到支援 HTTPS 的伺服器。

  2. 設定 Webhook URL 在 LINE Developers 設定 Webhook URL,例如:

https://yourdomain.com/webhook
  1. 測試
    • 在 LINE 中加入你的 Bot。
  • 發送訊息,例如 3+5,Bot 應回傳 計算結果是:8

這樣,你的 LINE Bot 就完成了!🎉 如果有其他需求,例如處理更多訊息類型,可以進一步擴展邏輯。

You:

請詳述 Line Bot 如何加入群組中, 如何回答問題 是用line 帳號來加入嗎?

ChatGPT:

讓 LINE Bot 加入群組並回答問題需要遵循 LINE Messaging API 的一些規範和流程。以下是詳細步驟:


一、如何讓 LINE Bot 加入群組

  1. 確保 Bot 支援群組互動
    • 在 LINE Developer 後台的 Messaging API 設定頁面,確認以下選項是否已正確設定:
    • Allow bot to join group chats : 開啟此選項,允許 Bot 加入群組。

    • Auto-reply messages : 關閉此選項(若你已設置 Webhook)。

  2. 邀請 Bot 加入群組
    • 透過 LINE App 邀請 :將 LINE Bot 當作一般好友,邀請到群組中。
    1. 在 LINE App 中,新增 Bot 為好友(透過 QR Code 或 ID 搜尋)。

    2. 將 Bot 加入到一個群組。

  • 掃描群組邀請連結 :群組擁有者生成邀請連結後,讓 Bot 加入。
  1. Bot 是否自動回應
    • 確認你已設定 Webhook,Bot 才能監聽群組內的訊息。
  • 如果只加好友但未設置 Webhook,Bot 不會回應群組中的訊息。

二、LINE Bot 如何識別群組訊息並回答

當 LINE Bot 加入群組後,LINE Messaging API 提供了群組內訊息的特殊事件處理方式。

1. 接收群組內的訊息

當群組內有訊息時,LINE 會透過 Webhook 傳送事件。每個事件包含以下重要內容:

  • source : 表示事件的來源,可以是 usergrouproom

  • type : 表示事件類型,例如 messagejoin(Bot 被加入群組)等。

Webhook 事件範例(群組訊息):

{
  "events": [
    {
      "type": "message",
      "replyToken": "abcdefgh12345",
      "source": {
        "type": "group",
        "groupId": "C1234567890abcdef"
      },
      "message": {
        "id": "9876543210",
        "type": "text",
        "text": "3+5"
      },
      "timestamp": 1636892700
    }
  ]
}

2. 在程式中處理群組訊息

在 Laravel 的控制器中,你需要辨識訊息來源是否來自群組。以下為處理邏輯的範例程式碼:

public function webhook(Request $request)
{
    $events = $request->events;

    foreach ($events as $event) {
        $sourceType = $event['source']['type'];

        // 如果是群組訊息
        if ($sourceType === 'group') {
            $groupId = $event['source']['groupId'];
            $replyToken = $event['replyToken'];
            $userMessage = $event['message']['text'];

            // 處理簡單加法邏輯
            if (preg_match('/^(\d+)\+(\d+)$/', $userMessage, $matches)) {
                $result = (int)$matches[1] + (int)$matches[2];
                $replyMessage = "群組內的計算結果是:$result";
            } else {
                $replyMessage = "請輸入加法運算,例如:3+5";
            }

            $this->replyMessage($replyToken, $replyMessage);
        }
    }
}

3. 自動回應 Bot 被加入群組的事件

當 Bot 被邀請加入群組時,LINE 會觸發 join 事件。你可以回應群組內的第一條歡迎訊息:

if ($event['type'] === 'join' && $sourceType === 'group') {
    $replyToken = $event['replyToken'];
    $replyMessage = "大家好!我是你的 LINE Bot,可以進行簡單的加法運算!";
    $this->replyMessage($replyToken, $replyMessage);
}

三、注意事項

  1. Bot 無法主動加入群組 LINE 的政策限制,Bot 只能被用戶或群組邀請進入群組,無法自行加入。

  2. 權限管理

    • Bot 在群組中無法取得單一用戶的詳細資料(例如名稱或 LINE ID),除非該用戶主動與 Bot 互動。
  • 若需要群組內用戶的資訊,需透過 群組識別符 與用戶互動記錄進行管理。
  1. 訊息來源判斷 LINE 提供的事件有 source 欄位,可以判斷訊息來源是個人聊天 (user)、群組 (group)、還是多群 (room)。

四、測試

  1. 邀請 Bot 加入測試群組
    • 建立一個測試群組,邀請 Bot 加入。
  2. 發送測試訊息
    • 在群組內輸入類似 3+5 的訊息,確認 Bot 是否回應。
  3. 確認 LINE Developer 後台的 Webhook 記錄
    • 如果 Bot 無法回應,檢查 Webhook 的觸發事件,確認伺服器的回應狀態。

這樣,LINE Bot 就可以在群組內正常工作了! 😊 如果還有疑問,可以進一步補充需求。

You:

要使用 PHP Laravel 開發一個 Line Bot,能夠接收訊息並 串接 chatbot API 回答問題回到 line 中

ChatGPT:

以下是使用 PHP Laravel 開發一個 LINE Bot,並串接第三方 Chatbot API(例如 OpenAI 的 ChatGPT API)的完整流程:


一、LINE Bot 串接 Chatbot API 的原理

  1. LINE 使用者發送訊息 LINE 使用者向 Bot 發送訊息,LINE 平台透過 Webhook 將訊息傳送到你的伺服器。

  2. 伺服器處理並轉發到 Chatbot API 你的 Laravel 應用程式接收訊息,將訊息內容發送到第三方 Chatbot API(如 ChatGPT)。

  3. Chatbot API 回傳結果 第三方 API 回傳回答,Laravel 接收後再透過 LINE Messaging API 回傳給使用者。


二、設定與開發

1. 建立 Laravel 專案

若尚未建立專案,請先安裝 Laravel:

composer create-project laravel/laravel line-chatbot

安裝 LINE 官方 SDK:

composer require linecorp/line-bot-sdk

2. 設定 LINE Messaging API

  1. 在 LINE Developers 平台中創建 Messaging API Channel
    • 紀錄 Channel SecretAccess Token
  2. 設定環境變數 : 在 .env 文件中新增:
LINE_CHANNEL_SECRET=your_line_channel_secret
LINE_ACCESS_TOKEN=your_line_access_token
CHATBOT_API_KEY=your_chatbot_api_key
CHATBOT_API_URL=https://api.example.com/chat

3. 開發控制器

建立控制器

使用 Artisan 指令建立控制器:

php artisan make:controller LineBotController

實作邏輯

LineBotController 中,編寫以下邏輯:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use LINE\LINEBot;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\MessageBuilder\TextMessageBuilder;
use GuzzleHttp\Client;

class LineBotController extends Controller
{
    private $bot;

    public function __construct()
    {
        $httpClient = new CurlHTTPClient(env('LINE_ACCESS_TOKEN'));
        $this->bot = new LINEBot($httpClient, ['channelSecret' => env('LINE_CHANNEL_SECRET')]);
    }

    public function webhook(Request $request)
    {
        $events = $request->events;

        foreach ($events as $event) {
            if ($event['type'] === 'message' && $event['message']['type'] === 'text') {
                $replyToken = $event['replyToken'];
                $userMessage = $event['message']['text'];

                // 發送訊息到 Chatbot API
                $replyMessage = $this->fetchChatbotReply($userMessage);

                // 回應使用者訊息
                $this->replyMessage($replyToken, $replyMessage);
            }
        }
    }

    private function fetchChatbotReply($message)
    {
        try {
            $client = new Client();
            $response = $client->post(env('CHATBOT_API_URL'), [
                'headers' => [
                    'Authorization' => 'Bearer ' . env('CHATBOT_API_KEY'),
                    'Content-Type' => 'application/json',
                ],
                'json' => [
                    'prompt' => $message,
                    'max_tokens' => 100,
                ],
            ]);

            $data = json_decode($response->getBody(), true);
            return $data['choices'][0]['text'] ?? '抱歉,我無法理解你的問題。';
        } catch (\Exception $e) {
            return '系統忙碌中,請稍後再試!';
        }
    }

    private function replyMessage($replyToken, $message)
    {
        $textMessageBuilder = new TextMessageBuilder($message);
        $this->bot->replyMessage($replyToken, $textMessageBuilder);
    }
}

4. 設定路由

routes/web.php 中新增路由:

use App\Http\Controllers\LineBotController;

Route::post('/webhook', [LineBotController::class, 'webhook']);

5. 部署與測試

  1. 部署到支援 HTTPS 的伺服器 LINE Webhook URL 必須是 HTTPS,例如 https://yourdomain.com/webhook

  2. 設定 LINE Webhook 在 LINE Developers 平台的 Messaging API 中設定 Webhook URL。

  3. 測試

    • 在 LINE 中新增 Bot 為好友。
  • 發送訊息,確認 Bot 是否能正確回應來自 Chatbot API 的回答。

三、注意事項

  1. 第三方 API 格式
    • 確認 Chatbot API(如 OpenAI ChatGPT API)的請求與回應格式,必要時調整 fetchChatbotReply 的邏輯。
  2. 錯誤處理
    • 增加錯誤捕捉,避免因 API 超時或無效的回應導致 Bot 無法運作。
  3. 頻率限制
    • 確認 Chatbot API 的頻率限制,避免超出配額。

完成上述設置後,你的 LINE Bot 就可以串接 Chatbot API,實現智慧回應的功能!🎉