接下來為我們的Line官方帳號寫一個WebHook。
Line的WebHook的概念就是:在LINE的後台設定一個Api網址
用來訂閱
在Line官方帳號上面發生的事件
,
當事件發生的時候,這個設定的Api網址就會被呼叫
。
要製作一個基本的、具有回話功能
的WebHook,需要經歷下面幾個步驟:
WebHook
的Api Function,當訂閱
事件發生時進行處理Server
環境,把程式佈版上去SSL憑證
,Line的相關服務幾乎都需要是https
開頭的網址本篇將會包含第一步驟的內容:
在Line官方帳號中,會接收到的WebHook事件基本上有這一些:
當有使用者發送訊息給你的官方帳號時,LINE會用下面這段JSON作為參數呼叫你的WebHook Api:
其中會包含一個傳送目標destination
跟多個事件的集合events
{
"destination": "你的Line官方帳號的UserId",
"events": [
{
"replyToken": "用來回覆訊息的Token",
"type": "message",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "傳送訊息來的UserId"
},
"message": {
"id": "訊息的代號",
"type": "訊息的類型",
"text": "文字訊息的內容"
}
}
]
}
目前先以接收文字訊息
作為目標,建立幾個C#的Class:
可以複製上面這段JSON,至Vistual Studio中使用選擇性貼上
>貼上JSON作為類別
來快速產生C#物件
public class LineEvents
{
public string destination { get; set; }
public Event[] events { get; set; }
}
public class Event
{
public string replyToken { get; set; }
public string type { get; set; }
public long timestamp { get; set; }
public Source source { get; set; }
public Message message { get; set; }
}
public class Source
{
public string type { get; set; }
public string userId { get; set; }
}
public class Message
{
public string id { get; set; }
public string type { get; set; }
public string text { get; set; }
}
MessageAPI關於發送訊息
主要分成兩大部分:
ReplyApi
的部分:下面是要呼叫ReplyApi,Request所需要輸入的參數:
ReplyApiUrl:https://api.line.me/v2/bot/message/reply
欄位名稱 | 範例內容 | 說明 |
---|---|---|
Content-Type | application/json | Body中必須是JSON格式的字串 |
Authorization | Bearer {channel access token} | channel access token是LINE官方帳號的一組認證碼,可以用來串接MessageAPI |
欄位名稱|型態|是否必填|範例內容|說明
------------- | -------------| -------------| -------------
replyToken|字串|是|"e09b7d03bc074fbd93a4941efc71f0ea"|Webhook事件中會提供的token,用來回覆訊息使用。
messages|訊息物件的陣列|是|[{"type":"text","message","測試一下"}]|訊息物件的陣列,最多一次可以傳送五則訊息
notificationDisabled|Boolean|否|預設值是false|設定為true時,官方帳號發出訊息時,好友將不會收到提醒
Issue
產生一個這邊要針對訊息事件
的文字訊息
撰寫回應訊息(ReplyMessage)的程式
public class TextMessage
{
public string type { get {return "text";} }
public string text { get; set; }
}
public class ReplyMessageModel
{
public string replyToken { get; set; }
public bool notificationDisabled { get; set; }
public List<object> messages { get; set; }
}
private TextMessage BuildTextMessage(string msg)
{
return new TextMessage()
{
message = "msg"
};
}
private string accesstoken = "";
private string replyApiUrl = "";
[HttpPost]
public async Task<IActionResult> WebHook([FromBody]LineEvents request)
{
foreach (Event eventObj in request.events)
{
//判斷事件的類別
switch (eventObj.type)
{
//如果是訊息事件
case "message":
switch (eventObj.message.type)
{
//如果是文字訊息
case "text":
//todo 回傳對方傳來的訊息回去
break;
}
break;
}
}
return OK();
}
foreach
迴圈的上方加入以下語法://建立一個HttpClient物件,用來發出請求
HttpClient client = new HttpClient();
//填入token
client.DefaultRequestHeaders.Add("Authorization", $"Bearer{accesstoken}");
//設定Body的型態
client.DefaultRequestHeaders
.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//設定請求的body的Url&請求類型
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, replyApiUrl);
todo 回傳對方傳來的訊息回去
處加入以下語法:TextMessage content = BuildTextMessage($"我收到了:{eventObj.message.text}");
//建立回傳訊息的物件
ReplyMessageModel reply = new ReplyMessageModel()
{
replyToken = eventObj.replyToken,
messages = new List<object>(){
BuildTextMessage
}
};
//將回傳訊息的物件放入請求的body
string param = JsonConvert.SerializeObject(reply);
request.Content = new StringContent(param,
Encoding.UTF8,
"application/json");
//發出請求
await client.SendAsync(request);
假設有人對官方帳號說話時,我們會自動回應他:我收到了:{對方說的話的內容}
例如有人說:你好,API將會自動回應他:我收到了:你好