iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
DevOps

30天的社群機器人之旅系列 第 28

Day 28 InlineQueryHandler

  • 分享至 

  • xImage
  •  

今天要來介紹的是前幾天忘記介紹的 InlineQueryHandler 。

首先需要說明的是它跟 InlineKeyboard 沒有關係,而是 Telegram 另一個相當有趣的功能。

InlineQuery 有點類似 Command ,但是不同於 Command 以 / 開頭, InlineQuery 需要以 @<機器人名稱> 開頭,雖然我沒有很理解這個的作用,但我覺得應該是類似 Line Bot 的 Quick Reply 之類的吧(各位對於這個功能有甚麼使用心得也歡迎跟我分享一下)。

首先這個功能需要到 BotFather 裡面設定,進入你的機器人 -> Bot Settings 就可以看到 Inline Mode ,接著點擊進去,選擇 Turn inline mode on ,在點擊下方的 Edit inline placeholder ,設定好沒輸入文字時顯示的浮水印文字,隨便設定即可。

設定好了之後,我們就可以回到程式中,

import os
import logging

from telegram import Update
from telegram import (ReplyKeyboardMarkup, KeyboardButton,
                      ReplyKeyboardRemove)  # New
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram import InlineQueryResultArticle, InputTextMessageContent
from telegram.ext import Updater
from telegram.ext import (CallbackContext, Filters, MessageHandler,
                          CommandHandler, CallbackQueryHandler, InlineQueryHandler)


''' Get envrion param '''
TOKEN = os.environ["TOKEN"]


''' logging '''
logging.basicConfig(
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    level=logging.DEBUG)
logger = logging.getLogger(__name__)


''' Bot init '''
updater = Updater(token=TOKEN)
dispatcher = updater.dispatcher


# 建立 InlineKeyboard
keyboard_1 = InlineKeyboardMarkup([
    [
        InlineKeyboardButton(
            "Youtube", url="http://youtube.com/"),
        InlineKeyboardButton(
            "Facebook", url="https://www.facebook.com/")
    ], [
        InlineKeyboardButton("A", callback_data="a"),
        InlineKeyboardButton("B", callback_data="b")
    ]
])


# 訊息回復方式
def echo(update: Update, context: CallbackContext):
    # 加入 InlineKeyboard
    update.message.reply_text(
        text=update.message.text, reply_markup=keyboard_1)


# 指令回復方式
def start(update: Update, context: CallbackContext):
    context.bot.send_message(
        chat_id=update.message.chat.id, text="Hello")


def get_id(update: Update, context: CallbackContext):
    context.bot.send_message(
        chat_id=update.message.chat.id, text=update.message.from_user.id)


def show(update: Update, context: CallbackContext):
    update.message.reply_text(
        text="Show menu",
        reply_markup=ReplyKeyboardMarkup([
            ["1", "2", "3"],
            [KeyboardButton("4"), KeyboardButton("/start")]
        ], resize_keyboard=True, one_time_keyboard=True))


def hide(update: Update, context: CallbackContext):
    update.message.reply_text(
        text="Hide menu",
        reply_markup=ReplyKeyboardRemove(True))


def callbackquery(update: Update, context: CallbackContext):
    update.callback_query.message.reply_text(
        text=update.callback_query.data)


def inlinequery(update: Update, context: CallbackContext):  # New
    context.bot.answer_inline_query(
        inline_query_id=update.inline_query.id,
        results=[
            InlineQueryResultArticle(
                id=update.inline_query.id,
                title="TEST",
                input_message_content=InputTextMessageContent(
                    message_text="just test"
                )
            )
        ]
    )


# 註冊訊息回復方式
updater.dispatcher.add_handler(MessageHandler(
    filters=(Filters.text), callback=message_handler))
# 註冊指令回復方式
updater.dispatcher.add_handler(
    CommandHandler("start", callback=start))
updater.dispatcher.add_handler(
    CommandHandler("get_id", callback=get_id))
updater.dispatcher.add_handler(
    CommandHandler("show", callback=show))
updater.dispatcher.add_handler(
    CommandHandler("hide", callback=hide))
updater.dispatcher.add_handler(
    CallbackQueryHandler(callbackquery))
updater.dispatcher.add_handler(InlineQueryHandler(inlinequery))  # New


# 開始長輪詢
if __name__ == "__main__":
    updater.start_polling()
    updater.idle()
    updater.stop()

基本上設定大致上相同,都需要註冊 InlineQueryHandler ,接著重點就來了,我們需要設定如何回應 InlineQuery ,並提供一個模板,類似 QuickReply 有個預設回復模式。但不同的是, Telegram Bot 具有相當多的回覆模式可供選擇。

那麼就先到這邊,因為這個功能雖然有趣,但是我覺得並不實用,因此只是簡單介紹,但也有可能是我沒 Get 到它的使用情境,因此才會這樣覺得,但不得不說 Telegram 真的提供了很多有趣的功能。

大家掰~掰~


上一篇
Day 27 正則表達式
下一篇
Day 29 Webhook
系列文
30天的社群機器人之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言