I am new to telegram inline bot. I have no clue how I can retrieve the callback function of telegram’s inlinekeyboardbuttons. Would be forever greatful if someone can explain this to me how I could retrieve user response.
JavaScript
x
26
26
1
def options(update, context):
2
button_list = []
3
for each in ["yes", "no"]:
4
button_list.append(InlineKeyboardButton(each, callback_data=each))
5
reply_markup = InlineKeyboardMarkup(build_menu(button_list))
6
context.bot.send_message(chat_id=update.message.chat_id,
7
text="Option Selected:",
8
reply_markup=reply_markup)
9
10
def build_menu(buttons, n_cols=1, header_buttons=None, footer_buttons=None):
11
"""
12
Returns a list of inline buttons used to generate inlinekeyboard responses
13
14
:param buttons: `List` of InlineKeyboardButton
15
:param n_cols: Number of columns (number of list of buttons)
16
:param header_buttons: First button value
17
:param footer_buttons: Last button value
18
:return: `List` of inline buttons
19
"""
20
menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)]
21
if header_buttons:
22
menu.insert(0, header_buttons)
23
if footer_buttons:
24
menu.append(footer_buttons)
25
return menu
26
Advertisement
Answer
You have to use CallbackQueryHandler
to assing function
to data
If you use pattern .*
then it will get all data in one function
JavaScript
1
7
1
def handle_callback_query(update, context):
2
print(update.callback_query.data)
3
context.bot.send_message(chat_id=update.effective_chat.id,
4
text='[handle_callback_query] callback data: ' + update.callback_query.data)
5
6
dispatcher.add_handler(CallbackQueryHandler(handle_callback_query, pattern='.*'))
7
You can also use pattern to assing different functions
JavaScript
1
13
13
1
def query_yes(update, context):
2
print(update.callback_query.data)
3
context.bot.send_message(chat_id=update.effective_chat.id,
4
text='[query_yes] callback data: ' + update.callback_query.data)
5
6
def query_no(update, context):
7
print(update.callback_query.data)
8
context.bot.send_message(chat_id=update.effective_chat.id,
9
text='[query_no] callback data: ' + update.callback_query.data)
10
11
dispatcher.add_handler(CallbackQueryHandler(query_yes, pattern='^yes$'))
12
dispatcher.add_handler(CallbackQueryHandler(query_no, pattern='^no$'))
13
Minimal working example.
JavaScript
1
70
70
1
import os
2
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
3
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
4
5
# --- init ---
6
7
TOKEN = os.getenv('TELEGRAM_TOKEN')
8
9
updater = Updater(token=TOKEN, use_context=True)
10
dispatcher = updater.dispatcher
11
12
# --- commands ---
13
14
def options(update, context):
15
button_list = []
16
for each in ["yes", "no"]:
17
button_list.append(InlineKeyboardButton(each, callback_data=each))
18
reply_markup = InlineKeyboardMarkup(build_menu(button_list))
19
context.bot.send_message(chat_id=update.message.chat_id,
20
text="Option Selected:",
21
reply_markup=reply_markup)
22
23
def build_menu(buttons, n_cols=1, header_buttons=None, footer_buttons=None):
24
"""
25
Returns a list of inline buttons used to generate inlinekeyboard responses
26
27
:param buttons: `List` of InlineKeyboardButton
28
:param n_cols: Number of columns (number of list of buttons)
29
:param header_buttons: First button value
30
:param footer_buttons: Last button value
31
:return: `List` of inline buttons
32
"""
33
menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)]
34
if header_buttons:
35
menu.insert(0, header_buttons)
36
if footer_buttons:
37
menu.append(footer_buttons)
38
return menu
39
dispatcher.add_handler(CommandHandler('options', options))
40
41
# --- one function for all data ---
42
43
def handle_callback_query(update, context):
44
print(update.callback_query.data)
45
context.bot.send_message(chat_id=update.effective_chat.id,
46
text='[handle_callback_query] callback data: ' + update.callback_query.data)
47
48
#dispatcher.add_handler(CallbackQueryHandler(handle_callback_query, pattern='.*'))
49
50
# --- different functions for different data ---
51
52
def query_yes(update, context):
53
print(update.callback_query.data)
54
context.bot.send_message(chat_id=update.effective_chat.id,
55
text='[query_yes] callback data: ' + update.callback_query.data)
56
57
def query_no(update, context):
58
print(update.callback_query.data)
59
context.bot.send_message(chat_id=update.effective_chat.id,
60
text='[query_no] callback data: ' + update.callback_query.data)
61
62
dispatcher.add_handler(CallbackQueryHandler(query_yes, pattern='^yes$'))
63
dispatcher.add_handler(CallbackQueryHandler(query_no, pattern='^no$'))
64
65
# --- start ---
66
67
print('Starting ...')
68
updater.start_polling()
69
updater.idle()
70