# **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"
}