上一篇完成簡易版本的Push Message ,這邊要稍微注意一下使用量。Line 提供兩種模式給Message API使用 “Push”、”Reply”兩種模式,其中Push用來推廣方案銷售,所以次數限量上會限縮在500則,超過後需要付費才能使用。

Reply 目前使用上沒有任何限制,所以使用上可以不必要特別拘謹。

前置作業、工具

處理步驟需要修改 launchSetting.json url ,並執行ngrok、dotnet run就可以使用。

  • launchSetting.json
  • ngrok
  • 後端技術 run

備註

ngrok 只要不中途離開,即使當下”網頁失效” ngrok 是會繼續執行。

程式碼範例

Reply Message - 1/2

Line Reply 需要使用者回覆訊息,Bots 部分會選擇適當回覆內容回覆給對方。當中 Reply 可以判別對方發的訊息是 Message 、Images 、貼圖 ,Json 回覆部分後續再探討。

完成【C#】Line BotsReply Message 前置作業,需要完成三步驟。

一、取得 JSON Body

1
2
3
4
5
6
7
8
9
10
11
12
13
string strBody = "";
try{
//取得 http Post
using (StreamReader reader = new(Request.Body, System.Text.Encoding.UTF8))
{
strBody = reader.ReadToEndAsync().Result;
if (reader == null || string.IsNullOrEmpty(strBody))
return JsonConvert.SerializeObject(new { success = false, message = "error : message empty " });
}
}catch(Exception ex){
bot.PushMessage(adminUserID, ex.Message);
return JsonConvert.SerializeObject(new { success = false, message = ex.Message });
}

二、轉 JSON Data

1
2
3
//RawData(should be JSON)
var ReceivedMessage = Utility.Parsing(strBody);
if (ReceivedMessage == null) return JsonConvert.SerializeObject(new { success = false, message = "error : message empty " });

三、取得Line Event

1
2
3
4
5
var LineEvent = ReceivedMessage.events.FirstOrDefault();
if (LineEvent == null)
{
return JsonConvert.SerializeObject(new { success = false, message = "error : not found event ! " });
}

Reply Message - 2/2

完成以上作業後,我的處理方式是把Event拆開,Line 有提供 Event 可以取得狀態。以下處理方式只有加入Join 以及message。

備註

如果使用這使用 images 貼上圖片,會直接執行到 message 。處理Line Event 方式需要留意一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void ReplyBotsMessage(Bot bot,Event lineEvent)
{
TextMessage textMessage = new ("");

switch (lineEvent.type)
{
case "join":
textMessage = new TextMessage($"大家好啊~");
break;
case "message":
string text = lineEvent.message.text;
if (text == null) break;
textMessage = new TextMessage($"您回應是 : {text}");
break;
}
if(string.IsNullOrEmpty(textMessage.text)){
textMessage = new ($"你回覆的訊息無法判讀,請重新輸入!!");
}
bot.ReplyMessage(lineEvent.replyToken, textMessage);
}

完整程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System.Text;
using isRock.LineBot;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

namespace dotnetCore_LineBot.Controllers
{
[ApiController]
[Route("[controller]")]
public class MessageController: ControllerBase
{
public string channelToken{get; private set;}="";
public string adminUserID{get; private set;}="";

[HttpPost]
public string Post(){
Bot bot = InitialBots();
List<MessageBase> repMessage = new List<MessageBase>();
string strBody = "";

try{
//取得 http Post
using (StreamReader reader = new(Request.Body, System.Text.Encoding.UTF8))
{
strBody = reader.ReadToEndAsync().Result;
if (reader == null || string.IsNullOrEmpty(strBody))
return JsonConvert.SerializeObject(new { success = false, message = "error : message empty " });
}
}catch(Exception ex){
bot.PushMessage(adminUserID, ex.Message);
return JsonConvert.SerializeObject(new { success = false, message = ex.Message });
}

//RawData(should be JSON)
var ReceivedMessage = Utility.Parsing(strBody);
if (ReceivedMessage == null) return JsonConvert.SerializeObject(new { success = false, message = "error : message empty " });

var LineEvent = ReceivedMessage.events.FirstOrDefault();
if (LineEvent == null)
{
return JsonConvert.SerializeObject(new { success = false, message = "error : not found event ! " });
}
ReplyBotsMessage(bot,LineEvent);

return JsonConvert.SerializeObject(new { success = true, message = "" });
}//public : Post


//-------------------------//
private Bot InitialBots(){
string channelToken = this.channelToken;
return new Bot(channelToken);
}//private: InitialBots

private void ReplyBotsMessage(Bot bot,Event lineEvent)
{
TextMessage textMessage = new ("");

switch (lineEvent.type)
{
case "join":
textMessage = new TextMessage($"大家好啊~");
break;
case "message":
string text = lineEvent.message.text;
if (text == null) break;
textMessage = new TextMessage($"您回應是 : {text}");
break;
}
if(string.IsNullOrEmpty(textMessage.text)){
textMessage = new ($"你回覆的訊息無法判讀,請重新輸入!!");
}
bot.ReplyMessage(lineEvent.replyToken, textMessage);
}//private: ReplyBotsMessage


}//class : MessageController
}//namespace

參考文件