最近在評估網站故障的自動通報機制。LINE 在台灣普及率及依賴度都很高,是很適合的即時通知管道,由於只需單向傳送訊息,LINE Notify 免費且無人數上限,實作又比 LINE Bot 單純。去吧,LINE Notify 就決定是你了。

David 老師有篇詳細的教學文,文章用 Postman 示範 API 溝通細節,不難用 WebClient 改寫,即可簡單搞定線上訂閱介面。

流程如下:

  • 針對不同使用者產生專屬URL,例如: httqs://notify-bot.line.me/oauth/authorize?response_type=code&client_id=….&redirect_uri=callback網址&scope=notify&state=使用者身分識別字串
  • 使用者會被導到 LINE App(手機/平板)或是 LINE 登入網頁,同意授權後會被導回指定的 Callback 網址(必須與 LINE 開發設定填寫網址一致)
  • Callback 網址程式收到 code 及 state,以 code 為參數呼叫 httqs://notify-bot.line.me/oauth/token 可取得 access_token,再依 state 判斷使用者身分,將使用者資料及對應 access_token 寫入資料庫,方便日後管理與應用。
  • 要發訊息給指定使用者,由資料庫查詢其 access_token,呼叫 httqs://notify-bot.line.me/api/notify 以發送通知。

順道也測試了 LINE Login,以下整理過程踩過的小坑及眉角:

  • Callback URL 若非 localhost,需使用 https。
  • Callback URL 設定介面說設定會立即生效,實務上要等一兩分鐘較保險,勿心急狂試,還沒生效測不通一直亂改。(對,就是我,性急直逼王藍田)
  • LINE 登入網頁出現 An error has occurred. Please wait a moment and try again. 可能是 client_id 錯誤或失效。
  • 瀏覽器導向 LINE 登入網頁時,在手機平板可以選擇導向「LINE 自動登入」程式或導向登入網頁(如下圖所示)。

    若是在 LINE App 開啟網頁被導到 LINE 登入程序,將自動進入同意畫面。
    感謝網友 Kuan 補充:手機平板瀏覽器導向 LINE自動登入 功能視瀏覽器而定,Chrome 可以,但像 Asus 內建瀏覽器或 iOS Safari 就出現過不支援的狀況。
  • 設定不正確時,登入網頁會出現「無法登入,請稍候再試。」這種模糊訊息,此時可從 URL 找到類似 errorMessage=AUTH_INVALID_REDIRECT_URL&errorCode=400 之類的詳細訊息。
  • 設定不正確時,若導向 LINE 程式會出現「錯誤 無法正確執行」訊息。
  • LINE Login 取得 Access Token 後可取得使用者姓名、照片;LINE Notify 取得 Access Token 後無從識別使用者身份,實務上要由 state 帶入使用者身分以便建立對應。
  • 當 LINE Channl 處於 DEVELOPING 狀態時(未轉為 PUBLISHED),LINE Login 只接受 CHANNEL_EDITOR 及 DEVELOPER 角色成員登入[參考],其餘人員使用登入網頁沒有任何錯誤訊息顯示,只會一直重覆登入網頁(由 URL 偷看訊息為 AUTHENTICATION_FAIL);LINE App 則出現「錯誤 無法正確執行」。
  • Channel 管理介面可將其他測試人員設定成 DEVELOPER。記得 Email 跟 LINE ID 要正確填寫,對方需收 Mail 點連結確認成員關係,完成後,該使用者即可在 DEVELOPING 階段通過 LINE Login 認證。


Comments

# by 寶之寶

黑大~~文章內的httqs 是否太累打錯??

# by Jeffrey

to 寶之寶, 這是本站傳統,為避免無效 URL 被系統或瀏覽器自動加上超連結,會故意將 http/https 改成 httq/httqs,例如:https://www.google.com.tw/search?q="httq"+site%3Ablog.darkthread.net

# by solongin

請問黑大 使用者會被導到 LINE App(手機/平板) 是不是需要特別的做法

# by Jeffrey

to solongin, 不用特別設定,LINE 在登入網頁下了功夫,行動裝置的瀏覽器會自動跳出提示。(請參考文章補充圖例)

# by Kuan

被導到LINE APP似乎不是每個行動瀏覽器都可以哦。 當初我在做LINE Login的時候,使用ASUS手機內建的瀏覽器是不會有的,要額外裝chrome才有。 ios手機的safari也沒有,也是要額外裝chrome。 但現在Login的API改成version 2,不知還是不是如此。 再補充當初踩到的,如果chrome不是預設瀏覽器,如使用chrome做登入的動作,它的call back會開啟預設瀏覽器.. 供參考~~

# by Jeffrey

to Kuan, 謝謝你的補充,已加入本文。

# by Tim

請問關於Line Notify 是否有方法是可以讓網頁自動要發送訊息的群組? 經由網頁發送訊息在,在line登入後會自動選擇要發送訊息的群組,跟那個群組連動

# by Jeffrey

to Tim, LINE Notify可發送1對1通知,使用者也可選擇將LINE Notify加為聊天群組的一員,讓聊天室成員都看到通知。 如要控制發送對象,程式需記錄不同通知對象(個人或聊天室)的Access Token,發送時跑迴圈指定不同對象的AccessToken送出訊息,發送程式放在網頁執行是沒問題的。

# by DC

你好~我想請問個問題,Line Login取得的Access Token,可以直接用於Line Notify嗎? 另外,我的Line Notify登入後都要選擇1對1訊息或是我所擁有的群組,可是像是IFTTT的連動,他進去只需要按連動即可,而且可以在IFTTT的設定內修改要1對1訊息還是要群組訊息 請問IFTTT是如何拿到群組列表以及Access Token,以及怎麼快速切換不同群組的Access Token? 謝謝您!

# by Jeffrey

to DC, LINE Login與LINE Notify的Access Token不能共用。IFTTT官方帳號有要求聊天室列表授權, http://www.darkthread.net/Photos/3994-f7b9-o.gif,但我沒找到由聊天室列表項目直接產生LINE Notify Access Token的做法,有可能官方帳號有相關API可用。

# by 金益工作室

請問按登入後會收到http://192.168.1.168:8100/authct/v1/keys/line?_=1517125487825, 但畫面總是秀出Unable to log in. Please try again later.

# by Jeffrey

to 金益工作室, 遇到登入網頁出現「無法登入,請稍候再試。」這種模糊訊息,可從 URL 找到類似 errorMessage=AUTH_INVALID_REDIRECT_URL&errorCode=400 之類的詳細訊息。

# by 金益工作室

Hi,回我 {"status":400,"message":"invalid code","access_token":null},可能問題在那

# by Jeffrey

to 金益工作室, 你是用 v1 還是 v2?David 老師有篇新版教學(v1今年3月將停用),也有現成SDK,你可以參考看看: http://studyhost.blogspot.tw/2017/12/clinebot17-line-login-v21.html

# by 金益工作室

Hi,Jeffrey 應該是v1吧? 它回傳的URL上都有"v1" /authct/v1/keys/

# by MatyH

請教黑大: 使用LineNotify,實務上是如何透過state取得使用者身份辨識的?

# by Jeffrey

to MatyH, state是你的系統針配給各使用者的唯一識別碼(取碼規則隨你高興,只要能用它代表特定使用者即可),授權成功後LINE Notify會回傳state跟access_token,用state查出使用者是誰,將該access_token存入資料庫跟該使用者關聯在一起,日後要發訊息再取出access_token使用。

# by Ricky

黑大,您好,可以幫我看一下我callback.php哪裡有誤嗎,謝謝您,我已經成功得到code和state(如以下網址) https://example.com/callback.php?code=qHPq6vQ19BbRk0Y3MUGn&state=abcde 我得到的錯誤代碼: Warning: file_get_contents(https://api.line.me/oauth2/v2.1/token): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /example.com.tw/callback.php on line 28 bool(false) 我的程式如下: $client_id = '{CHANNEL_ID}';//client_id $client_secret = '{CHANNEL_SECRET}'; //client_secret $redirect_uri= "https://example.com/callback.php";//callback url $code = $_GET['code']; $state = $_GET['state']; if(!$code){ die('串連失敗'); } $url = 'https://api.line.me/oauth2/v2.1/token';//Line token網址 $data = array( 'grant_type' => 'authorization_code', 'client_id' => $client_id, 'client_secret' => $client_secret, 'code' => $code, 'redirect_uri' => $redirect_uri, ); $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded", 'method' => 'POST', 'content' => json_encode($data), ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context);//第28行 var_dump($result);

# by Ricky

不好意思剛剛沒有將 https 改為 httqs ,所以重PO 黑大,您好,可以幫我看一下我callback.php哪裡有誤嗎,謝謝您,我已經成功得到code和state(如以下網址) httqs://example.com/callback.php?code=qHPq6vQ19BbRk0Y3MUGn&state=abcde 我得到的錯誤代碼: Warning: file_get_contents(httqs://api.line.me/oauth2/v2.1/token): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /example.com.tw/callback.php on line 28 bool(false) 我的程式如下: $client_id = '{CHANNEL_ID}';//client_id $client_secret = '{CHANNEL_SECRET}'; //client_secret $redirect_uri= "httqs://example.com/callback.php";//callback url $code = $_GET['code']; $state = $_GET['state']; if(!$code){ die('串連失敗'); } $url = 'httqs://api.line.me/oauth2/v2.1/token';//Line token網址 $data = array( 'grant_type' => 'authorization_code', 'client_id' => $client_id, 'client_secret' => $client_secret, 'code' => $code, 'redirect_uri' => $redirect_uri, ); $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded", 'method' => 'POST', 'content' => json_encode($data), ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context);//第28行 var_dump($result);

# by Jeffrey

to Ricky,我對LINE API的研究有限,推薦你到大內行者專頁找參考資源:https://www.facebook.com/DotNetWalker/,David 老師是這方面的專家。

# by Ricky

好,謝謝黑大~~

# by kevin_wu

黑大不好意思 想請問AccessToken是否會過期?

# by Jeffrey

to kevin_wu, 我對LINE API的研究有限,推薦你到 Dvaid 老師大內行者專頁找參考資源:https://www.facebook.com/DotNetWalker/ 。依我自己粗淺的使用經驗,倒是沒遇到過期的狀況。

Post a comment


96 - 33 =