[開發] 利用 Docker 快速建立 PHP Laravel LINEBOT 機器人開發環境

by Mesak

現代開發環境不得不說,只需要下幾行指令之後,開發環境就隨之建立,Windows 自從 Windows 10 推出之後,利用WSL 子系統模式來執行 Linux , 近年來流行的 Docker 也快速的發展,利用系統層虛擬化,讓開發環境與正式環境相當的貼近。

在開發專案的時候相當推薦採用 統一的 Docker 環境來處理這些環境架設的問題,減少各個系統的問題處理,統一函示庫元件之類的套件載入方法,推薦使用 Docker 。

今天要介紹的就是利用 Laravel 官方推出的 Laravel Sail ,配合我最近整合的 LINEBOT套件,快速的建立起開發環境。

首先需要作業系統為 Windows 10 1909 以上,並安裝 WSL2 ,Windows 作業系統的部分我就不再贅述

透過官方的教學文件 Getting Started On Windows,你還需要安裝 Docker Desktop,萬事都備妥了之後,你需要打開命令提示字元,按下 WIN+R 輸入 CMD,或是直接執行命令提示字元

輸入

wsl

接著會跳入 wsl 子系統

進入你想要的目錄,輸入

cd ~

會進入 home 目錄中,如果會一點 linux command 指令可以建立自己的資料夾位置放置,接著輸入

curl -s https://laravel.build/linebot-app | bash

其中 linebot-app 這字串是你自己可以自由跟動的專案名稱,輸入完畢之後,整個 laravel 9 的專案就開始建立了。

接著專案自己會開始下載整包新的 laravel,等系統 pull 完畢就可以了

等下載

過程中可以看到 用指令文字組成的 LARAVEL 字樣

下載完畢之後,依據你的專案名稱,進入該目錄,接著啟用 DOCKER 映像檔打包成容器

cd linebot-app

輸入 Laravel sail 指令,這段其實等同 docker-compose up -d ,只是 sail 專案包覆了指令

./vendor/bin/sail up -d

sail 會是之後調用環境需要啟用的指令,如果需要常輸入可以利用 alias 的方式輸入

alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'

編輯  ~/.bashrc ,如此一來就會常駐在系統中,後面範例都將會省去 sail 位置指令

接著安裝 mesak/laravel-linebot 套件,輸入

sail composer require mesak/laravel-linebot

安裝完畢之後依序輸入


sail artisan vendor:publish --tag=mesak-linebot.config

sail artisan vendor:publish --tag=mesak-linebot.listener

兩個檔案的輸出,分別是 config 設定檔,以及 listener 事件處理。

listener 會將檔案輸出到 app\Listeners 下,產生 LineBotListener.php 檔案,因此需要直接進入 config/linebot.php 去修改 listener 位置,如圖,將 listener 修改或是註解,改為新的位置 ‘App\Listeners\LineBotListener’

 app\Listeners\LineBotListener.php 這支檔案,就在這邊定義 LINEBOT 接收到的訊息,如果需要回傳文字,就直接 return 就可以處理了,如果你會 Flex Messages ,只需要把回覆內容利用 Array 方式回傳,如產生中的 raw 指令一樣。

申請 LINEBOT

首先進入 LINE 的 開發者網站,點選 Message API,登入個人帳號之後就可以申請 LINEBOT

接著在你申請的機器人頁面中,找到 Channel ID,以及 Channel secret 兩個設定值,記住不要外洩出去,這兩個數值就可以產生 TOKEN 來與機器人互動,開啟根目錄下的 .env ,在最末段加入你的 ID 跟 SECRET

LINE_CLIENT_ID=xxxxxxxx
LINE_CLIENT_SECRET=xxxxxxxx

接著最後一段就是在路由開啟機器人的對接,根目錄的 routes/api.php 裡面追加一段

use Illuminate\Http\Request;
Route::post('/line', function (Request $request) {
    return \Facades\Mesak\LineBot\Contracts\Bot::handle($request);
});

基礎設定就大功告成,接著要讓 LINE 連線到你的機器來作動

接著必須要下載 ngrok 沒用過的朋友可能要去看一下教學,這邊就不贅述

ngrok 要架設在 wsl 或是 windows 裡面都可以,我個人是架設在 windows 裡面,所以指定位置之後 輸入

ngrok http 80

當你 ngrok 都設定好的時候,就會跳出對外網址,Forwarding,理論上滑鼠可以點,點開他用瀏覽器查看,順便複製網址準備填入 LINE

由於我們是放在 api 路由上,把網址尾段加上 api/line,接著進入 LINE > messaging-api 分頁,把 Webhook URL 這邊填入 ngrok網址/api/line

加入機器人,看機器人有沒有回應你,輸入預設三個指令測試 hi、hello、raw ,都有出現東西的話機器人就連接完畢了。

整理一下步驟

安裝 WSL

安裝 DOCKER DESKTOP

指令輸入 wsl

選擇一個位置 例如 cd ~


curl -s https://laravel.build/linebot-app | bash

cd linebot-app
 
./vendor/bin/sail up -d

alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'

sail composer require mesak/laravel-linebot

sail artisan vendor:publish --tag=mesak-linebot.config

sail artisan vendor:publish --tag=mesak-linebot.listener

申請 LINEBOT 機器人取得 Channel ID,以及 Channel secret

修改 .env

修改路由,增加 function

use Illuminate\Http\Request;

Route::post('/line', function (Request $request) {
    return \Facades\Mesak\LineBot\Contracts\Bot::handle($request);
});

安裝 ngrok


LINE 網頁中填入 Webhook URL 網址:{url}api/line


加入機器人測試

套件目前可以正常對應運作,但是未正式發布,因為對應的動作太少,等到 1.0.0 發布之後可能要移除套件之後再安裝,避免版本鎖定

以上步驟可以簡單快速建立一個 PHP 的開發環境,注意是開發喔,正式機環境可能還要學習一下部屬專案的流程,另外 LINEBOT 回應皆採用 Queued Event Listeners,如果未來 env 的 QUEUE_CONNECTION 參數 從 sync 改為 database,就會需要 woker 來處理,後續有套件上的問題,歡迎發 PR 給我或是提 issue

You may also like