LineBot - 图文选单

昨天已经把 LineBot 设定好了,今天要做一些简单的指令,包含一图文选单,做完之後大概如下图:

line_image_menu

  1. Line 官方帐号管理页面,选择好我们的机器人帐号後,选择图文选单 > 建立
    建立图文选单

  2. 「标题」, 「使用期间」随意填写,「选单列显示文字」选择「选单」,「预设显示方式」都可以,我是选「显示」
    显示设定

  3. 内容部份,我选择小型3格的样式,这边要准备一张背景图片,图片大小在按「上传背景图片」的时候,会有支援的格式, 大小。大小的话会就依照大型或小型在同样的宽度下,会有不同的高度,依照所选的格式才上传就可以了。
    动作的话,因为我选了3格,所以会有3个选项,这里设定自己要放入选单的指令,文字部份我用 ”[]“ 括起来,和一般的文字输入做区分
    图文选单内容

  4. 再来就是程序码的部份,延续昨天的程序码,多引用了 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:三种发送图片的方式

Android学习笔记05

kotlin+mvvm+databinding+recyclerview 上一篇讲了activity...

从零开始的8-bit迷宫探险【Level 26】这游戏没有华佗,不能补血啊!Game Over 场景切换

一直遭到攻击的山姆,生命值也快用尽了。 「快离开我们的地盘!」山姆被 Rain 跟 Storm 团...

OpenStack Neutron 介绍 — OVN vs OVS

本系列文章同步发布於笔者网站 上一篇讲述了 OVN Plug-in 在 OpenStack 中的参考...

React Native Fastlane

Setting Up fastlane Install Homebrew $ /usr/bin/ru...

【day23】存local端 帐号 (SharedPreferences)

好的,因为我们有时候除了用Firebase之外,我们可能会用其它服务!而Firebase它的Aut...