最近在評估網站故障的自動通報機制。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/ 。依我自己粗淺的使用經驗,倒是沒遇到過期的狀況。

# by love04060821

請教一下,如果我想把一個群組收到的訊息轉傳到另一個對話群組去 這個該怎麼撰寫呢?? 謝謝

# by Jeffrey

to love04060821,我對 LINE 開發的研究有限,推薦可到 David 老師的大內行者專頁找參考資源:https://www.facebook.com/DotNetWalker/ 。

# by Isam

黑大 求解惑 我需做LINE LOGIN 而我網站有SSL 並且是買了WWW的 程式方面 redirect_uri 設定 是 httqs://www.xxx.com.tw/Home/callback,LINE Developers設定 同樣也是httqs://www.xxx.com.tw/Home/callback, 當我呼叫的時候她出現ERROR 400,但我把LINE Developers設定成httqs://xxx.com.tw/Home/callback,他可以導去LINE LOGIN PAGE 當我驗證成功之後,他導頁回我網站的時候 他卻導向httqs://xxx.com.tw/Home/callback 這邊,而我的網站是有WWW 不知哪邊要再設定,求解

# by Jeffrey

to Isam, 我很久沒接觸這塊,與目前的API版本有點脫節。推薦 David 老師的大內行者專頁:https://www.facebook.com/DotNetWalker/ 。

# by ccaaa

黑大您好 請問line notify的access token有時效性嗎?,每次連動群組過一段時間就無法發通知,而且每次停止通知的時間點都不同 會出現 {"status":400,"message":"invalid code","access_token":null}

# by ccaaa

抱歉打錯 是出現{"status":401,"message":"Missing authorization header"}

# by Jeffrey

to ccaaa,我自己沒遇過。Missing authorization header 訊息看起來 Request 沒有附上 Authorization: Bearer ACCESS_TOKEN 造成的,為什麼一陣子後才會出現狀況挺詭異。

# by OK

黑大,您好: 請問要如何才能將state跟access_token 都記錄至資料庫呢? 非常謝謝您!

# by Jeffrey

to OK,不太確定你遇到的難點。state 由我們指定,預先為不同使用者取一個唯一代碼(GUID 是不錯選擇),使用者完成身分驗證後 LINE 會呼叫我們寫的 callback_url?code=...&state=...,此時可同時拿到 state 跟 access_token,此時再寫入資料庫即可。

# by OK

黑大,非常謝謝您回覆! 是的,需求為先行自訂state並用來對應TOKEN! 假設:簡述需求為先自訂100個不同state的網址並使其能連動同一LINE notify 。100位用戶連動成功後,資料庫能紀錄100個TOKEN和對應的100個自訂的STATE。 在下實為門外漢,以上要如何能記錄至資料庫的方式,也請黑大不吝幫忙指教,非常感謝您!(若語意不清,請您見諒)

# by Jeffrey

to OK,我有設計過類似機制,做法提供你參考。 設計一 Table - AccessTokenList,有三個欄位 UserID(GUID)、UserName、AccessToken 註冊UI:使用者填寫使用者名稱,按下註冊鈕,系統當場產生一個 GUID,並將使用者名稱(UserName)跟 GUID(UserId)寫入資料庫,接著導向 ℎttp://notify-bot.line.me/oauth/authorize?response_type=code&client_id=….&redirect_uri=callback網址&scope=notify&state=GUID Callback:得到 code 及 state,UPDATE AccessTokenList SET AccessToken = code WHERE UserId = state 要發訊息給特定使用者時,由 UserName 查 AccessTokenList 取得 AccessToken,呼叫 API 發送通知。 希望以上說明夠清楚。

# by OK

黑大,感謝您!非常清楚,在下希望能逐步完成您所述的機制。 目前練習連動設定,不過不知如何將TOKEN收集至資料庫。 以下簡述: 使用者能對應多組不同TOKEN嗎? 以在下的粗淺需求說明:原100個自訂state網址 1.一用戶可能同時有多組state(USERID)及多組對應的TOKEN, 2.已使用過的自訂state(USERID)網址,一連動成功後該網址則失效無法連動。 3.您所述:要發訊息給特定使用者時,由 UserName 查 AccessTokenList 取得 AccessToken,呼叫 API 發送通知。在下就是為此需求,就是一直苦無無法建置,也再請黑大幫忙! 非常感謝您!

# by Jeffrey

to OK,有一點不太明白,每個 LineNotify 帳號對每個登入成功並同意授權的 LINE 帳號會有一個專屬 AccessToken,state 是讓我們的系統識別使用者身分(接到Callback時知道這是哪位的 AccessToken)。不太懂預先產生 100 組自訂 state 網址跟一個 LINE 帳號有多個 Access Token 的情境。

# by OK

黑大,打擾了,抱歉表達不清楚! 假設狀況:每一組100位,會有多組B.C.D............... 使用一組為A組並已先預訂state:A001~A100的自訂網址 假設用戶M藉由A001的網址連動完成! 則資料庫會有用戶M :A001 USERID 暱稱 TOKEN 這樣在下會知道M透過第A組連動 若假設用戶N藉由B001的網址連動完成! 則資料庫會有用戶N :B001 USERID 暱稱 TOKEN 這樣在下會知道N透過第B組連動 若假設用戶M藉由B002的網址連動完成! 則資料庫會有用戶M :B002 USERID 暱稱 TOKEN 這樣在下會知道M透過第B組連動 (M同時是A、B組) 不好意思,表達欠妥,請見諒!

# by Jeffrey

to OK,對分組、每組100位、連動等定義還是沒能完全理解(可能是因無法對映到生活可見的實例上),但聽起來用不用 LINE Notify 非關鍵,重點是識別用戶 X 在哪些組別裡註冊了哪些 UserID,這樣的話,設計一張大 Table,定義欄位 用戶代碼(N,M)、組別(A,B..)、序號(A001、B001...)、UserId或暱稱、AccessToken或其他發通知用的關鍵資料,若使用關聯式資料庫,要查用戶 M 在哪些組有連動,查詢「SELECT * FROM 大Table WHERE 用戶代碼 = 'M'」 即可;查 A 組要連動會通知到誰則是 「SELECT * FROM 大Table WHERE v組別 = 'A'」。

# by OK

黑大,打擾了,抱歉表達不清楚! 您所述之重點,亦是在下查詢管理的重要點! 使用LINE Notify取得TOKEN來通知個別訊息是必要的功能! (或是能有其他運用LINE通知方式也請您不吝建議) 如您所述: 預先設定的 組別(A,B..)、序號(A001、B001...) 需先有一連結或方式,先行取得上述後同時能取得TOKEN到指定的設計的大 Table。 日後可運用該Table,來查找通知對應用戶。 這是目前在下不知道要如何建置相關此連結或方式進而建構 Table紀錄之資料庫裡! 非常謝謝您!

# by Jeffrey

to OK,你有程式開發或資料庫使用經驗嗎?這塊涉及的細節頗多,若沒有相關開發經驗,應無法靠簡短說明就建置出你想像的系統。如果你打算自己動手,我建議先寫個能讀寫資料庫的簡單網站(ToDo List之類的),體會其運作方式,許多疑問自然會有答案,或許要花點時間,但樂趣無窮。若此需求有急迫性,可能要考慮外包給有經驗的開發者幫你。

# by OK

黑大,打擾了,非常謝謝回答! 也謝謝您的指教,在下努力看看! 另外外包有推薦的開發者嗎? 謝謝您!

# by 打結了

黑大,您好! 請教line notify發送訊息部分,若以postman測試皆可順利執行,是否能將此步驟以HTML或傳統ASP(連結資料庫撈token連續發送)方式呈現,是否能請黑大指點呢?

# by Jeffrey

to 打結了,我想 HTML JavaScript 不可行,一則受限 Cross-Site 不能呼叫跨網域 API,二則 Token 會外洩到客戶端。ASP 要呼叫 WebAPI 需依賴 MSXML https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms766431(v=vs.85) 但要串接現代 WebAPI 處理 JSON 蠻痛苦的。我的話會是「連結資料庫撈 Token 連續發送」這段用 ASP.NET 或 ASP.NET Core 寫,再由其他程式(包含傳統 ASP)用一個簡單 URL 觸發(可以鎖來源 IP 避免被盜用)。

# by 打結了

感謝黑大撥冗回覆! 謝謝🙏

Post a comment