分享程式代碼相關筆記
目前文章總數:223 篇
最後更新:2026年 03月 14日
訪問 Azure入口網站 或熟系的雲服務,目的是建立一個 WebHook 的可訪問資源
本篇用 2026 年 Azure 服務的方式說明
建立 Web 應用,資源、費用配置省略,依照自己所需規格設定
開啟已建立的 Web 應用 -> 設定(預覽) -> SCM基本驗證發佈認證 -> 打勾
補充說明:開啟此功能,密碼外洩風險較高,不符合現代資安規範。
但用於 Demo 測試在用完後立即刪除不造成影響,現代主流使用 GitHub Actions / Azure Pipeline
開啟已建立的 Web 應用 -> 概觀 -> 下載發行設定檔案
後續用於部署 App 服務,用於 LineBot Message API 的 Webhook 對象。
本篇範例代碼(.NET 9.0) 有以下專案架構
| 1. 初始化配置 | : | LineBot SDK、Service、MiddleWare 所需的依賴注入 |
| 2. 設定 | : | 存入 LineBot Channel Secret, Channle Token |
| 3. 背景服務 | : | 訂閱事件,實現消費者,處理 SubScribe Publish 到消費者的工作 |
| 4. Web控制器 | : | 提供 LineBotMessageAPI 使用的 Webhook 的介接 API & 推播機器人 API |
| 5. Html 畫面 | : | MiddleWare 捕捉 LineBot 的例外錯誤,讓 Controller 層乾淨 & 解耦合 |
Nuget 需安裝 Line.Messaging.NETCore .NET 6.0 以上都支援
我們提供一個 API 要提供給 LineBot Message API 的 WebHook 交互用
主要邏輯在 await _lineBotService.HandleEventsAsync(events); 方法中
[HttpPost]
[Route("api/LineBotApi/Post")]
public async Task<IActionResult> LineBotWebHook()
{
// 1. 取得並驗證 Webhook 事件(GetWebhookEventsAsync 內部自動驗簽)
var events = await HttpContext.Request.GetWebhookEventsAsync(_channelSecret);
await _lineBotService.HandleEventsAsync(events);
return Ok();
}
目前飯粒有 2 種邏輯
| 1. 輸入特定文字 | : | MilkTeaGreen_GetGroupId 會讓機器人回覆 ID, 用於推撥用 |
| 2. 其他內容 | : | 返回相同訊息,驗證機器人具可用性 |
/// <summary>
/// 依照收到的事件類型進行處理,目前僅處理文字訊息事件,並回覆相同的文字內容。
/// </summary>
public async Task HandleEventsAsync(IEnumerable<WebhookEvent> events)
{
foreach (var ev in events)
{
if (ev is MessageEvent messageEvent &&
messageEvent.Message.Type == EventMessageType.Text)
{
var textMessage = (TextEventMessage)messageEvent.Message;
string userMessage = textMessage.Text;
string replyToken = messageEvent.ReplyToken;
// 如果收到特定指令,回覆來源 ID;否則回覆相同的文字內容
if (userMessage == "MilkTeaGreen_GetGroupId")
{
var (userId, groupId, roomId) = GetSourceIds(ev);
await _lineClient.ReplyMessageAsync(replyToken,
$"您的 UserId : {userId} , GroupId : {groupId} , RoomId : {roomId}");
}
else
{
await _lineClient.ReplyMessageAsync(replyToken, userMessage);
}
}
}
}
另一隻 API 則是獨立使用,當專案運行時,呼叫 HandleEventsPublishAsync()
只要傳入正確的 Id 即可讓 LineBot 機器人推播訊息
/// <summary>
/// 用於 LineBot 推播訊息至指定群組
/// <para>https://chat.line.biz/</para>
/// </summary>
[HttpGet]
public async Task<IActionResult> LinePublish(string message, string groupId)
{
try
{
await _lineBotService.HandleEventsPublishAsync(message, groupId);
}
catch (Exception ex)
{
_logger.LogError(ex, "推播失敗");
return BadRequest("推播失敗");
}
return Ok("推播成功");
}
實際業務邏輯很單純,負責轉拋訊息
/// <summary>
/// 進行推播
/// </summary>
public async Task HandleEventsPublishAsync(string message, string groupId)
{
// 推播訊息至指定群組
await _lineClient.PushMessageAsync(groupId, $@"推播訊息 : {message}");
}
https://manager.line.biz/,選擇 建立帳號
※已建立可跳過 1~4
建立帳號名稱
進入後預設沒有任何 Channel 開通,選擇 Create a Message API Channel
依序照步驟建立帳號 & 驗證
登入後選擇右上角 設定
選擇 -> Messageing API -> 啟用按鈕點擊 -> 確定
將 Channle secret 資訊複製, 還缺 Channel Token
此時也可先將自己的 域名 + API 位置貼上,並且保存,本篇範例API 路徑:
https://{您的域名}/api/LineBotApi/Post
因為我們要透過程式與機器人互動,因此要進入 Line 的開發者模式 https://developers.line.biz/console/
進入後 -> 選擇帳號 -> Message API
拉到最下方 -> 點擊 Channel Access Token -> 將 Channel Access Token 資訊複製
※至此 Channel Access Token 與 Channel secret 都已取得
開啟專案,點開 appsetting.json 貼上自己的 此 Channel Access Token 與 Channel secret
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"LineBot": {
"ChannelSecret": "貼上,
"ChannelAccessToken": "貼上"
}
}
用自己的一般用戶 Line 加機器人好友,或者開一個群組加入
在預設的情況下,發送任意訊息,機器人只會回覆相同內容,表示 WebHook 成功接收我們的訊息
輸入特定字元 MilkTeaGreen_GetGroupId ,可以讓機器人回傳當前 發送者UserId 與 群組Id
我們嘗試將 UserId 填入到 Web 頁面上,並且輸入訊息,進行機器人推播發送
機器人可以針對某個用戶直接傳入訊息,後續可以結合 N8N、Jenkins、…等 CICD 工具搭配使用
至此,成功實現讓機器人回覆訊息 + 推播功能