本篇是前面三篇文章的綜合懶人包跟總結一下目前的架構與程式!!

前情提要:

本篇是這三篇文章的綜合懶人包!!如果中間有不太懂可以回去翻翻看這三篇~
讓我們用 Python 開發一個 Line Bot
Line Bot 之利用 Line Notify 突破限制吧!
Line Notify 建立資料庫並提供不休息的服務

我們要最後做出來的架構會是下圖這樣,會是 Line_Bot + Line_Notify + Heroku + GoogleSheet Program_Architecture_Diagram 我們 Line Bot or Line Notify 等等…,這邊就可以參考前面的文章創出一個基本的 Line Bot + Notify 然後設定一下 Heroku 這邊就不在贅述。
我們這邊的重點先放在理解整個 Line Bot 程式碼!!

我們先從 route 這邊看

@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')

    # Get Access-Token
    client_id = os.environ['NOTIFY_CLIENT_ID']
    access_token = get_token(code, client_id, client_secret, redirect_uri)
    google_sheet(access_token)
    send_message(access_token,text_message="你好")   #發訊息

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

Q. 有些人會說這邊的 “/callback/notify” 用在哪裡?
A. 會在 Notify 裡的設定看到,Web 後端接收到這個 URL 的 “GET” 之後去觸發 callback

Q. 我該如何新增功能?
A. 如果只是要新增利用文字去互動的功能的話只需要在下面增加就可以了

@handler.add(MessageEvent, message=TextMessage) # 監聽當有新訊息時
def handle_message(event):
    global Group_id , User_id
    if event.message.text == "個人訂閱" :
        url = create_auth_link(event)
        # 回傳 url 給傳訊息的那 個人 or 群組
        line_bot_api.reply_message(event.reply_token,TextSendMessage(text=url) )
        # 這邊是利用 event 內的 user_id 去跟 Line 拿到使用者的當前 Line 使用的名子 Ex: Zi-Yu(林子育)
        User_id = line_bot_api.get_profile(event.source.user_id).display_name
        Group_id = ''
    elif event.message.text == "群組訂閱" :
        url = create_auth_link(event)
        line_bot_api.reply_message(event.reply_token,TextSendMessage(text=url) )
        # 因為 event 內只會回傳個人訊息所以無法找到 Group 的名稱,所以只能改拿 Group 的 id
        Group_id = (event.source.group_id)   # Group_id get!
        User_id = ''

Q. 設定完後,我該如何在別的程式利用 Line Notify 傳訊息?
A. Python 的話套用這個函式就可以,傳送訊息。如果想要 Access Token 不寫死,就是收到人名再去 Google Sheet 搜尋相對應的 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()
#==============================================================================================#
main:
send_message(access_token, text_message)

A. Clock + Line Bot 同時使用導致我的 Heroku 時數爆了整麼辦?
Q. 我也是後來才發現有這問題因為我是 30 天都是 24hr 讓他去開著,可是我的免費時數只有 1000hr 實在是不夠, 後來我就想到解決方法把 Clock.py 拿到一台永遠不關機的電腦上跑做到一樣的功能。
整麼解決呢?很簡單就是利用以下程式碼+工作排程器
我們先在本地打一份 Clock 的 Python程式碼:

from apscheduler.schedulers.blocking import BlockingScheduler
from linebot import LineBotApi
from linebot.models import TextSendMessage
import urllib.request

sched = BlockingScheduler()

#利用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()


#定時去搓url讓服務不中斷
@sched.scheduled_job('cron', day_of_week='mon-sun', minute='*/25')
def scheduled_job():
    url = "https://<Your Heroku App Name>.herokuapp.com/"
    conn = urllib.request.urlopen(url)
    for key, value in conn.getheaders():
        print(key, value)
    print("戳一下")

接下來在排程器設定每天執行 Scheduler 然後在動作的地方看要是直接執行python檔或是直接把命令寫成bat檔執行都可以摟!

最後附上已經用好的模版GitHub:
https://github.com/OKHand-Zy/Line-Bot_Module
下載下來後把Heroku資料夾內的檔案移出外面一層然後修改成自己的內容上傳Heroku就可以摟!
裡面有些檔案裡面要換成自己的 App 名 或是 金鑰 要注意一下唷!
還有 Heroku 的 環境值 也記得要設定!\

大家一起來打造出屬於自己的 Line Bot吧!!
有問題或有不懂的可以私訊或留言給我,我有空就會看唷!!