昨天已經把 LineBot 設定好了,今天要做一些簡單的指令,包含一圖文選單,做完之後大概如下圖:
到 Line 官方帳號管理頁面,選擇好我們的機器人帳號後,選擇圖文選單 > 建立
「標題」, 「使用期間」隨意填寫,「選單列顯示文字」選擇「選單」,「預設顯示方式」都可以,我是選「顯示」
內容部份,我選擇小型3格的樣式,這邊要準備一張背景圖片,圖片大小在按「上傳背景圖片」的時候,會有支援的格式, 大小。大小的話會就依照大型或小型在同樣的寬度下,會有不同的高度,依照所選的格式才上傳就可以了。
動作的話,因為我選了3格,所以會有3個選項,這裡設定自己要放入選單的指令,文字部份我用 ”[]“ 括起來,和一般的文字輸入做區分
再來就是程式碼的部份,延續昨天的程式碼,多引用了 shioaji 進來,並在程式一執行的時候就進行登入。postback 的部份沒有變動,主要還是在 handle_message 的部份加了 action 的判斷。完整程式碼如下
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, TemplateSendMessage, ButtonsTemplate
)
from linebot.models.actions import MessageAction, PostbackAction, URIAction
# 多引用了 shioaji
import shioaji as sj
from shioaji.data import Snapshot
import re
app = Flask(__name__)
line_bot_api = LineBotApi('CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('CHANNEL_SECRET')
sjApi = sj.Shioaji()
sjApi.login(person_id="身份證字號", passwd="密碼")
# 要執行的指令
action = ""
# callback 基本上沒有動
@app.route("/callback", methods=["POST"])
def callback():
# get X-LineSignature 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:
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
global action
# 取得傳入的文字
msg = event.message.text
# 檢查是不是指令
regex = re.compile("\[(.+)\]")
match = regex.match(msg)
if match:
# 如果是指令的話,設定下一步要執行的指令
action = match.group(1)
# 取得回傳訊息
reply_msg = getActionReplyMsg()
# 回傳訊息
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_msg)
)
# 結束本次執行
return
else:
# 執行查詢股票
if action == "stock":
reply_msg = queryStock(msg)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_msg)
)
return
# 執行查詢期貨
if action == "future":
reply_msg = queryFeature(msg)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_msg)
)
return
def getActionReplyMsg():
global action
if action == "stock":
return "請輸入股票代碼"
elif action == "future":
return "請輸入期貨代碼"
else:
action = ""
return "沒有此指令,請確認後再輸入"
def queryStock(stock_code):
global action
stock = sjApi.Contracts.Stocks[stock_code.upper()]
if stock == None:
return "查無此股票代碼 - " + stock_code
snapshots = sjApi.snapshots([stock])
action = ""
return snapshots[0].close
def queryFeature(future_code):
global aciton
future = sjApi.Contracts.Futures[future_code.upper()]
if future == None:
return "查無此期貨代碼 - " + future_code
snapshot = sjApi.snapshots([future])
print(snapshot[0])
action = ""
return snapshot[0].close
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8080, debug=True)
這樣子就可以達成簡單的選單,進行相關的查詢。