iT邦幫忙

0

《賴田捕手:追加篇》第 31 天:初始化 LINE BOT on Heroku

第 31 天:初始化 LINE BOT on Heroku

事實說來可笑:別試著和任何人討論任何關於 LINE BOT 的任何程式碼。原因是,如果你這麼做,那表示你開始想念每一個人了。

~節錄自《賴田捕手》第二十六章

延伸自系列文 《從LINE BOT到資料視覺化:賴田捕手》

《賴田捕手:追加篇》:

最近剛換了一份新工作。內容瑣碎,壓力繁重。每天我都睡眼惺忪地到公司報到。同事見狀,都紛紛上前關切:「會不會交給你太多東西了?」實在是一個相當溫暖體貼的工作環境。我都摸摸鼻子回說:「不會,不會,我慢慢習慣就好。」其實是不好意思告訴他們,層層疊疊的睡眼圈是家裡的草泥馬造成的。我在家裡豢養了一群草泥馬,每天回家最要緊的事就是服侍牠們吃飽喝足,並且為牠們把屎把尿。等到夜深人靜,草泥馬一隻一隻地進入夢鄉的時候,我會坐在電腦桌前,任螢幕的螢光在我臉上閃爍不定,而我的指節敲打著鍵盤,寫下一行一行建構 LINE BOT 的程式碼,這時我才感到身上的疲憊漸漸舒緩,心靈平靜充實。沒錯,我想說的是,當大家對生活感到樸實無華且枯燥的時候,不妨來試著寫個 LINE BOT,或許可以為自己的日常增添不少樂趣喔。
《賴田捕手:追加篇》預計會有五天份的文章內容 (不過嘛,預計分五個星期更新),首先會快速回顧如何在 Heroku 上佈署 LINE BOT,並建立資料庫供 LINE BOT 進行資料存取。接著會追加介紹一些 LINE 官方提供的功能,如 QuickReply 以及 LINE Notify 等等,過程中,我們將慢慢打造出一個能夠提供影像處理服務的 LINE BOT。目前設計的段落大綱如下:

第 31 天:初始化 LINE BOT on Heroku
第 32 天:QuickReply 以及 QuickReplyButton 介紹
第 33 天:妥善運用 Heroku APP 暫存空間
第 34 天:妥善運用 LINE Notify 免費推播
第 35 天:製造 Deploy to Heroku 按鈕

沒有問題的話,就讓我們趕快進入今天的內容吧。

佈署到 Heroku

這邊假定讀者已經有 LINE 帳號、Heroku 帳號、Git 帳號,在個人使用的電腦上,也已經準備好 Heroku CLI。沒有也不打緊,第 09 天有非常詳盡?的介紹,帶領各位一步一步完成前置作業。而今天的內容,則主要放在如何將 LINE BOT 佈署到 Heroku 上,並添加 Heroku Postgres 資料庫,為往後的我們要提供的服務做準備。
為什麼會選擇將 LINE BOT 佈署到 Heroku 上面呢?其實如今許多公司都注意到這種網路服務的方便性以及商機,因此出現了不少相似的服務,如 AWS Lambda、Google、Azure、Netlify 等等,這些公司所提供的服務,被歸類為函式即服務 (Function as a Service,FaaS),各個來頭響亮,時髦前衛,功能強大。而 Heroku 所提供的,則屬於平台即服務 (Platform as a Service,PaaS),其中的詳細差異,各位可以在這裡了解。懶得點擊連結過去研究也沒關係,一句話言簡意賅地說,FaaS 比 PaaS 能夠較簡單的做到更高的資源利用率。而這個差異或許也造就了 Heroku 最為人詬病的缺點:免費 dyno 的 30 分鐘閒置入睡設定。
那麼為什麼今天我們還要學著如何將 LINE BOT 放到 Heroku 上面呢?我認為 Heroku 在介面設計上做的很好,簡單優雅,一目了然。在 Heroku 上面佈署 LINE BOT,你將可以慢慢體會到 LINE 這個平台是如何將我們的 LINE BOT 與使用者連繫再一起的,整個資料的流通是如何,整個事件的觸發是如何,等等的。反則,若是在 AWS Lambda 上面佈署 LINE BOT,對於初學的人來說,或許一開始就會被 AWS 過於龐大的架構給唬住,在各種設定上忙得暈頭轉向,而沒有時間細細品味 LINE 的運作流程了。以上內容純屬個人言論,不代表本台立場?

LINE 運作方式

好的,講了老半天,那到底 LINE BOT 是怎麼運作的呢?大家可以先看一下圖一

https://ithelp.ithome.com.tw/upload/images/20201220/20120178hCriNlvjN2.png
圖一、LINE BOT 運作方式

我們將 LINE BOT 佈署到 Heroku 上面,而使用者透過 LINE 所提供的平台來和我們的 LINE BOT 進行互動。當使用者對 LINE BOT 發送訊息時,訊息會先經過 LINE 平台。而 LINE 平台像一個訊息轉運處,會將訊息轉傳至 Webhook URL 指定的地方,在我們的例子裡,就是 Heroku。
要讓我們佈署在 Heroku 上面的 LINE BOT 能夠成功回覆訊息,我們要準備好 LINE BOT 的運作邏輯,以及用來核對身分的 LINE BOT 個人資料。當使用者的訊息透過 LINE 平台送到 Heroku 上面來時,我們的 LINE BOT 必須要亮出身分證,也就是CHANNEL_ACCESS_TOKEN以及CHANNEL_SECRET,核對成功,才能夠將回覆訊息傳回到 LINE 平台。同樣的,LINE 平台作為中繼站,會再將訊息傳到使用者端。如此,就完成整個訊息傳遞的流程。

準備設定檔

因此,要讓我們的 LINE BOT 在 Heroku 上面運作,首先要提供幾個最基本的設定檔,包括runtime.txtrequirements.txt,以及Procfile。要注意的是,這幾個檔案的檔名不能有錯,否則 Heroku 會認不出來,造成佈署失敗。那麼就來看看這些檔案到底是做了什麼設定。

  • runtime.txt
python-3.8.6

runtime.txt這個檔案是要告訴 Heroku 該用什麼語言以及版本來執行我們的程式,也就是 LINE BOT。以上面內容為例,我希望 Heroku 用 Python 3.xx 版來執行接下來要佈署的 LINE BOT。關於 Heroku 能夠提供的 Python 執行版本,大家可以在這邊找到。另外一點比較特別的是,如果不想指定 Python 版本的話,就要忽略runtime.txt這個檔案,也就是不要準備runtime.txt

  • requirements.txt
Flask==1.1.2
gunicorn==20.0.4
line-bot-sdk==1.17.0
psycopg2==2.8.6
numpy==1.19.4
Pillow==8.0.1

requirements.txt這個檔案是要請 Heroku 幫我們安裝幾個需要用到的資源庫。Flask是要幫我們處理網路框架的資源庫,gunicorn是有關伺服器運行的資源庫,而line-bot-sdk當然是有關 LINE BOT 的資源庫。psycopg2是 Pyhon 用來操作 SQL 資料的資源庫,numpy是 Python 用來做數據處理非常好用的資源庫,而Pillow則是 Python 用來做簡易影像處理的資源庫。若大家將來在實作 LINE BOT 時,有需要用到其他資源庫,那就可以把它們擺到requirements.txt這個檔案裡面,請 Heroku 幫我們安裝好。據說 Heroku 沒有特別限制可用的安裝空間,不過官方建議不要超過 600 MB (可參考這裡)。

  • Procfile
web: gunicorn 你 Python 執行檔案的名字:app --preload

Procfile則是告訴 Heroku 該執行什麼程式。以我而言,等等我希望能夠執行的 Python 檔案檔名是Alma.py,所以Procfile就寫下:

web: gunicorn Alma:app --preload

準備 LINE BOT 樣板程式碼

好了,該準備的設定檔都有了,現在我們可以來撰寫真正讓 LINE BOT 運作起來的程式碼了:

  • Alma.py
# 初始化LINT BOT
import os

from flask import Flask
from linebot import LineBotApi, WebhookHandler

app = Flask(__name__)

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

# 利用 handler 處理 LINE 觸發事件
from linebot.models import MessageEvent, TextMessage, TextSendMessage

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token, TextSendMessage(text=f"Hello {line_bot_api.get_profile(event.source.user_id).display_name}!")
    )

# 利用 route 處理路由
from flask import request, abort
from linebot.exceptions import InvalidSignatureError

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

以上是一個最簡單的 LINE BOT 樣板程式碼。我們會先利用這個樣板程式碼來確認 LINE BOT 能不能順利運作,之後再從這個樣板程式碼出發,為我們的 LINE BOT 加油添醋,裝備各種功能。樣板程式碼看起來長,但也不難理解,大略可分成三個部分,初始化 LINE BOT、handler處理 LINE 的觸發事件、以及route處理路由。
初始化 LINE BOT 是利用

app = Flask(__name__)

建構出網路框架,並利用

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

來確認 LINE BOT 的身分,以便跟我們在 LINE 上面申請的聊天機器人帳號做連接。

而用handler來處理 LINE 觸發事件的方式也相當直覺:

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):

白話翻譯就是,當有MessageEvent而且是TextMessage傳過來到 LINE BOT 這邊時,請執行下面定義的這個函式,也就是handle_message(event)

最後一部分,用route來處理路由,這邊的程式碼看起來七零八落,長長一串不好理解,不過大意就是,我們要建立一個路由,專門接收 LINE 送過來的事件。這邊我們用來接收 LINE 事件的路由是"/callback"。這只是一個名稱,你要取什麼都可以,但習慣上大家會用"/callback"

推向 Heroku

好啦,該有的檔案都準備好了以後,我們就可以將這些檔案傳送到 Heroku 上面,請 Heroku 幫我們執行,讓 LINE BOT 動起來。最後檢查一次我們現在有哪些檔案,以我為例,我想把appendix這個資料夾傳送到 Heroku 上面,因此資料夾裡面的資料結構應該要如這邊所示:

D:\appendix>tree /f
Folder PATH listing
Volume serial number is 9C33-6XXD
D:.
runtime.txt
requirements.txt
Procfile
Alma.py

No subfolders exist

確認沒問題之後,登入 Heroku,申請一個 APP 空間:

D:\appendix>heroku login –i

申請一個 APP 空間,名稱可以自己取:

D:\appendix>heroku create –a 你-APP-的名字

Heroku 會先檢查是否有重複的 APP 名稱,若無,則會開始準備空間並初始化該 APP。完成了以後,我們就可以用版本控制系統 Git 來將我們指定的資料夾送到 Heroku了。

首先初始化 Git:

D:\appendix>git init

將資料夾與 APP 做連接:

D:\appendix>heroku git:remote –a 你-APP-的名字

將所有檔案放到版本控制系統當中:

D:\appendix>git add .

提交版本:

D:\appendix>git commit –m "init"

推向 Heroku:

D:\appendix>git push heroku master

如此一來,我們就算是準備好 LINE BOT 的運作邏輯了,如圖二

https://ithelp.ithome.com.tw/upload/images/20201220/20120178UMjAVl6ytQ.png
圖二、LINE BOT 運作邏輯準備完成

環境變數

利用版本控制系統 Git,我們已經將 LINE BOT 的運作邏輯放到 Heroku 上面了。接下來,我們可以再用 Heroku 環境變數的方式,把 LINE BOT 的個人相關資料放在 Heroku 上面,也就是CHANNEL_ACCESS_TOKENCHANNEL_SECRET。要設定 Heroku 環境變數,可以透過兩種方式,第一種是 Heroku CLI,第二種則是藉由 Heroku 控制面板。兩種方式我們都來看一看:

  • Heroku CLI
    打開命令提示字元,登入 Heroku 並指定 APP 之後,輸入heroku config就可以看到我們 APP 目前所有的環境變數了:
D:\appendix>heroku config –a 你-APP-的名字
=== 你-APP-的名字 Config Vars

空空如也,對吧?那是因為我們還沒添加任何環境變數的設定。要設定環境變數也不困難:

D:\appendix>heroku config:set CHANNEL_ACCESS_TOKEN=your channel access token

意思是,在當前 APP 裡面,新增一個環境變數,變數名稱 (key) 是CHANNEL_ACCESS_TOKEN,變數數值 (value) 是your channel access token。當然這邊要放入的變數數值是代表 LINE BOT 的 channel access token。那麼,變數名稱一定要叫做CHANNEL_ACCESS_TOKEN嗎?不用的,不過要跟我們先前的程式碼對上。還記得 LINE BOT 樣板程式碼裡面,我們是用什麼來驗證 LINE BOT 的身分嗎?

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

沒錯,就是這兩行。而os.environ['CHANNEL_ACCESS_TOKEN']則可以找到 Heroku 環境變數當中變數名稱為CHANNEL_ACCESS_TOKEN的變數數值。因此,如果大家想要換掉這邊的變數名稱,記得 LINE BOT 樣板程式碼也要跟著修改。
沒問題的話,就把CHANNEL_SECRET也加上吧:

D:\appendix>heroku config:set CHANNEL_SECRET=your channel secret

好囉,這時候再回頭看看:

D:\appendix>heroku config –a 你-APP-的名字
=== 你-APP-的名字 Config Vars
CHANNEL_ACCESS_TOKEN: your channel access token
CHANNEL_SECRET: your channel secret

是不是都有了呢!

  • Heroku 控制面板
    其實用 Heroku 控制面板來設定環境變數也是相當方便的一個做法。首先來到 Heroku 官網,登入帳號,選擇欲做設定的 APP。來到 Settings 這個分頁,應該可以看到 Config Vars 這個欄位,如圖三。Real Config Vars 那個按鈕就給他大力按下去,這樣就可以開始設定我們的環境變數了。

https://ithelp.ithome.com.tw/upload/images/20201220/20120178GCMhL1TvCk.png
圖三、Real Config Vars 大力按下去,開始設定環境變數。

是不是很簡單呢?

最後記得到 LINE BOT 帳號設定面板裡,把 Webhook URL 填上 Heroku 幫我們創造出來的路由:https://你-APP-的名字.herokuapp.com/callback

這樣,我們就可以開心的和 LINE BOT 聊天了喔!

https://ithelp.ithome.com.tw/upload/images/20201220/20120178sBFyXsBipr.png
圖四、你好 Alma

整理資料夾

現在 LINE BOT 已經可以成功運作了。但為了往後的擴充以及維護,或說增加程式碼的可讀性,我想在這個地方對Alma.py這個代表 LINE BOT 運作邏輯的檔案稍做調整,將各種功能清楚的分門別類。還記得Alma.py幫我們處理了三件事,分別為

  • 初始化 LINE BOT
  • 利用handler處理觸發事件
  • 利用router處理路由

現在我要把這三件事拆成三個檔案。怎麼做呢?首先把Alma.py改成這樣:

  • Alma.py
from app import app

if __name__ == "__main__":
    app.run()

接著在目前資料夾appendix底下開一個資料夾app,並新增一個檔案__init__.py用來初始化 LINE BOT:

  • app/__init__.py
import os

from flask import Flask
from linebot import LineBotApi, WebhookHandler

app = Flask(__name__)

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

from app import routes, models_for_line

在資料夾app裡面再新增一個檔案models_for_line.py用來處理觸發事件:

  • app/models_for_line.py
from app import handler, line_bot_api

from linebot.models import MessageEvent, TextMessage, TextSendMessage

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token, TextSendMessage(text=f"Hello {line_bot_api.get_profile(event.source.user_id).display_name}!")
    )

在資料夾app裡面再新增一個檔案routes.py用來處理路由:

  • app/routes.py
from app import app, handler

from flask import request, abort
from linebot.exceptions import InvalidSignatureError

# 接收 LINE 的資訊
@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

這樣我們整個資料夾的架構就變成:

D:\appendix>tree /f
Folder PATH listing
Volume serial number is 9C33-6XXD
D:.
│   runtime.txt
│   requirements.txt
│   Procfile
│   Alma.py
│
└───app
        __init__.py
        models_for_line.py
        routes.py 

看起來是不是很簡潔,而且分工有條理呢?

將整理好的資料夾推向 Heroku,並試試看 LINE BOT 是不是仍然運作如常。

掛載 Heroku Postgres

替 LINE BOT 加上資料庫是一種相當常見的設計。有了資料庫,使用者跟 LINE BOT 互動時,就可以讓 LINE BOT 記下使用者傳送的資料、使用者當前的狀態、或是使用者的設定等等的,這樣在回覆訊息時,就可以做到客製化、根據不同內容回覆不同條件的訊息。
而我們接下來要實現的影像處理服務,就需要一個資料庫來記下使用者的種種設定。Heroku 官方提供了一個好用的關聯式資料庫:Heroku Postgres,讓我們簡單的透過添加擴充元件 (Add-ons),就可以讓 Heroku APP 擁有一個資料庫。現在就來快速地看一看怎麼做吧。
舉一反三一下,這邊作法也有兩種,透過 Heroku CLI 跟 Heroku 控制面板。

  • Heroku CLI
    我們可以用heroku addons –a 你-APP-的名字先來檢查一下目前使用的 APP 有沒有任何擴充元件
D:\appendix>heroku addons –a
No add-ons for app 你-APP-的名字.

如果沒有的話,可以用heroku addons:create heroku-postgresql:hobby-dev來增加一個採用 hobby-dev 方案的 Heroku Postgres 資料庫 (怕放錯擴充元件位置的話,可以用-a 你-APP-的名字來指定 APP):

D:\appendix>heroku addons:create heroku-postgresql:hobby-dev -a 你-APP-的名字

成功了以後,可以試著在輸入一次heroku addons –a 你-APP-的名字

D:\appendix>heroku addons -a 你-APP-的名字
Add-on                          Plan       Price  State
──────────────────────────────  ─────────  ─────  ───────
heroku-postgresql (postgresql)  hobby-dev  free   created
 └─ as DATABASE

出現了,我們的 Heroku Postgres!

  • Heroku 控制面板
    在 Overview 這個頁面上,找到 Installed add-ons 這個欄位,右邊有一個 Configure Add-ons,大力點下去,如圖五

https://ithelp.ithome.com.tw/upload/images/20201220/20120178NkX37FQV5M.png
圖五、Configure Add-ons

搜尋 Heroku Postgres,在搜尋列中輸入 H…e…r…o…k…u…P…o…s… 啊,有了!

https://ithelp.ithome.com.tw/upload/images/20201220/20120178MuoqaptjYb.png
圖六、搜尋 Heroku Postgres

我們最愛當免費仔,所以就選 hobby-dev 這個版本。

https://ithelp.ithome.com.tw/upload/images/20201220/20120178fnNQIQC8xI.png
圖七、hobby-dev,免費的最貴

完成了!是不是很簡單呢?

初始化表格

註:表格欄位以及資料型態已於 2020.12.27 更新

我們在 第 15 天 裡知道該怎麼從自己的電腦 (本機端) 發送指令到 Heroku Postgres,並在資料庫當中創造表格。不過呢。如果每次要佈署 LINE BOT 都要從本機端多執行這個動作,是不是很麻煩呢?因此,今天我們來試試看可不可以把這些操作包在 LINE BOT 的邏輯程式碼裡面,佈署出去就自動創造表格。

先來寫一段萬用公式,每一次連接資料庫時的起手式:

def access_database():
    DATABASE_URL = os.environ['DATABASE_URL']
    conn = psycopg2.connect(DATABASE_URL, sslmode='require')
    cursor = conn.cursor()
    return conn, cursor
  • 第二行:DATABASE_URL = os.environ['DATABASE_URL']
    只要我們為 APP 添加了 Heroku Postgres 擴充元件,Heroku 的就會多了一個變數名稱是DATABASE_URL的環境變數,利用這一行程式碼就可以拿到該變數的數值。

  • 第三行:conn = psycopg2.connect(DATABASE_URL, sslmode='require')
    利用psycopg2連接資料庫。

  • 第四行:cursor = conn.cursor()
    製造一個可以操作資料庫的游標。

先用 SQL 語言來介紹我們想要創造的表格,當中的欄位跟欄位限制:

註:表格欄位以及資料型態已於 2020.12.27 更新

CREATE TABLE user_dualtone_settings (
    user_id VARCHAR ( 50 ) PRIMARY KEY,
    message_id VARCHAR ( 50 ) NOT NULL,
    mode VARCHAR ( 20 ) NOT NULL,
    gradient_factor VARCHAR ( 20 ) NOT NULL,
    first_tone VARCHAR ( 20 ) NOT NULL,
    second_tone VARCHAR ( 20 ) NOT NULL
);

看懂了嗎?我們想要創造一個表格,表格名稱是user_dualtone_settings,用user_id作為PRIMARY KEY,這個欄位必定有值,而且同一個表格內不能有兩個相同的user_id。其他欄位包括message_idmodegradient_factorfirst_tonesecond_tone。這些欄位也都必須填入資料,而填入的資料型態必須是字串VARCHAR,只是有不同的長度限制 (( 50 )或是( 20 ))。

沒問題的話,就來寫一個初始化表格的函式吧:

註:表格欄位以及資料型態已於 2020.12.27 更新

def init_table():
    conn, cursor = access_database()
    postgres_table_query = "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'"
    cursor.execute(postgres_table_query)
    table_records = cursor.fetchall()
    table_records = [i[0] for i in table_records]

    if 'user_dualtone_settings' not in table_records:
        create_table_query = """CREATE TABLE user_dualtone_settings (
            user_id VARCHAR ( 50 ) PRIMARY KEY,
            message_id VARCHAR ( 50 ) NOT NULL,
            mode VARCHAR ( 20 ) NOT NULL,
            gradient_factor VARCHAR ( 20 ) NOT NULL,
            first_tone VARCHAR ( 20 ) NOT NULL,
            second_tone VARCHAR ( 20 ) NOT NULL
        );"""

        cursor.execute(create_table_query)
        conn.commit()

    return True
  • 第三行:SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'
    我們可以用
SELECT * FROM pg_catalog.pg_tables

來查詢 Heroku Postgres (事實上所有的 PostgreSQL 都可以這麼做) 資料庫裡面所有的表格。同時因為我們只關注表格名稱,也就是tablename,所以可以再仔細一點:

SELECT tablename FROM pg_catalog.pg_tables

同時因為pg_catalog.pg_tables會查到一些用來描述該資料庫狀態和設定的表格,而我們並不在意那些表格,只自私的想知道我們創造出來的表格,所以可以再仔細一點:

SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'

沒錯,就變成第三行的程式碼了。
所以init_table()這段程式碼可以幫我們做到的事,就是先檢查資料庫裡是否存在user_dualton_settings這個表格,如果沒有,就按照我們的需求,替我們建立這個表格。剩下的,就是當我們需要用到表格時,呼叫這個函式了。

今天快速的複習了一下如何在 Heroku 上初始化 LINE BOT。其中包含了許多主題,包括 LINE BOT 運作原理,Git 基本操作,Heroku CLI 基本操作,LINE BOT 身分資料,Heroku Postgres 擴充元件,SQL 語法,在 Python 中以psycopg2操作 SQL 資料庫,若想了解更詳細的,可以參考:

第 09 天:LINE BOT SDK:註冊!註冊!註冊!
第 10 天:LINE BOT SDK:初始化聊天機器人
第 15 天:LINE BOT SDK:Heroku Postgres 資料庫

感謝大家花時間看到這裡,下一篇文章預計 12/27 更新。

那麼,今天最重要的一件事就是,感謝 iT邦幫忙 和 博碩文化,LINE Bot by Python 全攻略 集結成書了,歡迎大家有興趣的可以參考呢!


尚未有邦友留言

立即登入留言