昨天已经把 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)
这样子就可以达成简单的选单,进行相关的查询。
<<: 【Day15-文字】文字资料的基本处理——Token、Stem、Stopword
>>: 【PHP Telegram Bot】Day21 - sendPhoto:三种发送图片的方式
kotlin+mvvm+databinding+recyclerview 上一篇讲了activity...
一直遭到攻击的山姆,生命值也快用尽了。 「快离开我们的地盘!」山姆被 Rain 跟 Storm 团...
本系列文章同步发布於笔者网站 上一篇讲述了 OVN Plug-in 在 OpenStack 中的参考...
Setting Up fastlane Install Homebrew $ /usr/bin/ru...
好的,因为我们有时候除了用Firebase之外,我们可能会用其它服务!而Firebase它的Aut...