本文主要是實作如何從基本的 Line Bot 串接 Line Notify,回傳出 URL 讓使用者去綁定達到可以去互動的效果!

前情提要:

繼之前 讓我們用Python開發一個LineBot 這篇文,我們已經有了一個基本的 Line Bot,但是 Line 有對 Line Bot 有給免費仔們做一些限制(Ex:每個月主動發送訊息(push_message)只能發送500則訊息,回傳訊息(reply_message)不受限制),那我們要如何突破他的上限呢?
那就是利用有官方認證的 Line Notify 去幫我們發送訊息,因為是官方認證的帳號所以可以無限發送訊息重點是還免費啊! Line_Bot_price

正題:

建立個人 Line Notify:
我們要先去 Line Notify 去申請一個我們的 Line Notify !
登入之後 => 右上點你的 Account => 管理登入服務 => 下面的登入服務 => 創建你的 Line Notify
裡面有一個要注意的是 Callback URL 這個,這邊要填入你的 webhook 這樣之後他才能跟我們的程式去做互動。
Ex: https://你的Heroku APP名字.herokuapp.com/callback/notify Callback_URL

讓 Line Bot 發送訊息讓使用者 跟 LineNotify 綁定 :

創造綁定的URL:
我們剛剛有了我們創好的 Line Notify,之後我們要叫使用者去綁定我們的 Line Notify 這樣之後才能對使用者發送訊息!
在剛剛你創好的 Line Notify 裡看到 Client ID 與 Client Secret
Client_ID&Secret 接下來就是用程式創造出我們的URL讓使用者去綁定! \

# 創造URL程式碼:
# 這邊的 os.environ 就是把資料從 Heroku 的設定檔那邊找到並拿下來用,不知道整麼用的可以看上一篇
# 這段程式碼主要是會回傳一串 URL 這時候就能跟我們上次的 LineBot 去做結合直接回傳回去給使用者去做綁定!

line_bot_api = LineBotApi(os.environ['CHANNEL_ACCESS_TOKEN'])
handler = WebhookHandler(os.environ['CHANNEL_SECRET'])

import os, urllib
client_id = os.environ['NOTIFY_CLIENT_ID']
client_secret = os.environ['NOTIFY_CLIENT_SECRET']
redirect_uri = f"https://{os.environ['YOUR_HEROKU_APP_NAME']}.herokuapp.com/callback/notify"
def create_auth_link(user_id, client_id=client_id, redirect_uri=redirect_uri):

    data = {
        'response_type': 'code',
        'client_id': client_id,
        'redirect_uri': redirect_uri,
        'scope': 'notify',
        'state': user_id
    }
    query_str = urllib.parse.urlencode(data)

    return f'https://notify-bot.line.me/oauth/authorize?{query_str}'

回傳給 Line Notify 並拿取使用者 Access Token

我們前面有了 URL 之後就能透過 URL 去做綁定並跟 Line 去做溝通要使用者的 Access Token,我們以後只要透過這個 Access Token 就能傳訊息給我們的使用者群組惹!

# 監聽綁定回傳跟綁定完成會發送你好的訊息程式碼
from flask import request
@app.route("/callback/notify", methods=['GET'])
def callback_notify():
    #assert request.headers['referer'] == 'https://notify-bot.line.me/'
    code = request.args.get('code')
    state = request.args.get('state')
    #print("Code:"+code)
    #print("state:"+state)
    #print(event.source.group_id)

    # Get Access-Token
    access_token = get_token(code, client_id, client_secret, redirect_uri)
    #print("AccessToken="+access_token)
    #print("Clinet_id"+client_id)
    google_sheet(client_id,access_token)
    send_message(access_token,text_message="你好")   #發訊息

    return '恭喜完成 LINE Notify 連動!請關閉此視窗。'

#拿取幫綁訂人的access_token
import json
def get_token(code, client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri):
    url = 'https://notify-bot.line.me/oauth/token'
    headers = { 'Content-Type': 'application/x-www-form-urlencoded' }
    data = {
        'grant_type': 'authorization_code',
        'code': code,
        'redirect_uri': redirect_uri,
        'client_id': client_id,
        'client_secret': client_secret
    }
    data = urllib.parse.urlencode(data).encode()
    req = urllib.request.Request(url, data=data, headers=headers)
    page = urllib.request.urlopen(req).read()
    res = json.loads(page.decode('utf-8'))
    #print(data)
    return res['access_token']

#利用notify發出訊息
def send_message(access_token, text_message):
    url = 'https://notify-api.line.me/api/notify'
    headers = {"Authorization": "Bearer "+ access_token}
    data = {'message': text_message}
    data = urllib.parse.urlencode(data).encode()
    req = urllib.request.Request(url, data=data, headers=headers)
    page = urllib.request.urlopen(req).read()

這樣基本就完成了 LineBot 讓使用者綁定 Line Notify 了,之後就用下面的函式(send_message)就能把你想要發送的訊息給你指定的群組或使用者了!

我知道我講的有點簡略,但可以搭配下面前輩的文章一起參考喔!
如果都不行或是還有疑問就留言吧!如果我會,我就盡量回答!!

Reference

Line Bot 費用方案
賴田捕手 iT幫幫忙
卡米狗 iT幫幫忙