0002. 取得機器人好友帳號ID + 發送資料的實作(Line API Push Message)

環境

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端的時間,架在雲端主機的位置有時差