Python+LINE Bot 輕鬆打造股市機器人(三) : Python與LINE Bot串接測試

更新於 發佈於 閱讀時間約 15 分鐘
在我們的上一篇文章中,我們已經準備好了製作LINE Bot所需的各項工具。接下來,我們將一起來進行最基礎的Python與LINE的串接練習。透過這次的練習,我們將喚醒我們的機器人,並讓它展現最基本的回答功能。那麼,讓我們開始吧!
如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的工具

開啟Visual Studio Code

創建資料夾

首先,我們先創建要存放LINE機器人所需要的程式碼以及相關檔案的資料夾,在此我選擇一個路徑創建一個名為LINEBot的資料夾。
接著打開Visual Studio Code,點選左上角的「檔案」,接著點選「開啟資料夾」,並且選擇剛剛創建的LINEBot資料夾的路徑。
選擇好路徑後,我們必須創建2個基本的檔案,將滑鼠指標移至檔案總管並按下右鍵,選擇新增檔案,分別創建:
  • app.py: 存放Linebot主程式檔
  • requirements.txt: 要安裝的套件版本
創建完會如下圖這樣

編寫requirements.txt

我們接下來要修改的文件是requirements.txt。由於剛剛建立的Render是一個非常乾淨的環境,許多模組並未被預設安裝。這彷彿我們剛開始下載Python一樣,許多模組需要經由pip install進行額外安裝。而requirements.txt的作用就是告知Render,我們的檔案需要哪些模組的支援。
下面是我目前用到的模組,它們都是在我根據程式需求進行寫作的過程中逐一加入的。如果你想要確保模組在Render上的版本與本地端一致,別忘了加上「==版本號」。這種作法可以預防某些功能因為版本不同,在本地端與Render執行上的不一致。
flask==3.0.3
numpy==1.23.2
beautifulsoup4==4.6.3
requests==2.20.1
scipy
pandas==1.2.4
lxml==4.5.2
line-bot-sdk==3.11.0
datetime
matplotlib
gspread==4.0.1
oauth2client==4.1.3
pyimgur
mpl_finance
arrow

編寫app.py

接下來主程式檔app.py要寫的程式碼就比較多了唷!!
我們就分段來簡單說明一下
首先當然要先import所需要的模組,這邊都是為了讓pyhtont串接linebot所需要的一些line官方提供的模組
  1. Flask:這是一個用於建立 web 應用的 Python 框架。在這裡,它被用來創建一個可以接收和處理來自 LINE 的 HTTP 請求的 web 服務器。
  2. request:這是 Flask 框架中的一個模組,用於處理 HTTP 請求。
  3. abort:這是 Flask 框架中的一個函數,用於中止 HTTP 請求並返回一個錯誤碼。
  4. LineBotApi:這是 Line Bot SDK 中的一個類,提供了與 LINE 伺服器進行溝通的各種方法,例如發送訊息、回覆訊息等。
  5. WebhookHandler:這是 Line Bot SDK 中的一個類,用於處理來自 LINE 的 webhook 事件。當用戶在 LINE 上向你的 bot 發送訊息時,LINE 伺服器會發送一個 webhook 事件到你的服務器,WebhookHandler 就是用來處理這些事件的。
  6. InvalidSignatureError:這是 Line Bot SDK 中的一個異常類,當 webhook 事件的簽名不正確時會拋出這個異常。
  7. MessageEvent:這是 Line Bot SDK 中的一個類,表示一個訊息事件。當用戶向你的 bot 發送訊息時,你的服務器會收到一個 MessageEvent。
  8. TextMessage:這是 Line Bot SDK 中的一個類,表示一個文本訊息。你可以創建一個 TextMessage 對象並通過 LineBotApi 將它發送給用戶。
  9. TextSendMessage:這是 Line Bot SDK 中的一個類,表示一個要發送的文本訊息。你可以創建一個 TextSendMessage 對象並通過 LineBotApi 將它發送給用戶。
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
接下來我們就要將python跟line做結合,那要怎麼結合呢?
其實很簡單,首先輸入以下的程式碼,該段程式碼就是串接linebot的鑰匙,其中可以看到兩個值得注意的部分,分別為「你自己的token」以及「你自己的secret」,這兩段是要填入自己linebot的token以及secret,但這兩個部分該去哪裡取得呢?
app = Flask(__name__)  
# 必須放上自己的Channel Access Token 
line_bot_api = LineBotApi('你自己的token')  
# 必須放上自己的Channel Secret
 handler = WebhookHandler('你自己的secret')
我們打開上篇教學中創建LINE Bot的LINE developer,並且登入自己的line帳戶,選擇上篇我們所創建的LINE Bot。
進入以下畫面後,點選「Messaging API」,並且用滑鼠往下滑至底部。
最底部有一個名為「Channel access token」的部分,點選「Issue」便可產生一串代碼,此就是我們上方提到的token部分,將這段代碼複製起來,並且貼到程式碼中「 你自己的token」 的地方。
接下來回到最上方,點選「Basic settings」。
往下滑到「Channel secret」,一樣將代碼複製到程式碼中的 「你自己的secret」 上。
下一步,我們需要注意的是,由於我們使用的雲端服務是免費版,所以在我們長時間未使用時,雲端服務會進入休眠狀態。每次再度啟動都需要花費一些時間。因此,我習慣在開發階段時加上以下的一段程式碼。一但程式開始運行,該程式碼會主動告知我們,服務已經準備好了。這部分的細節,我們將在後續的教學中詳細介紹。現在先嘗試寫上看看。
line_bot_api.push_message('你自己的ID', TextSendMessage(text='你可以開始了'))
其中值得我們注意的是「你自己的ID」的部分,該部分一樣回到剛剛的 LINE developer,在 Channel secret 下方有一個名為「Your user ID」,一樣將該段代碼複製到程式碼中 「你自己的ID」 的地方
輸入好token等驗證代碼後,就是要設置一個路由來接收和處理來自 LINE 伺服器的 webhook 事件。以下程式碼主要目的是為了設置一個 HTTP POST 的路由,用於接收和處理來自 LINE 伺服器的 webhook 事件。以下是詳細的步驟:
  1. @app.route("/callback", methods=['POST']):這一行是用來設置一個路由的。當有 HTTP POST 請求發送到你的伺服器的 "/callback" 路徑時,會調用下面的 callback() 函數。
  2. signature = request.headers['X-Line-Signature']:這一行是從 HTTP 請求的頭部獲取 「X-Line-Signature」的值。這個值是 LINE 伺服器為了驗證請求的合法性而添加的一個簽名。
  3. body = request.get_data(as_text=True):這一行是獲取 HTTP 請求的主體,也就是實際的訊息內容。
  4. app.logger.info("Request body: " + body):這一行是將請求主體的內容記錄到日誌中。
  5. handler.handle(body, signature):這一行是調用之前導入的 WebhookHandler的 handle() 方法,將請求主體和簽名作為參數傳入。handle() 方法會驗證簽名的合法性,並根據請求主體的內容處理 webhook 事件。
  6. 如果在處理 webhook 事件時發生了 InvalidSignatureError 異常,則調用 abort(400) 函數中止請求並返回一個 400 錯誤碼。
  7. 如果一切都正常,則返回 'OK' 字符串作為 HTTP 響應的主體。
# 監聽所有來自 /callback 的 Post Request 
@app.route("/callback", methods=['POST']) 
def callback():     
    # get X-Line-Signature header value     
    signature = request.headers['X-Line-Signature']
    # get request body as text     
    body = request.get_data(as_text=True)     
    app.logger.info("Request body: " + body)      
    
    # handle webhook body     
    try:         
        handler.handle(body, signature)     
    except InvalidSignatureError:         
        abort(400)      
    return 'OK'
然而寫上程式碼後仍然沒有告訴程式碼我們要串接的Render在哪,因此,我們打開上篇教學中我們創建的Render雲端伺服器
我們需要的是該網頁的網址,所以將網址複製起來
接著回到LINE developer的Messaging API中,往下滑到「Webhook settings」,並點選「Edit
接著將剛剛複製的網址貼上,並在後方加上「/callback」,最後按下「Update」進行更新
再來我們可以進行一些設定,像是第一個為「是否機器人加入群組」,預設為否,第二個為「機器人是否自動回覆訊息」,預設為是,但我們為了不讓機器人回覆不必要的罐頭訊息,因此我們要點選右方的「Edit」,進去進行修改
進去後往下看到進階設定的地方,我們要將「自動回應訊息」設為「停用」,這時順便檢查下方的「Webhook」是否為「啟用
大致上串接的工作到這就算正式完成了,之後就不太需要進行變更了,我們就可以專注於撰寫功能程式碼即可

linebot功能程式碼

接下來,我們仍然要在app.py中進行主程式的撰寫
我們今天就先複製以下的程式碼進行測試看看,往後的教學會一一介紹有哪些linebot的功能程式碼
簡單說一下,該段程式碼就是我們輸入什麼內容,機器人就會原封不動的回傳給你一模一樣的功能
#訊息傳遞區塊 
##### 基本上程式編輯都在這個function ##### 
@handler.add(MessageEvent, message=TextMessage) 
def handle_message(event):     
  message = event.message.text     
  line_bot_api.reply_message(event.reply_token,TextSendMessage(message))
而最後我們就必須執行程式碼,所以記得加上以下的程式碼,以表示執行
#主程式 
import os if __name__ == "__main__":    
  port = int(os.environ.get('PORT', 5000))     
  app.run(host='0.0.0.0', port=port)
記得以上的程式碼都要用「Ctrl + s」儲存後再上傳唷!!

上傳至github

當我們以上三個程式碼都編寫完畢後,我們接下來就要將這些程式碼上傳至github中
首先,先開啟我們上篇教學中創建的github資料夾,點選右上角的「Add file」,再點選「Upload files
進去以後,點選畫面中間的「choose your files」,並選擇上述編寫程式碼的檔案,等到檔案都上傳完後,最後按下「commit changes
上傳完的資料夾會顯示如下多出了3個檔案
接著回到heroku中,我們點選左上角的「Deploy」,並點選要用「GitHub」上傳的方式,如果剛剛有登入github,應該會顯示如下圖第3步驟的樣子,前方為你github的帳戶,如果沒有就自行登錄你的github帳戶,而後方輸入你創立的github資料夾,並按下search,這時應該會出現一個如圖第4步驟的路徑,這時按下右方的「Connect」進行串接
串接後,由於我們目前github中沒有其他分支版本,所以預設的版本就是main,如果往後有使用到分支再跟大家分享,這裡我們只需要按下「Deploy Branch」進行佈署
第一次佈署應該都會比較久一點,所有耐心等待一下,而佈署完成會出現如下圖的樣子,表示佈署成功
佈署完成後,這時我們先前用LINE加入的機器人就會突然說出一句「你可以開始了」,表示程式碼佈署成功,這時我們隨便輸入,像我輸入了「你好」,機器人也就會回覆「你好」,我輸入「我誰~~~~」,機器人一樣會回覆 「我誰~~~~」

結論

是不是開始覺得興奮啦!!今天我們學會了如何將python、github、heroku以及linebot進行串接,往後的程式碼教學只會著重在主程式(app.py)中的功能程式碼那部分,其餘皆為設定一次即可,大家就先熟悉如何熟練的串接各個平台,往後不斷更新程式碼後,仍然需要重複上傳與佈署等動作,有興趣的也可自行摸索各個平台的一些功能唷!!
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
175會員
59內容數
我出生於財務金融與資訊背景,滿20歲便開始踏入股市。從當初對股市一無所知的菜鳥,到現在成為一名專注於AI股市研究的分析師,這是我的成長歷程。   我崇尚彼得·林區所強調的理念,認為在生活和工作中觀察,從周遭環境中挑選出適合投資的股票,並搭配近期快速崛起的程式交易、大數據分析等AI技術,立志打造輕鬆又便利的投資之路。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
在我們正式開始Python串接LINE Bot的教程之前,有必要先為大家準備好所需的工具。實際上,製作LINE Bot的工具有很多選擇,我將會介紹我在製作過程中所使用的具體工具有哪些,以及如何進行事前的準備工作。讓我們一起走進這個有趣的製作過程吧!
每當要研究投資標的時,你是否也會覺得A網站的財報資料完整,又覺得B網站的選股條件完善,又覺得C網站的新聞比較重要,有時身邊又沒有隨身攜帶筆電怎麼好查詢呢?這時可能就在想怎麼沒有人開發一個程式能完成符合我想要的功能啊~~與其求助於人,不如自己動手做最好,有相同煩惱的人,LINE Bot超適合你!!
在我們正式開始Python串接LINE Bot的教程之前,有必要先為大家準備好所需的工具。實際上,製作LINE Bot的工具有很多選擇,我將會介紹我在製作過程中所使用的具體工具有哪些,以及如何進行事前的準備工作。讓我們一起走進這個有趣的製作過程吧!
每當要研究投資標的時,你是否也會覺得A網站的財報資料完整,又覺得B網站的選股條件完善,又覺得C網站的新聞比較重要,有時身邊又沒有隨身攜帶筆電怎麼好查詢呢?這時可能就在想怎麼沒有人開發一個程式能完成符合我想要的功能啊~~與其求助於人,不如自己動手做最好,有相同煩惱的人,LINE Bot超適合你!!
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
想要使用python學習程式應該要怎麼開始呢? 首先就是要下載Python(程式語言)還有Pychar(整合開發環境,IDE)這兩個軟體。 在Google的搜尋欄位打上Python下載, 點選第一個Download Python。 第二步點選Download,選擇你的電腦系統。
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
情況描述 我們在「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課(pip install…)」有提到如何打包Python讓自己的程式變成套件, 讓其他人可以用pip install的方式進行安裝,😲 But… 我們實際上打包後, 發現到引用的檔案都有被打包進去,但目錄卻未被打包
想要開始Python語言的開發環境,有兩種常見方式,一種是下載安裝到本機端,另一種是直接在雲端執行。本文將介紹三個常見的開發工具及其安裝步驟。
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
上回說明的手動下指令,傳出訊息。為了節省手動輸入之動作,將欲執行的curl指令內容,事先作成執行檔。當需要傳送訊息時,只要按兩下執行檔,便可立刻傳出訊息至LINE群組內之全員 2. 說明 2.1 因每次要傳送內容不同,將這些會變動的訊息資料,輸入後保存 於bat執行檔內
Thumbnail
本文將介紹如何使用 Python 實現 LINE Notify 功能。LINE Notify 允許用戶通過 Line 應用程序接收自定義通知,非常適合於個人項目或業務流程中。LINE Notify 是 LINE 提供的一項功能,允許用戶從他們的應用程序、服務或系統中,透過LINE 發送通知。
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
想要使用python學習程式應該要怎麼開始呢? 首先就是要下載Python(程式語言)還有Pychar(整合開發環境,IDE)這兩個軟體。 在Google的搜尋欄位打上Python下載, 點選第一個Download Python。 第二步點選Download,選擇你的電腦系統。
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
情況描述 我們在「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課(pip install…)」有提到如何打包Python讓自己的程式變成套件, 讓其他人可以用pip install的方式進行安裝,😲 But… 我們實際上打包後, 發現到引用的檔案都有被打包進去,但目錄卻未被打包
想要開始Python語言的開發環境,有兩種常見方式,一種是下載安裝到本機端,另一種是直接在雲端執行。本文將介紹三個常見的開發工具及其安裝步驟。
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
上回說明的手動下指令,傳出訊息。為了節省手動輸入之動作,將欲執行的curl指令內容,事先作成執行檔。當需要傳送訊息時,只要按兩下執行檔,便可立刻傳出訊息至LINE群組內之全員 2. 說明 2.1 因每次要傳送內容不同,將這些會變動的訊息資料,輸入後保存 於bat執行檔內
Thumbnail
本文將介紹如何使用 Python 實現 LINE Notify 功能。LINE Notify 允許用戶通過 Line 應用程序接收自定義通知,非常適合於個人項目或業務流程中。LINE Notify 是 LINE 提供的一項功能,允許用戶從他們的應用程序、服務或系統中,透過LINE 發送通知。