2016年12月29日 星期四

關於LineBot(6) - 不用申請Bot也能發訊息的Line Notify

前面我們討論到了很多跟LineBot有關的機制,但有朋友提了一個問題,如果我單單只是要透過程式碼發訊息給用戶,一定要申請並建立一個LineBot嗎? 其實不用。

一直以來,有一個比較不被重視的機制,叫做Line Notify,其實它已經誕生很久,IFTTT的Line通訊整合,就是用Line Notify做的。

Line前幾天的TectPulse中,對Line Notify的定義是…

第三方服務提供商可以利用 LINE Notify 套件開發通知型的應用,讓外部網站的服務和應用能透過 LINE Notify 官方帳號傳送純文字、貼圖或圖片式的服務通知給用戶,例如天氣預報、貨到超商請取貨、匯款成功、交易完成等。LINE Notify 就像一般的聊天機器人一樣可以加入一對一的對話視窗中,也能加入群組中。

他這樣講你聽得懂? 聽得懂就好…ㄟ…不懂也沒關係,我稍微翻譯一下。

簡單的說就是,如果開發人員(或店家、或企業)只是想要發通知給用戶,或和用戶進行基本的互動,那倒也不一定需要自己申請一個LineBot(因為未來用戶可能得要加入很多LineBot,收到很多不同單位傳來的訊息,這樣用戶會很煩,最後把你的Bot封鎖,或是根本忘了它,而且,商家(開發人員)申請LineBot要付$$$$$很貴的$$$$$),但若你用現成的LineNotify,其實也可達成此功能(且Free)。

LineNotify就是底下這個…

其實,它就跟一個Bot一樣,你根本可以把它想成一個共用的Bot。它一樣可以發訊息給你的用戶,跟你的用戶互動,你只要能夠Access這個Line Notify Bot,就可以透過它來發送訊息。

怎麼做呢? 首先,你還是要申請一個Line Notify的使用憑證,基本上就是取得Client_id與client_secret。申請網址在底下:
https://notify-bot.line.me/zh_TW/

Line把這個申請藏得很好,請拉到最下面,找到…『登錄服務』:

你看,這藏得多麼隱密啊。

點選後用你的Line帳號登入,會出現底下的表格:

請妥善填寫,然後按下『同意並往下一步』。填寫的重點只有兩個:

  1. 服務名稱和服務圖片,會出現在LineNotify用oAuth2機制跟你的用戶請求Access Token的時候出現。
  2. Callback URL會用來作為oAuth2授權後取回authorize code的返回網址。

輸入完成之後,會出現像是底下的畫面,你就可以成功取得Client_id與Client_Secrt:

喔喔,等等,剛才上面出現了一個部分開發人員可能不很熟悉的『oAuth2』身分驗證機制。如果你對oAuth不熟,讀到這邊可以就此放棄….好啦,也可以硬著頭皮看下去…

背景說明 : 由於LineNotify需要讓你對特定用戶發訊息,但你沒有該用戶的Line Id,也沒有申請一個LineBot去取得該用戶的Line User Id,那怎麼發訊息呢? 答案是需要一個Token。當你得到這個Token,就可以透過該Token對用戶發訊息。你要跟用戶要Token,Line系統在產生Token時,就需要用戶登入他的帳號密碼,但用戶當然不能給你他的帳號密碼,因此LineNotify採用的就是oAuth2機制。(補充:後來我補寫了oAuth與SSO介紹,請參考這裡)

別怕,背景說完沒聽懂也沒關係,我們實際操作一下。首先,請先建立底下這個網頁:

請特別留意該網頁中第19行的Button,按下去之後是一個URL轉址的動作,整個目的是用來取得一個authorize Code,你要用待會取得的這個Code再去換Token。(參考官方文件 https://notify-bot.line.me/doc/en/)

請特別注意上述程式碼的第9, 10行,其中第9行要換成你剛申請到的Client_id,第10行則是要填寫你寫在CallbackURL裡面相同的URL,因為我們要在用戶端測試,所以我填寫localhost網址,要這樣測試,這邊你必須能夠在用戶端Run一個模擬的Web伺服器(由於我很幸福的使用著Visual Studio 2015,因此這是一塊蛋糕)。

當用戶點選上面這個按鈕,會被導引到類似底下這樣的畫面(在進到底下這個畫面前,用戶會被要求用他的Line帳號密碼登入,當然登入畫面是Line提供的,因此你不可能知道用戶的帳密,這就是oAuth2的用途,登入後就會看到底下畫面):

請留意上面標示的數字:

  1. 就是你剛才申請時,上傳的LineNotify帳號圖式
  2. 就是你剛才申請時,填寫的LineNotify帳號名稱
  3. 你的開發帳號名稱
  4. 用戶帳號頭像

只要用戶選擇『同意並連動』,他(用戶)的Line會接收到LineNotify帳號(bot)傳遞的訊息(像是底下這樣):

同時間你的網頁會被導回Callback URL,你可以從QueryString取得Code,像是底下這樣:

這個Code很重要,我們要用這個Code來換Token。

後面的動作我用Postman來示範,當你取得這個Code之後你可以透過以POST呼叫底下的URL來取得Token:
請注意要傳遞的參數包含固定的grant_type,你剛才取得的Code(上圖1),你的redirect_url,你一開始申請時取得的Client_id(上圖2)與Clind_secret(上圖3),然後就會取得用戶的token(上圖4)。

取得Token之後就好辦了,這時候你可以透過對https://notify-api.line.me/api/notify的POST,來向用戶傳遞訊息,訊息內容放在POST body中:

ㄟ,別忘了,你要在Headers傳遞剛才取得的Token:

OK,用戶收到訊息囉,格式是【LineNotify服務名稱】訊息內容,像是下圖最後一則訊息:

that’s it.

坦白說,用LineNotify可能比LineBot還難一點,但如果你要大量的發送訊息,卻不想要申請一個自己的Bot(不想付貴桑桑的Line Bot費用),LineNotify也許是一個比較經濟的選擇。

demo source code : https://github.com/isdaviddong/Line_Notify_Example 

原始文件: https://notify-bot.line.me/doc/en/ 
--------------------------------------------
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

沒有留言: