環保愛地球,回傳電子喜帖 (6)

今天要來做電子喜帖功能,節能減碳,環保愛地球 主要傳送是用 Line 的 ImageMessage 這部分跟程式無關 XD 只是分享 template 網站,設計苦手的工程師其實可以考慮一些素材網站,或 template 網站,付點錢就能拿到質感極佳的設計 https://www.greetingsisland.com/ 將圖片傳到圖床 (imgur) Line 發送圖片時候是以 URL,通常我會傳到 imgur 平台產生一個 https 的連結,從上面網站製作好範例喜帖如下: OnMessageAsync 在前幾篇我們有介紹的OnMessageAsync,我們在這實作接收到文字訊息時候要回傳的訊息,考量到再來使用者的意圖 (intent) 可能會越來越多,我們用一個簡單的 Dictionary 來做處理 使用者的意圖 (intent) 是在做chatbot NLP 或使用 chatbot 一些服務時很常看見的名詞,簡單來講就是當使用者打出這句話時,是想做什麼事 定義一個介面,包含 ReplyAsync 方法,需要傳入回覆所需 replyToken public interface IReplyIntent { Task ReplyAsync(string replyToken); } 接收文字 protected virtual async Task OnMessageAsync(Event ev) { if (ev.message.Type.Equals(LineMessageType.text)) { // 完整比對使用者輸入的訊息,決定要回傳什麼 var msg = ev.message.Text; var intents = new Dictionary<string, IReplyIntent>() { { "電子喜帖" ,new WeddingInvitation(lineMessageUtility,lineProfileUtility)}, { "Default" ,new DefaultIntent(lineMessageUtility,lineProfileUtility)}, }; var intent = intents....

2020-11-06 · 1 min · Kyle

回傳不文謅謅的 Line 貼圖 (5)

我想 Line 豐富的貼圖,應該是很多人喜歡用它來做 Chatbot 的一個原因吧 接續上一篇,我們試著在歡迎詞後,傳送一個禮貌又不尷尬的貼圖 在 LineReplyMessageUtility.cs 擴充回傳貼圖 我們接續前一篇 LineReplyMessageUtility 這個類別再實作一個回覆貼圖的method public async Task ReplyStickerMessageAsync(string replyToken, string packageId, string stickerId) { using(var httpClient = new HttpClient()) { using(var request = new HttpRequestMessage(new HttpMethod("POST"), $ "{lineMessageApiBaseUrl}")) { request.Headers.TryAddWithoutValidation("Authorization", $ "Bearer {accessToken}"); LineMessageReq req = new LineMessageReq(); req.ReplyToken = replyToken; req.Messages.Add(new StickerMessage() { PackageId = packageId, StickerId = stickerId }); var postJson = JsonConvert.SerializeObject(req, new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() }, Formatting = Formatting....

2020-11-05 · 1 min · Kyle

回覆第一個Line的訊息-歡迎詞 (4)

第12 屆iT邦幫忙鐵人賽系列文章 (Day4) 本篇開始我們要來逐步實踐我們的婚禮 Chatbot 了! 我們預期在加入好友的時候 (OnFollow) 事件時回傳歡迎詞:Hi UserName, 感謝您加入 Kyle 的婚禮小助理! 取得使用者的資訊 記得上一篇講 Webhook Event 時的結構嗎? 裡面有個 userId 查看文件後,可以透過 access token 和 userId 來取得用戶資訊 建立一個 LineProfileUtility.cs 取得使用者資訊 我們建立一個 Class 來實作取得使用者相關程式,讓未來不同的情境可以調用,以下是文件取得使用者範例的Sample curl -v -X GET https://api.line.me/v2/bot/profile/{userId} \ -H 'Authorization: Bearer {channel access token}' 有個小技巧可以把 curl 轉成 C# 的 HttpClinet ,將以上的資訊貼到 https://curl.olsh.me/ 即可轉換完成,再做一些微調就好了 轉換後如下: using (var httpClient = new HttpClient()) { using (var request = new HttpRequestMessage(new HttpMethod("GET"), "[https://api.line.me/v2/bot/profile/{userId](https://api.line.me/v2/bot/profile/{userId)}")) { request....

2020-11-04 · 3 min · Kyle

用.NET Core 接收Line的訊息事件 (3)

第12 屆iT邦幫忙鐵人賽系列文章 (Day3) 先來看看文件 在 Line 的文件裡有定義 Webhook Event Objects 傳過來的 JSON 的結構 可以看到它會傳一個 events 過來,裡面包含幾個 properties replyToken : 用來回覆該使用者的Token type:使用者傳送訊息的類型 (message/video/sticker…) mode: Channel是否有效 source:使用者/群組的資訊 … 以上都可以從上方的文件去查看 properties 的用途 將 Line Event Request 轉成 C# Class 在上一篇我們 Web Api 是用 dynamic 來接收 Request,在VS有個功能是很快的把 JSON 結構轉成 C# 的 Class,這個技巧在串接異質 Api 蠻常用的,或者是可以用 json2csharp.com 這種服務來處理。 複製官方的JSON Sample,在 VS 點選編輯 => 選擇性貼上 => 貼上 JSON 結果會長這樣,通常我不會在一個 .cs 放多個類別,但為了文章好呈現故直接貼上來,拆一拆檔案的工也還好 做點加工,把 Event 的 Type 一些文件改成 C# 的 Enum,讓開發更順暢,新增一個 WebhookEventType....

2020-11-03 · 2 min · Kyle

用.NET Core接收第一個Line訊息 (2)

基本設定 關於如何註冊一個串接自己Web Api 的 Line Chatbot 網路上已經很多的教學文了,大概分為以下幾個步驟 https://developers.line.biz/en/ 申請一個Provider 申請一個Channel (一個Provider可以有多個Channel) 於Channel取得 Channel Secret 及 Access Token Use webhook 啟用 Auto-reply messages 關閉 設定 Webhook URL (需為https) 起始 Web API 專案與 Line Server 做連結 建立一個 .NET Core 3.1 的 Web Api 專案 建立一個 Line Controller,先用 dynamic 接收,看看 Request 過來的是什麼 執行看看,weatherforecast 為初始專案的 Sample,此Local Api 的 Port 為 44300 透過 ngrok 讓 Line Server 跟 Local Web API 做連結 安裝 node.js npm install ngrok -g ngrok -v 本文章所使用的版本為 2....

2020-11-02 · 2 min · Kyle