2018年8月19日 星期日

實作 LINE Notify 訊息通知服務

LINE Notify是官方的一個功能,類似bot但重要的一點是免費,但是Notify只能單向的傳訊並無法接收用戶發送的回應,類似單純的通知功能,這篇主要講的是如何申請Notify並且用C#作出一個應用程式,達到發訊息與圖片的應用。


LINE Notify網站是這樣介紹的:

透過LINE接收其他網站服務通知

與網站服務連動完成後,LINE所提供的官方帳號「LINE Notify」將會傳送通知。
不僅可與多個服務連動,也可透過LINE群組接收通知。
簡單說就是開發者可以透過Line來傳文字與圖片訊息給用戶。

建立LINE Notify服務


首先要到LINE Notify的網站下方點選登錄服務,申請一個使用憑證


接著登入要使用該服務的Line帳號,未來要調整該服務的名稱與各項設定都須使用該帳號做登入。輸入註冊服務的相關資訊,最重要的是 Callback URL,因為 Line Notify 會透過 oAuth2 來取得授權的 Authorize Code ,然後返回到這個 Callback URL ,最多填入5組網址。

登陸完成後會取得 Client ID 與 Client Secret ,這是該服務重要的識別碼,先記下來待會會用到。

連動使用者並取得 Authorize Code 


建立一個 ASP.NET Web 的空白專案,加入一個 Web 表單叫做 GetUser.aspx ,建立一個 Button 與 Label 讓使用者連結到Notify的設定頁面,並在網頁上顯示得到的 Access Token。
說明參數如下: _clientid 輸入在前一個網頁拿到的Client ID, _redirecturi  填入你的Callback URL , _clientsecret 輸入Client Secret 。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace LineNotifyGetUser
{
    public partial class GetUser : System.Web.UI.Page
    {
        #region 申請LINE Notify給的資料
        private string _clientid = "你的Client ID";
        private string _redirecturi = "http://localhost:55917/GetUser.aspx";
        private string _clientsecret = "你的Client Secret";
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            //取出使用者code執行轉換
            string userCode = Request.QueryString["code"];
            if (userCode != null)
            {
                string msg = GetTokenFromCode(userCode).ToString();
                lblMessage.Text = msg;
            }
        }

        #region 取得使用者code
        protected void BtnAgree_Click(object sender, EventArgs e)
        {
            var URL = "https://notify-bot.line.me/oauth/authorize?";
            URL += "response_type=code";
            URL += "&client_id=" + _clientid;
            URL += "&redirect_uri=" + _redirecturi;
            URL += "&scope=notify";
            URL += "&state=abcde";
            Response.Redirect(URL); //導回網頁
        }
        #endregion
    }
}

取得發送訊息的 Access Token


再來需要把網址 POST 回來的 Code 轉換成 Access Token ,在取得使用者code下方填入下列程式碼。
#region Code取得Token
private object GetTokenFromCode(string Code)
{
  string Url = "https://notify-bot.line.me/oauth/token";
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);

  request.Method = "POST";  
  request.KeepAlive = true; //是否保持連線
  request.ContentType = "application/x-www-form-urlencoded";
  string posturi = "";
  posturi += "grant_type=authorization_code";
  posturi += "&code=" + Code; //Authorize code
  posturi += "&redirect_uri=" + _redirecturi; 
  posturi += "&client_id=" + _clientid; 
  posturi += "&client_secret=" + _clientsecret; 

  byte[] bytes = Encoding.UTF8.GetBytes(posturi);//轉byte[]

  using (var stream = request.GetRequestStream())
  {
    stream.Write(bytes, 0, bytes.Length);
  }

  var response = (HttpWebResponse)request.GetResponse();

  var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();//回傳JSON
  responseString = "[" + responseString + "]";
  response.Close();

  var token = JsonConvert.DeserializeObject<JArray>(responseString)[0]["access_token"].ToString();
  try
  {
    return "連結成功,token:" + token;
  }
  catch (Exception ex)
  {
    return "連結失敗:" + ex.ToString();
  }
}
#endregion


當使用者在網頁上點下連結按鈕後,就會連結到LINE的登入畫面,登入後選擇接受通知的聊天室或是群組,再按下同意並連動。

連動完後,網址列會轉跳到剛剛設定的Callback URL ,並且可以在網址列中看到回傳的 Authorize Code ,在按鈕下方也會顯示得到的 Access Token 。


使用Access Token 傳送訊息


接著我們使用剛剛得到的 Access Token 來發送訊息給該使用者或是聊天群組,這邊要注意如果一開始是選擇聊天群組,需要使用者先把LINE Notify 加入該聊天群組中才能成功傳送訊息。
這裡我建立一個 Windows Forms 專案叫做 LineNotifySend ,在Form中加入兩個 TextBox ,一個叫做 tbxMessage 輸入文字訊息,另一個叫做 tbxURL 輸入圖片網址,一個 Button 叫做 btnSend ,一個 Label 叫做 lblStatus 檢視傳送狀態,並填入下列程式碼。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LineNotifySend
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string strToken = "剛剛得到的Token";
        private string imgurl = "";//圖片網址(選擇性)

        private void btnSend_Click(object sender, EventArgs e)
        {
            string Url = "https://notify-api.line.me/api/notify";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "POST";
            request.KeepAlive = true; //是否保持連線
            request.ContentType = "application/x-www-form-urlencoded";
            request.Headers.Set("Authorization", "Bearer " + strToken);
            string content = "";
            content += "message=\r\n" + tbxMessage.Text;//發送的文字訊息內容

            #region 傳送圖片(選擇性)
            imgurl = tbxURL.Text.ToString();
            content += "&imageThumbnail=" + imgurl;
            content += "&imageFullsize=" + imgurl;
            #endregion

            byte[] bytes = Encoding.UTF8.GetBytes(content);
            using (var stream = request.GetRequestStream())
            {
                stream.Write(bytes, 0, bytes.Length);
            }

            if (tbxMessage.Text == "")
            {
                lblStatus.Text = "訊息內容為必填或是網路異常!!";
            }
            else
            {
                var response = (HttpWebResponse)request.GetResponse();
                tbxMessage.Text = "";
                lblStatus.Text = "訊息傳送成功!!";
            }
        }
    }
}

除了傳送基本的文字訊息,還加入了可傳送圖片的選項,如果在 tbxURL 中有填入圖片網址的話,在傳送的同時會把文字與圖片訊息一併傳給使用者,在此注意文字訊息為必填。

執行程式並輸入文字訊息,使用者就接收到通知囉!!

總結


Line Notify 雖然要設定的步驟很多,但重點是它免費,台灣使用 LINE 的人非常多,在公司內與自動化設備上其實應用的範圍很廣,甚至在 LINE 的官方部落格中還有搭配物聯網,達到自動傳照片的應用,非常方便。

3 則留言:

  1. 您好,請問您在傳送多次後,程式是否回停在 var response = (HttpWebResponse)request.GetResponse(); 這一行?
    有點像是逾時,然後訊息雖有成功傳過去,但是程式會當掉。

    回覆刪除
  2. 您好照您範例作,發送文字檔正常,但傳圖片(圖片傳的和您一樣)則會出400 BadRequest不知是何原因?

    回覆刪除
  3. good job. you can create Facebook Messenger sample please.

    回覆刪除

EPPlus Excel好用工具