環境 |
Visual Studio 2015 C# + MSSQL 2014 + Azure DB |
目的: |
本篇介紹LineBot 取得好友ID,8並且透過ID發送給對象的訊息 ※需要有第一章節相關知識 |
為何: | 若能取得好友ID,就能直接對加了機器人好友的Line發送訊息操作 |
Github: | https://github.com/gotoa1234/LineLoginExample |
本篇分為四部分: | |
一、 | LineBot 好友的ID取得方法 |
二、 | Line API Document 文件實作發送功能 |
三、 | Web QueryString 進行發送訊息功能 |
四、 | 實際DEMO,Line 上與Web資料發送(範例用Web做Post) |
0001. Azure + LineBot 程式架設教學 : https://dotblogs.com.tw/milkgreenteaprograme_c_sharp/2016/12/29/001512
一、LineBot 好友的ID取得方法
Step 1:我們要進行測試,首先必須先用自己的帳號加入LineBot好友
Step 2: 以下是程式碼,當使用者呼叫Line時都會將自己的UserId 傳給機器人,這邊是紀錄到DataBase中 ,資料表欄位如Step4:的介紹
//機器人Token : 仙草奶綠
string MyLineChannelAccessToken = "隱藏起來";
/// <summary>
/// Line機器人回覆API
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/LineBotApi/post")]
public async void Post()
{
try
{
//取得 http Post RawData(should be JSON)
string postData = Request.Content.ReadAsStringAsync().Result;
//剖析JSON
var ReceivedMessage = isRock.LineBot.Utility.Parsing(postData);
var bot = new isRock.LineBot.Bot(this.MyLineChannelAccessToken);
//解析使用者傳給Bot的文字訊息
string userCommandString = ReceivedMessage.events[0].message.text;
//Service工作
LineBotMember _service = new LineBotMember();
//Return Message
string message = string.Empty;
//字串為save表示紀錄 ※實際應用應該偷偷記錄User ID ,這邊是範例
if (userCommandString == "save")
{
//測試方法: 紀錄
_service.InsertID(ReceivedMessage.events[0].source.userId);
//回覆API
var call = Task.Run(() =>
{
bot.ReplyMessage(ReceivedMessage.events[0].replyToken,
string.Format("紀錄成功: {0}", ReceivedMessage.events[0].source.userId));
});
}
}
catch (Exception ex)
{
//取得 http Post RawData(should be JSON)
string postData = Request.Content.ReadAsStringAsync().Result;
//剖析JSON
var ReceivedMessage = isRock.LineBot.Utility.Parsing(postData);
var bot = new isRock.LineBot.Bot(this.MyLineChannelAccessToken);
//回覆API
var call = Task.Run(() =>
{
bot.ReplyMessage(ReceivedMessage.events[0].replyToken,
string.Format("錯誤資訊:{0}", ex.Message));
});
}
}
可以得知關鍵的語法如下,解析傳給機器人的UserID:
isRock.LineBot.Utility.Parsing(postData).events[0].source.userId;
Step 3: 實際在Line 上面當我們輸入 "save" 時LineBOT會將User ID 寫到DB ※也就是只要加LineBot好友並發送訊息,UserId就可以被LineBOT API紀錄了,應用滿廣泛的 EX:發垃圾廣告XD。
※下方紀錄成功資訊,後面帶的是我LineID,這邊隱藏。
Step4: 當記錄到資料庫中的資料表格式如下:下一篇文章會繼續使用
/// <summary>
/// 資料表: Line機器人的連絡對象
/// </summary>
public class LineMemberTableModel
{
/// <summary>
/// 流水號
/// </summary>
public int Sn { get; set; }
/// <summary>
/// 唯一碼
/// </summary>
public string Id { get; set;}
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set;}
/// <summary>
/// 最後登入時間戳
/// </summary>
public DateTime LastLoginTime { get; set; }
/// <summary>
/// 帳號餘額
/// </summary>
public double AccountBalance { get; set;}
/// <summary>
/// 用戶帳號
/// </summary>
public string Account { get; set;}
/// <summary>
/// 用戶密碼
/// </summary>
public string Password { get; set;}
}
Azure DB Sql Select Result :
二、Line API Document 文件實作發送功能
Step 1:下方是Line API的文件
https://developers.line.me/en/docs/messaging-api/reference/#send-push-message
1 : 表示Post Json 的格式
2 : POST的Header (標頭) ContentType 請使用 application / json 格式 , 驗證機制是用LineBOT 的存取Token
3 : 傳送的Json 參數,對象有三種 1. UserID : 個人用戶 2.GroupID:不具名稱群組聊天室 3. 建立具名稱的群組聊天室
※以下是補充 如何查看Channel Access Token
Step 1: 進入Line Manager https://admin-official.line.me/ ,選擇開發的機器人
Step 2: 帳號設定 -> Message API設定 -> Line Developers
Step 3: 進入後拉到下方就可以看到 存取Token
三、Web QueryString 進行發送訊息功能
本篇第一章我們進行了紀錄UserID的方法, 第二章得知傳送訊息的叫用方法,第三章這裡就要實作發送功能
Step 1:使用Visual Studio MVC 開發網頁
文件對應 | 說明 |
Controllers/SendMessageController.cs | 發送給對象的POST實作 |
SendMessage/Index.cshtml | 頁面顯示的資訊 |
Step 2: SendMessage/Index.cshtml ==> 頁面採用QueryString 簡單將資料送到後端,然後從後端叫用Line官方API(Server 端)
HTML:
@model CommonLibary.Model.ViewModel.LineLoginExample.SendMessageViewModel
@{
ViewBag.Title = "Home Page";
}
<div class="jumbotron">
</div>
<div class="row">
<p>發送對象:@Model.userId</p>
<p>傳送訊息:@Model.SendMessage</p>
</div>
Step 3: Controllers/SendMessageController.cs ==> 實作方式
發送方式 : 透過URL 帶的 botUserID 來決定對象
/// <summary>
/// 發送按鈕
/// </summary>
/// <returns></returns>
public async Task<ActionResult> Index(string botUserId)
{
SendMessageViewModel resultViewModel = new SendMessageViewModel();
//如果使用者有正確輸入 UserId才進行下列工作
if (false == string.IsNullOrWhiteSpace(botUserId))
{
//回覆API
LineMessagingWorking Service = new LineMessagingWorking();
var result = await Service.PushMessage(botUserId, string.Format("現在時間:{0} 被機器人呼叫了", DateTime.Now));
//回傳前端的資訊
resultViewModel.userId = botUserId;
resultViewModel.SendMessage = result.ToString();
}
return View(resultViewModel);
}
實作類別(叫用方式組成) :
/// <summary>
/// 工作類別
/// </summary>
public class LineMessagingWorking
{
//機器人Token : 仙草奶綠
private readonly string MyToken = "這個必須隱藏起來,不好意思";
//API位置
private readonly string PushMessageUrl = "https://api.line.me/v2/bot/message/push";
//使用Post、Get等Http方法
private HttpClient Client = new HttpClient();
/// <summary>
/// 建構式
/// </summary>
public LineMessagingWorking()
{
//ContentType
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//驗證Header
Client.DefaultRequestHeaders.Add("Authorization", $"Bearer {this.MyToken}");
}
/// <summary>
/// <para>Line 傳送純文字的API</para>
/// <para>的API官方文件說明: https://developers.line.me/en/docs/messaging-api/reference/#send-push-message</para>
/// </summary>
/// <param name="userId">※如果是群組隊向就是GroupId ,本範例以單一個人用戶為例</param>
/// <param name="sendMessage">文本發送方法</param>
/// <returns></returns>
public async Task<HttpStatusCode> PushMessage(string userId, string sendMessage)
{
try
{
var post = await Client.PostAsJsonAsync(PushMessageUrl, new {
to = userId,
messages = new[] {
new {
type="text",//指定傳送的型態 text =>文本
text =sendMessage,
}
}
});
return post.StatusCode;
}
catch(Exception x)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(x.Message) });
}
}
}
四、實際DEMO,Line 上與Web資料發送(範例用Web做Post)
Step 1:輸入Azure 網址列參數 ,QuerySrting的URL : http://louislinebot.azurewebsites.net/sendMessage?botUserId=UXXXXXXXXXXXXXXXXXXXXXb
畫面如下:
Step 2: 當呼叫成功時,用戶的Line 就會被機器人(Token是機器人的)發送給對象
※時間是Azure Server端的時間,架在雲端主機的位置有時差