2016年12月29日 星期四

使用C#開發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://www.udemy.com/line-bot/
電子書:http://studyhost.blogspot.tw/2017/12/line-bot.html
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
--------------------------------------------
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

13 則留言:

Maxi Ng 提到...

linebot需要在使用者加朋友時, 記錄該使用者的ID, 才能用來發訊息給指定的人
這個line notify需不需要? 如何指定通知誰?

isDavid 提到...

to Maxi,

你的App對每一個用戶驗證後,都會拿到一個唯一的token,該Token發的訊息就是發給該用戶,因此你需要自行記錄用戶token與個人身分之間的關係。

Unknown 提到...
作者已經移除這則留言。
Lee Alan 提到...

請問如意要發送訊息到群組,要如何進行呢?
Goigke到的資訊,都是1對1的聊天室。
不知是否為連動頁面那,選擇既有的群組??
若選了三個群組,而該次訊息只要丟到群組一,以LINE notify是否可達成?

Lee Alan 提到...

自回,我今天實作發現可都有到群組,只是要將LINE notify先加入到群組內。

Chen Ming 提到...
作者已經移除這則留言。
Chen Ming 提到...

https://gist.github.com/isdaviddong/5be7998a916b18dc978d27ea9d9054a0

大大請問一下,裡面第9行、第10行怎麼更改,要按哪裡才能做修改的動作

呂政達 提到...

請問是否可以發送圖片呢?

Unknown 提到...
作者已經移除這則留言。
Samit Wu 提到...

請問,我原來的 LineNotify 使用都正常,最近看到您提到的 Line login 2.1 版本,如果 1.0 版本在 2018.03 停用後,原來的 LineNotify 是否會受影響而跟著被停用? 我已測試過 2.1 的登入,程式碼也修改好了...從https://developers.line.me/en/ 新申請,使用新申請的帳號的client_id 也都能取到 token .. 但如果用原來 LineNotify (https://notify-bot.line.me/my/services/) 上的 client_id 去跑,卻會出現 400. Bad Request. Confirm your request. 的錯誤?? 請問該如何處理?? 感恩哦...

俺不是王子. 提到...
作者已經移除這則留言。
steven 張 提到...

老師,請問要怎麼取得 API Rate Limit 嗎?

steven 張 提到...


老師,請問他是每個token可用1000次嗎? 超過再重新取得token 1000次會重置嗎?
There is a limit to the number of times an API can be called on each service.
The default number is set to 1000.
The limit is per access token.
The API Rate Limit status, can be checked on the response header of the API.

Related Posts Plugin for WordPress, Blogger...

熱門文章