搜尋此網誌

2022年10月14日 星期五

C# LINE Messaging API 廣播訊息

緣起:


    把 LINE 的 APP 建立好後,接下來就可以開始寫程式了,這次比較不一樣的是,我已經有個其它工程師寫好的,現成的程式可以參考了。我稍微看了看程式後,發現,其實它的邏輯跟我之前在弄那些社群軟體的 API 使用方法很像,一樣弄個 POST,然後 Header 設個 Authorization Bearer,content body 傳個 json 出去就完成了,不過,他的寫法跟我的有些差異,有東西能學。

    程式碼裡面還有放三個連結給我參考



Bearer Token:


    首先到你 LINE Developer 的首面,選擇你的 APP,然後到 Messaging API 那邊



    滑到最下面就能看到了,我記得一開始時會沒有,你可能會需要按下 Access Token 之類的按鈕,它才會產生



C# 程式碼


    由於我們要傳 JSON 格式過去,所以在 C# 裡會用到之前使用過的 Newtownsoft.Json,這邊不一樣的是,他是先弄個 class 出來,再用工具把它給轉成 JSON 字串,跟我先前使用的方法不一樣。


    這裡還有弄個 Root 類別,裡面放的是 message 的串列,這樣可以在 JSON 裡產生多個 message,像 -> {[{message1}, {message2}, {message3}....]} 這樣,我們會在 JSON 裡放兩個 message,一個代表文字,叧一個代表貼圖,他們用 type 來做區別,文字的話,type 是 "text",需要的值就只有 text,如果是貼圖的話,type 的值會是 "sticker",會同時再需要 packageId 跟 stickerId 欄位,用這兩個欄位來決定一個貼圖 (免費使用的貼圖)。

    再來看向我們主程式部份,最外一層是一個 HttpClient,使用前記得要 using System.Net.Http,這個 HttpClient 是在最後送出 reqeust 跟接收 response 會用到的


    裡面再包一個 HttpRequestMessage,它跟上面的 HttpClient 都有實作 IDisposable 介面,我們可以使用 using 來做資料的釋放。在 new 一個 HttpRequestMessage 的 instance 時,它傳入了兩個參數,第一個是 HttpMethod instance,它在這邊 new 一個並傳入 POST 字串,設定我們 request 的方法為 POST,再來是要請求的目標網址,在這裡是 LINE Messaging API 的廣播用 Endpoint

https://api.line.me/v2/bot/message/broadcast



    再來是在 request 加入 Authorization 標頭,放我們的 Bearer Token,這裡使用的 TryAddWithoutValidation 在加入標頭成功後會回傳 true,否則回傳 false


    接著要產生我們的 JSON 字串,新增一個 Root instance,並把一個 Message 型態的 List 放進去,那個 List 裡面有兩個 Message 物件,一個文字,另一個是貼圖


    再來是關鍵,把那個 root 轉成 Json 字串,這裡用的是我超常在我們專案上看到的 JsonConvert.SerializeObject 函式,第一個參數是你要轉換的目標物件,第二個是格式化的設定,我們先來看一下轉出的 JSON 字串長怎樣


    然後再看一下我們的程式是怎麼寫的


    重點是第二個參數,它是一個 JsonSerializerSettings 物件,它 new 的寫法是初始化的同時指定特定物件欄位的初始值,這種寫法在 python 上有看過,所以有意會過來,這邊有詳細的介紹。
再來對於那些欄位的設置,我大部份是用自己的直覺去解釋的,那個 NullValueHandling 很好猜,就是對於物件裡沒有初始值的欄位的處理,這邊是選擇忽略,再來那個 ContractResolver 看起來滿麻煩的,要 new 一個 DefaultContractResolver 的物件,然後初使化 NamingStragegy 的欄位時還要 new 一個 CamelCaseNamingStrategy 給它。我猜,它是設定 JSON key 欄位的命名方式,那個 CamelCase 代表命名的方式是駝峰,就,開頭的英文單字是小寫,接下來要連接的單字,他們的開頭都是大寫,這樣


    那個 ContractResolver 的官方教學文件在這,可以看一下我們的 JsonConvert.SerializeObject 方法如果沒加 JsonSerializerSettings 參數,最後生成的 JSON 字串會長怎樣。可以看到,那些沒有初始化的欄位都跑出來了,而且值是 null,key 的名稱都是英文小寫

  
    完成 JSON 字串後,最後就是把 JSON 字串給附加在 request 的 body 裡

body 裡放 JSON,並將 request 的 ContentType 設成 application/json

    然後用 HttpClient 把 request 送出,從方法的名稱能知道,發送跟接收都是用非同步的

那個 result 是 string

    沒意外的話,你應該就能看到你 LINE 官方帳號送的文字跟貼圖



沒有留言:

張貼留言