2016年12月29日 星期四

使用C#開發LineBot(6) - 不用申請Bot也能發訊息的Line Notify

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

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

LINE在TectPulse中,對LINE Notify的定義是…
第三方服務提供商可以利用 LINE Notify 套件開發通知型的應用,讓外部網站的服務和應用能透過 LINE Notify 官方帳號傳送純文字、貼圖或圖片式的服務通知給用戶,例如天氣預報、貨到超商請取貨、匯款成功、交易完成等。LINE Notify 就像一般的聊天機器人一樣可以加入一對一的對話視窗中,也能加入群組中。
他這樣講你聽得懂? 聽得懂就好…ㄟ…不懂也沒關係,我稍微翻譯一下。

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

LINE Notify就是底下這個…

其實,它就跟一個Bot一樣,你根本可以把它想成一個商家共用的Bot(而非自己獨立建置的Bot)。它一樣可以發訊息給你的用戶,你只要能夠Access這個Line Notify Bot,就可以透過它來發送訊息。

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

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

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

點選後用你的Line帳號登入,會出現底下的表格:
請妥善填寫,然後按下『同意並往下一步』。填寫的重點只有兩個:
  1. 服務名稱和服務圖片,會出現在Line Notify用OAuth2機制跟你的用戶請求Access Token的時候出現。
  2. Callback URL會用來作為OAuth2授權後取回authorize code的返回網址。
輸入完成之後,會出現像是底下的畫面,你就可以成功取得Client_id與Client_Secrt:

喔喔,等等,剛才上面出現了一個部分開發人員可能不很熟悉的『OAuth2』身分驗證機制。如果你對OAuth2不熟,讀到這邊可以就此放棄….好啦,也可以硬著頭皮看下去…
背景說明 : 由於LineNotify需要讓你對特定用戶發訊息,但你沒有該用戶的Line Id,也沒有申請一個LineBot去取得該用戶的Line User Id,那怎麼發訊息呢? 答案是需要一個Token。當你得到這個Token,就可以透過該Token對用戶發訊息。你要跟用戶要Token,Line系統在產生Token時,就需要用戶登入他的帳號密碼,但用戶當然不能給你他的帳號密碼,因此LineNotify採用的就是OAuth2機制。(補充:後來我補寫了OAuth2與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,因此這是一塊蛋糕)。

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

請留意上面標示的數字:
  1. 就是你剛才申請時,上傳的Line Notify帳號圖示
  2. 就是你剛才申請時,填寫的Line Notify帳號名稱
  3. 你的開發帳號名稱
  4. 用戶帳號頭像
只要用戶選擇『同意並連動』,他(用戶)的LINE會接收到Line Notify帳號(類似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.

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

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

LineBotSDK:https://www.nuget.org/packages/LineBotSDK
相關課程:http://www.studyhost.tw/NewCourses/LineBot
線上課程:https://www.udemy.com/line-bot/
更多內容,請參考電子書:https://www.pubu.com.tw/ebook/103305
LINE Bot實體書籍:https://www.tenlong.com.tw/products/9789865020354
--------------------------------------------
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

22 則留言:

Maxi Ng 提到...

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

isDavid 提到...

to Maxi,

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

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

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

Unknown 提到...

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

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

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

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

阿達老爹樂分享 提到...

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

Unknown 提到...
作者已經移除這則留言。
Unknown 提到...
作者已經移除這則留言。
俺不是王子. 提到...
作者已經移除這則留言。
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.

小閔 提到...

請問各位大大們,Line Notify 是否能觸發手機的推播通知? 我測試結果是不行,發了Line Notify訊息後,手機並不會噹,沒有通知。但是打開LINE App後,能夠看到訊息有到手機。表示訊息正常接收,但是在我的IOS手機沒有觸發通知,各位也是這樣嗎?

Unknown 提到...

有些 IOS 手機的 LINE 需要手動把 @linenotify 加到自已的好友... 這樣才會正常收訊... (加入好友--直接輸入 @linenotify ) ...可以試試...

匿名 提到...

請問取不到Token是什麼原因呢?
{
"status": 400,
"message": "invalid code",
"access_token": null
}

isDavid 提到...

他說你的code是錯的唷

匿名 提到...

請問我自行發送API取得access token,發送請求的body為:grant_type=authorization_code&code={code}&client_id={client_id}&client_secret={client_secret}&redirect_uri=http://localhost:8080/但他一直回傳400的錯誤,並且提示redirect_uri is not matched,我換了好幾個redirect_uri,也都確認他們有設定在Callback清單中,但還是一樣錯誤,但使用Postman似乎不會有這個問題。

世明 提到...
作者已經移除這則留言。
世明 提到...

請問老師,LINE SDK 能不能將用戶貼上來的貼圖,儲存成圖檔或是得到一個讀取的路徑?

匿名 提到...

老師,line notify 發送消息時,它的服務名稱總是在最前面,比如您上邊寫的“linenotify測試”,請問如何關閉這個服務名稱?

Unknown 提到...

老師想請問您的C#取得TOKEN的原始碼如何可以不用透過C#開啟呢?

Related Posts Plugin for WordPress, Blogger...

熱門文章