iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0

第12 屆iT邦幫忙鐵人賽系列文章 (Day11)

如果前面介紹的訊息類型都不夠怎麼辦?就用 Flex Message 做個客製化的訊息吧,看看官網這些 showcase,4不4很酷阿

設計魂發作

這些效果,主要都是用 JSON 字串組出來的,官網也很貼心的提供 Simulator 來讓你用GUI的方式來設定自己客製的 Flex Message,之前電子喜帖是用圖片的方式,我們來改成 Flex Message 吧。

我在 Simulator 拉的訊息圖片如下 (其實蠻好上手的)

加入行事曆希望引導到 Google Map

透過 UriAction 即可解決

[https://calendar.google.com/calendar/u/0/r/eventedit?text=Kyle%27s%20Wedding&dates=20201208T100000Z/20201208T140000Z&details&location=%E5%8F%B0%E5%8C%97%E6%9D%B1%E6%96%B9%E6%96%87%E8%8F%AF](https://calendar.google.com/calendar/gp#~calendar:view=e&bm=1&text=KyleWedding&dates=20201208T100000Z/20201208T140000Z&details=&location=%E5%8F%B0%E5%8C%97%E6%9D%B1%E6%96%B9%E6%96%87%E8%8F%AF)

點選右上角 View as JSON 就能取得完整的 JSON 字串

回到 .NET 發送吧,在 LineReplyMessageUtility.cs 實作 ReplyMessageByJsonAsync

public async Task ReplyMessageByJsonAsync(string replyToken, string jsonString)

{

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 FlexMessage()

{

Contents = JsonConvert.DeserializeObject(jsonString)

});

var postJson = JsonConvert.SerializeObject(req, new JsonSerializerSettings

{

NullValueHandling = NullValueHandling.Ignore,

ContractResolver = new DefaultContractResolver

{

NamingStrategy = new CamelCaseNamingStrategy()

},

Formatting = Formatting.Indented

}).Replace("\"",@"""");

request.Content = new StringContent(postJson);

request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

var response = await httpClient.SendAsync(request);

var result = await response.Content.ReadAsStringAsync();

}

}

}

FlexMessage 繼承 IMessage

public class FlexMessage : IMessage

{

public LineMessageType Type => LineMessageType.flex;

public string AltText => "Flex Message";

public dynamic Contents { get; set; }

}

OnMessageAsync

實作 WeddingInvitation.cs

複製的 JSON 字串記得將雙引號取代成兩個雙引號

await lineMessageUtility.ReplyMessageByJsonAsync(replyToken, jsonString);

像 FlexMessage 這種複雜的 JSON 我建議就不要用啥C# 型別來組了,只會讓程式碼更噁心而已,如果要動態修改裡面的內容,其實也只是要改字串而已,譬如:

var name = "kyle";
var jsonContent = $"hello world, {name}";

實作效果

懶人包,本次學到了什麼?

本篇文章同步發佈於我的 Medium 如果這篇文章對你有幫助,就大力追蹤和拍手鼓掌下去吧 !!


上一篇
婚禮現場交通資訊一覽表
下一篇
Hold on Hold on 重構一下!
系列文
宅男的浪漫 - 用 .NET Core 打造 Line 婚禮聊天機器人經驗分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言