我想 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.Indented
});
request.Content = new StringContent(postJson);
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
var response = await httpClient.SendAsync(request);
}
}
}
StickerMessage.cs
public class StickerMessage: IMessage
{
public LineMessageType Type => LineMessageType.sticker;
public string PackageId {
get;
set;
}
public string StickerId {
get;
set;
}
}
ReplyStickerMessageAsync 傳了兩個參數:packageId, stickerId
這個定義在這份文件裡頭,我們在 OnFollow 事件增加回傳貼圖
await lineMessageUtility.ReplyMessageAsync(ev.replyToken, $@"Hi {user.displayName}, 感謝您加入婚禮小助理!");
await lineMessageUtility.ReplyStickerMessageAsync(ev.replyToken, "1", "1");
(X) 結果發現沒作用,原因是 ReplyToken 只能用一次,且也要注意有30秒左右的時效性
做點調整
ReplyMessageAsync 改接 IMessage 的 List
修改歡迎詞的程式
protected virtual async Task OnFollowAsync(Event ev)
{
// 取得使用者的資訊
var user = await lineProfileUtility.GetUserProfile(ev.source.userId);
// 回傳歡迎詞
var welcome = new TextMessage() { Text = $@"Hi {user.displayName}, 感謝您加入婚禮小助理!" };
var sticker = new StickerMessage() { PackageId = "11539", StickerId = "52114136" };
await lineMessageUtility.ReplyMessageAsync(ev.replyToken, new List<IMessage> {
welcome,
sticker
});
}
實際成果