# **2021/07/29 (LINE Notify)** ###### tags: `藍柏婷` ###### tags: `2021/07/29` ### [**== 上手 LINE Notify 不求人:一行代碼都不用寫的推播通知方法 ==**](https://blog.miniasp.com/post/2020/02/17/Go-Through-LINE-Notify-Without-Any-Code) >#### 角色定義 >想要嘗試用 LINE Notify 完成通知任務,必須理解以下角色: > >1. 服務提供者 (發送訊息方) > > 通常是一支程式或網站,他必須要有一個可以接受 OAuth 2.0 認證通過後的 callback 網址,你必須透過這個網址來獲取未來發送 LINE Notify 通知用的 Access Token (access_token)。 > >2. 授權通知方 (任意 LINE 用戶) > > 只有實際的 LINE 用戶才能授權 LINE Notify 發出通知,你必須擁有一個可以登入 LINE ID 的 E-mail 帳號才能進行授權。 > >3. 訊息接收者 (接受訊息方) > > LINE Notify 服務有兩種訊息接收者: > > 用戶 (USER):其實就是你自己!(授權的這個用戶) > 群組 (GROUP):該用戶曾經加入過的任何一個 LINE 群組。 > >--- by [**上手 LINE Notify 不求人:一行代碼都不用寫的推播通知方法**](https://blog.miniasp.com/post/2020/02/17/Go-Through-LINE-Notify-Without-Any-Code) ### 服務提供者 (發送訊息方) 要做的事 * #### **安裝 [ngrok](https://ngrok.com/) 工具** * #### **開啟ngrok** >![](https://i.imgur.com/H8hLCSW.png) * #### **輸入命令:** ``` ngrok http 8888 ``` >![](https://i.imgur.com/ZMRESM0.png) * #### **開啟瀏覽器並連至 http://127.0.0.1:4040 網址,進入 ngrok 的 Web 管理介面。** >這裡將會紀錄所有連接到 https://xxxxxxxx.ngrok.io 網址的 HTTP 封包! > >![](https://i.imgur.com/2A7INEy.png) >>-> 點下面的那個 > >![](https://i.imgur.com/Vurgx8o.png) >>-> 會出現這個不要理它,直接按叉叉 > >![](https://i.imgur.com/4q5vJku.png) >>-> 最終出現的網站 * #### **進入 [LINE Notify](https://notify-bot.line.me/zh_TW/) 網站並登入 LINE 帳號** >![](https://i.imgur.com/fyh1Upb.png) > >![](https://i.imgur.com/YaAhMJ1.png) * #### **進入管理登錄服務頁面,點擊登錄服務頁面,輸入登錄服務所需的每個欄位** >![](https://i.imgur.com/QevS3Av.png) >>-> 按**管理登入服務** > >![](https://i.imgur.com/qkzSXDg.png) >>-> 按**登入服務** > >>-> 把全部填一填(除了照片其他都必填) > > 欄位則請輸入你在執行 ngrok http 8888 命令時,最後一個Forwarding中的 https://xxxxxxxx.ngrok.io 網址 (請不要加上斜線結尾)! >>![](https://i.imgur.com/9Sl1aVl.png) > >>-> 按**登錄** > >![](https://i.imgur.com/OEliGWK.png) >>-> 按**前往服務一覽** > >>-> 打開剛剛製作的服務(小雞測試啦 ~ ~ ~) > >![](https://i.imgur.com/sim1JhP.png) >>-> 這裡是一些很重要的資訊 > >>-> 看見此網頁且電子郵件帳號是空白的時,要到剛剛登入的電子郵件去認證 >> >>![](https://i.imgur.com/B2OxCgJ.jpg) >>-> 點網站 >> >>![](https://i.imgur.com/yyQMaJl.jpg) >>-> 醬子就是代表認證成功 > >>-> 再重刷一次,電子郵件帳號就會出現 ### 授權通知方 (任意 LINE 用戶) 要做的事 * #### 點選此網址 https://notify-bot.line.me/oauth/authorize?response_type=code&scope=notify&response_mode=form_post&client_id=xxxxxxxx&redirect_uri=http://xxxxxxxx.ngrok.io&state=f094a459-1d16-42d6-a709-c2b61ec53d60 >ex. https://notify-bot.line.me/oauth/authorize?response_type=code&scope=notify&response_mode=form_post&client_id=gN4CyjagJu6g97r8yiiwoO&redirect_uri=https://77764d92e300.ngrok.io&state=f094a459-1d16-42d6-a709-c2b61ec53d60 >>client_id=gN4CyjagJu6g97r8yiiwoO >>>![](https://i.imgur.com/VQG0EJ8.png) >> >>redirect_uri=https://77764d92e300.ngrok.io >>>![](https://i.imgur.com/ia8hU9K.png) >開發者只要能產生正確的 URL 給使用者用即可,但這個網址又臭又長,每個查詢字串的用途說明如下: > >* `scope`: 固定寫 `notify` 就對了。 > >* `response_type`: 固定寫 `code` 就對了。 > >* `response_mode`: 固定寫 `form_post` 就對了。 > >* `redirect_uri`: 請設定你 ngrok 產生的暫時網址,當訂閱完成後,使用者會被導向到這個網址。 >>>請特別要注意的一件事,這裡設定的 URL 必須跟你之前註冊時所設定的 **Callback URL** 完全一樣,連網址最後是否有斜線結尾,都要完全一樣才行。 > >* `client_id`: 請設定登錄服務的 `Client ID` > >* `state`: 設定一組亂碼,其實輸入什麼都可以,此參數主要用來防止 CSRF 攻擊。 > >--- by [**上手 LINE Notify 不求人:一行代碼都不用寫的推播通知方法**](https://blog.miniasp.com/post/2020/02/17/Go-Through-LINE-Notify-Without-Any-Code) * #### 選擇您要接收通知的聊天室 (聊天室就是LINE 群組的意思) 如果使用者想要將通知發給**自己**,可以選擇【**透過1對1聊天接收LINE Notify的通知**】。 如果使用者想要將通知發給**群組**,可以**選擇一個你以前曾經加入過的聊天室**,**將 LINE Notify 這個帳號加入到該聊天室**才能收到通知! 選取完畢後,按下 **同意並連動** 按鈕即可完成訂閱,此時使用者會立即收到 **與「服務名稱」連動完成** 的通知訊息! >![](https://i.imgur.com/9bIh7lB.jpg) > >此時瀏覽器會主動發出 **HTTP POST** 要求到 **redirect_uri 指定的網址**,並且帶入 `code` 與 `state` 表單欄位! ### 發送推播訊息 1. 取得授權碼 ( code ) 當 **授權通知方** 按下 **同意並連動** 按鈕之後,使用者的瀏覽器會直接對 redirect_uri 所設定的網址發出 HTTP POST 要求。由於我們透過 ngrok 產生的暫時網址會幫我們接收 HTTP POST 要求,所以你可以透過 http://127.0.0.1:4040 得知 HTTP POST 傳入的內容,其中就有 `code` 欄位可用,請將其值複製下來! ![](https://i.imgur.com/nAl8rPB.png) 2. 取得存取權杖 ( access_token ) (Access Token) 安裝 curl 工具 (使用 Chocolatey 套件管理器) ``` choco install curl -y ``` :::info 我的電腦可能原本就有curl工具,所以會一直顯示錯誤。 ::: 你必須發送一個 HTTP POST 到 https://notify-bot.line.me/oauth/token 才能取得存取權杖,命令如下: ``` curl -d "grant_type=authorization_code&redirect_uri=https://xxxxxxxx.ngrok.io&client_id=xxxxxxxx&client_secret=xxxxxxxx&code=xxxxxxxx" https://notify-bot.line.me/oauth/token ``` >ex. curl -d "grant_type=authorization_code&redirect_uri=https://e41e2e2c2b4e.ngrok.io&client_id=8ZRrXMfsVM5IDnPMJ7zzyx&client_secret=iSpcBqbzz2gDpAytOp7NtSyykkPbQJSaOP5xZ3beYrS&code=kg4nF0O8YNe6nmAAFBM1U9" https://notify-bot.line.me/oauth/token >參數說明如下: >`grant_type`: 固定寫 `authorization_code` 就對了。 >`redirect_uri`: 請設定你 ngrok 產生的暫時網址。 >`client_id`: 登錄服務的 `Client ID` 資訊 >`client_secret`: 登錄服務的 `Client Secret` 資訊 >`code`: 上個步驟取得的授權碼 ( `code` ) 如果有成功發出 Access Token 你將會得到以下 JSON 內容: { "status": 200, "message": "access_token is issued", "access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } 任何人拿到 存取權杖 後,就可以透過該權杖發送推播通知給訂閱的目標 (USER 或 GROUP) 如果失敗會得到以下 JSON 內容: { "status": 400, "message": "invalid code", "access_token": null } ### 發送 LINE Notify 通知訊息 :::info 任何通知訊息都需要有 Access Token 才能發出! ::: 你可以透過以下 curl 命令發出 LINE Notify 通知訊息: ``` curl -H "Authorization: Bearer xxxxxxxx" -d "message=Hello World" https://notify-api.line.me/api/notify ``` 這裡的 `-H` 參數代表著 HTTP POST 的一個自訂標頭 (Custom Header),而 `Authorization` 則是用來通過身分驗證用的標頭,而 `Bearer` 則代表我們將傳入一個 Bearer Token,後面的 `xxxxxxxx` 就是我們在上一步取得的 Access Token 存取權杖。 如果成功發出訊息,你會得到以下 JSON 回應,並且在 LINE App 上也會即時收到通知訊息: { "status": 200, "message": "ok" } 如果 Access Token 已經被撤銷,則會得到以下回應: { "status": 401, "message": "Invalid access token" } >ex. >```python >C:\Users\藍柏婷>curl -d "grant_type=authorization_code&redirect_uri=https://e41e2e2c2b4e.ngrok.io&client_id=8ZRrXMfsVM5IDnPMJ7zzyx&client_secret=iSpcBqbzz2gDpAytOp7NtSyykkPbQJSaOP5xZ3beYrS&code=kg4nF0O8YNe6nmAAFBM1U9" https://notify-bot.line.me/oauth/token >{"status":200,"message":"access_token is issued","access_token":"FmQvoVHKbiiRqJO5UyObat0NonuasUzTa5Zrb1Fx3ff"} >C:\Users\藍柏婷>curl -H "Authorization: Bearer FmQvoVHKbiiRqJO5UyObat0NonuasUzTa5Zrb1Fx3ff" -d "message=Hello World" https://notify-api.line.me/api/notify >{"status":200,"message":"ok"} >C:\Users\藍柏婷>curl -H "Authorization: Bearer FmQvoVHKbiiRqJO5UyObat0NonuasUzTa5Zrb1Fx3ff" https://notify-api.line.me/api/status >{"status":200,"message":"ok","targetType":"USER","target":"藍柏"} >C:\Users\藍柏婷>curl -D - -H "Authorization: Bearer FmQvoVHKbiiRqJO5UyObat0NonuasUzTa5Zrb1Fx3ff" https://notify-api.line.me/api/status >HTTP/1.1 200 >Server: nginx >Date: Thu, 29 Jul 2021 08:45:03 GMT >Content-Type: application/json;charset=UTF-8 >Transfer-Encoding: chunked >Connection: keep-alive >Keep-Alive: timeout=3 >X-RateLimit-Limit: 1000 >X-RateLimit-ImageLimit: 50 >X-RateLimit-Remaining: 997 >X-RateLimit-ImageRemaining: 50 >X-RateLimit-Reset: 1627551742 > >{"status":200,"message":"ok","targetType":"USER","target":"藍柏"} >C:\Users\藍柏婷>curl -H "Authorization: Bearer FmQvoVHKbiiRqJO5UyObat0NonuasUzTa5Zrb1Fx3ff" -d "message=嗨嗨!!!" https://notify-api.line.me/api/notify >{"status":200,"message":"ok"} >C:\Users\藍柏婷>curl -H "Authorization: Bearer FmQvoVHKbiiRqJO5UyObat0NonuasUzTa5Zrb1Fx3ff" -d "message=Test" https://notify-api.line.me/api/notify >{"status":200,"message":"ok"} >``` >![](https://i.imgur.com/cNAUKmf.jpg) ### 取得目前 Access Token 狀態 只要對 https://notify-api.line.me/api/status 發出 GET 要求即可獲得 Access Token 狀態: ``` curl -H "Authorization: Bearer xxxxxxxx" https://notify-api.line.me/api/status ``` 以下是 Access Token 有效的回應內容: { "status": 200, "message": "ok", "targetType": "USER", "target": "Will" } 備註:上述 targetType 可能的值有 USER (用戶) 或 GROUP (聊天室)。 如果 Access Token 已經被撤銷,則會得到以下回應: { "status": 401, "message": "Invalid access token" } ### 如果想得知目前 Access Token 的 API Rate Limit 相關資訊,可以改用以下命令查詢: ``` curl -D - -H "Authorization: Bearer xxxxxxxx" https://notify-api.line.me/api/status ``` 這裡的 `-D -` 代表將 Response Headers 全部輸出到 STDOUT 螢幕上,這時你會得到以下資訊: ``` HTTP/1.1 200 Server: nginx Date: Mon, 17 Feb 2020 15:33:26 GMT Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Keep-Alive: timeout=3 X-RateLimit-Limit: 1000 X-RateLimit-ImageLimit: 50 X-RateLimit-Remaining: 998 X-RateLimit-ImageRemaining: 50 X-RateLimit-Reset: 1581953606 ``` 其中的 `X-RateLimit-Remaining` 就是你這個 Token 在這一個小時內還能用幾次。 還有 `X-RateLimit-Reset` 代表著下次 Reset 用量限制的時間點,這是 UTC epoch seconds 單位。 >若要在 Linux 下查詢這個數字所代表的時間點,可以輸入以下命令查詢: >``` >date -d @1581953606 >``` >若要在 PowerShell 下查詢這個數字所代表的時間點,可以輸入以下命令查詢: >``` >(([System.DateTimeOffset]::FromUnixTimeSeconds(1581953606)).DateTime.ToLocalTime()).ToString("s") >``` ### 撤銷目前 Access Token 只要對 https://notify-api.line.me/api/revoke 發出 POST 要求即可撤銷 Access Token: ``` curl -X POST -H "Authorization: Bearer xxxxxxxx" https://notify-api.line.me/api/revoke ``` 以下是成功撤銷 Access Token 的回應內容: { "status": 200, "message": "ok" } 如果 Access Token 本來就無效,則會得到以下回應: { "status": 401, "message": "Invalid access token" }