iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 24
0
影片教學

用Django架構建置專屬的LINEBOT吧系列 第 24

[Day 24]用Django架構建置專屬的LINEBOT吧 - LINE Notify

LINE Notify是什麼

上一篇說到透過LINE BOT主動通知天氣資訊的應用,
而LINE官方也提供了相當好用的提醒工具,即LINE Notify,
所以這篇先回過頭來講一下有關於如何使用Notify來主動推播訊息的方法,
可能有些人也有曾經加過Notify為好友,但是並不知道那是做什麼用的,
他在LINE的視窗上是長這樣的圖示:

https://ithelp.ithome.com.tw/upload/images/20201007/20121176INgcUOeWGV.jpg

他的用途呢,簡而言之就是,
對開發者來說,可以將主動推播的訊息,
透過Notify API的方式傳送到用戶的Notify帳號中,
而且免費。(<=本篇重點)

所以呢,真的是非常值得學習的一個部分,
但是Notify可以傳送的訊息格式比較有限,
主要是文字、圖片跟貼圖,
說實在也是滿夠用的了,

LINE Notify API實作-登入服務

好,一步一步來,
首先進入剛剛提到的LINE Notify官網
右上角登入自己的LINE個人帳號,登入後點選管理登入服務的選項,

https://ithelp.ithome.com.tw/upload/images/20201007/20121176ZLBTD6IhQD.jpg

接著選擇登入服務,

https://ithelp.ithome.com.tw/upload/images/20201007/20121176ZkbYjZvCN3.jpg

在登入服務中,依照欄位進行輸入,
網址的domain換成自己的ngrok domain,Callback URL填寫/notify,

https://ithelp.ithome.com.tw/upload/images/20201007/201211765Xh6U49SWW.jpg

按下登入並完成email認證之後,就可以開始連動到用戶的LINE帳號了,
首先一樣回到管理登入服務的頁面,就會看到剛剛建立的Notify服務帳號,
點進去之後,可以看到其中有產生新的Client ID跟Client Secret,
這兩個資料要保留,接下來會用到,

https://ithelp.ithome.com.tw/upload/images/20201007/20121176xdkIzjC0I0.jpg

接著我們可以將這組網址作為連動用的URL,
只需要將其中的幾個部分進行修改,包括client_id及redirect_url,

https://notify-bot.line.me/oauth/authorize?response_type=code&client_id='放入自己的client_id'&redirect_uri='放入自己的CallBack_URL'&scope=notify&state=NO_STATE

修改完畢後丟到LINE的對話框或瀏覽器進行測試,
順利的話應該出現下列畫面:

https://ithelp.ithome.com.tw/upload/images/20201008/20121176nFpW6UtQVf.jpg

選擇第一個"透過1對1聊天接收LINE Notify的通知",
並且按下"同意並連動",LINE Notify就會傳送一個"連動成功"的訊息給你,

https://ithelp.ithome.com.tw/upload/images/20201008/20121176cnq9m6FZwJ.jpg

實際操作影片:

LINE Notify API實作-獲取Notify Access Token並傳送訊息

既然連動成功了,那我們要如何才能傳訊息給連動成功的user呢?
就在連動成功之後,網頁上面的網址會產生一組user專屬的code,長這樣子:

https://ithelp.ithome.com.tw/upload/images/20201008/20121176g4OLUNiueJ.jpg

如果把這組code丟到Notify的官方API當中,
就可以獲得user的Notify Access Token,
有了Notify Access Token之後就可以持續傳送訊息到連動Notify的user用戶端囉,
下面是如何以code取得Notify Access Token的方法:

https://ithelp.ithome.com.tw/upload/images/20201008/20121176FMvyN3QKCx.jpg

由於我們將會需要一個地方紀錄用戶的Notify Access Token,
並且要讓他能夠對應到指定的用戶,
因此我們需要使用到之前資料庫建立篇說到的

接著在views.py中建立一個新的監聽,

#views.py

@csrf_exempt
def notify(request):
    pattern = 'code=.*&'

    raw_uri = request.get_raw_uri()

    codes = re.findall(pattern,raw_uri)
    for code in codes:
        code = code[5:-1]
        print(code)

    #抓取user的notify token
    user_notify_token_get_url = 'https://notify-bot.line.me/oauth/token'
    params = {
        'grant_type':'authorization_code',
        'code':code,
        'redirect_uri':'***',#這邊改成自己的https://ngrok domain/notify
        'client_id':'***',#這邊改成自己的Notify client_id
        'client_secret':'***' #這邊改成自己的Notify client_secret

    }
    get_token = requests.post(user_notify_token_get_url,params=params)
    print(get_token.json())
    token = get_token.json()['access_token']
    print(token)

    #抓取user的info
    user_info_url = 'https://notify-api.line.me/api/status'
    headers = {'Authorization':'Bearer '+token}
    get_user_info = requests.get(user_info_url,headers=headers)
    print(get_user_info.json())
    notify_user_info = get_user_info.json()
    if notify_user_info['targetType']=='USER':
        User_Info.objects.filter(name=notify_user_info['target']).update(notify=token)
    elif notify_user_info['targetType']=='GROUP':
        pass
    return HttpResponse()

在urls.py檔案也需要將這個監聽放進去設定裡面:

from django.contrib import admin
from django.urls import path
from django.conf.urls.static import static
from django.conf.urls import url
from django.conf import settings

from IT_help import views

urlpatterns = [
    path('admin/', admin.site.urls),
    url('^callback',views.callback),
    url('^notify',views.notify),
]

這個目的是設定讓使用者進入notify連動頁面之後,
能夠觸發上面的notify函數,讓使用者的notify token被記錄下來,
我們在models.py需要建立相關的資料表,
這邊沿用Day 4的建立資料庫時所建立的User_Info資料表,加上一個notify欄位:

#models.py
from django.db import models

# Create your models here.
class User_Info(models.Model):
    uid = models.CharField(max_length=50,null=False,default='')         #user_id
    name = models.CharField(max_length=255,blank=True,null=False)       #LINE名字
    pic_url = models.CharField(max_length=255,null=False)               #大頭貼網址
    mtext = models.CharField(max_length=255,blank=True,null=False)      #文字訊息紀錄
    notify = models.CharField(max_length=255,blank=True,null=False)     #Notify Access Token
    mdt = models.DateTimeField(auto_now=True)                           #物件儲存的日期時間

    def __str__(self):
        return self.uid

好了,這樣一來,只要user透過連動網頁進行連動之後,
並且曾經在LINE BOT帳號互動而建立User_Info資料,
就會自動依照LINE的用戶暱稱建立Notify Access Token了!

https://ithelp.ithome.com.tw/upload/images/20201009/20121176VkvGfqAlV2.jpg

有了這個user的Notify Access Token,我們就可以用以下方式來傳送推播訊息:

#notify_push_message.py

import requests

token = 'user的Notify Access Token'
msg = '請常唸  霹靂卡霹靂拉拉波波力那貝貝魯多'

headers = {
    "Authorization": "Bearer " + token, 
    "Content-Type" : "application/x-www-form-urlencoded"
}

payload = {'message': msg}
r = requests.post("https://notify-api.line.me/api/notify", headers = headers, params = payload)

https://ithelp.ithome.com.tw/upload/images/20201009/201211767LfxiCHlm5.jpg

上面這段是只要有Notify Token就可以隨時傳送,
不論是從哪一台電腦,只要有網路都可以主動推送Notify通知,
這樣一來就完成了主動傳送提醒通知的操作囉~

實際操作影片:


上一篇
[Day 23]用Django架構建置專屬的LINEBOT吧 - 網路爬蟲(I)
下一篇
[Day 25]用Django架構建置專屬的LINEBOT吧 - 網路爬蟲(II)LINE Notify+Heroku Scheduler
系列文
用Django架構建置專屬的LINEBOT吧30

尚未有邦友留言

立即登入留言