Pada modul ini kita akan membahas custom keyboard. Dengan membuat custom keyboard, user akan lebih memberikan input, karena sudah disesuaikan dengan kebutuhan.
Berikut contoh bot yang menggunakan custom keyboard. Saat pertama kali masuk, bot akan menampilkan keyboard custom. Pada contoh keyboard memberikan pilihan input Age, Favourite colour, Number of siblings, Something else dan Done.
Saat kita memilih Age, maka bot akan menjawab. “Your age? Yes, I would love to hear about that!”. Pada saat ini, custom keyboard tidak ditampilkan. Keyboard yang ditampilkan adalah keyboard android.
Setelah kita menjawab, maka bot akan membalas dengan “Neat! Just……”. Bot akan kembali menampilkan keyboard custom.
Untuk code lengkap silakan download disini.

Code
import logging
from telegram import ReplyKeyboardMarkup
from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters,
ConversationHandler)
# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
CHOOSING, TYPING_REPLY, TYPING_CHOICE = range(3)
reply_keyboard = [['Age', 'Favourite colour'],
['Number of siblings', 'Something else...'],
['Done']]
markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
def facts_to_str(user_data):
facts = list()
for key, value in user_data.items():
facts.append('{} - {}'.format(key, value))
return "\n".join(facts).join(['\n', '\n'])
def start(update, context):
update.message.reply_text(
"Hi! My name is Doctor Botter. I will hold a more complex conversation with you. "
"Why don't you tell me something about yourself?",
reply_markup=markup)
return CHOOSING
def regular_choice(update, context):
text = update.message.text
context.user_data['choice'] = text
update.message.reply_text(
'Your {}? Yes, I would love to hear about that!'.format(text.lower()))
return TYPING_REPLY
def custom_choice(update, context):
update.message.reply_text('Alright, please send me the category first, '
'for example "Most impressive skill"')
return TYPING_CHOICE
def received_information(update, context):
user_data = context.user_data
text = update.message.text
category = user_data['choice']
user_data[category] = text
del user_data['choice']
update.message.reply_text("Neat! Just so you know, this is what you already told me:"
"{} You can tell me more, or change your opinion"
" on something.".format(facts_to_str(user_data)),
reply_markup=markup)
return CHOOSING
def done(update, context):
user_data = context.user_data
if 'choice' in user_data:
del user_data['choice']
update.message.reply_text("I learned these facts about you:"
"{}"
"Until next time!".format(facts_to_str(user_data)))
user_data.clear()
return ConversationHandler.END
def error(update, context):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, context.error)
def main():
# Create the Updater and pass it your bot's token.
updater = Updater("TOKEN ANDA", use_context=True)
# Get the dispatcher to register handlers
dp = updater.dispatcher
# Add conversation handler with the states CHOOSING, TYPING_CHOICE and TYPING_REPLY
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
CHOOSING: [MessageHandler(Filters.regex('^(Age|Favourite colour|Number of siblings)$'),
regular_choice),
MessageHandler(Filters.regex('^Something else...$'),
custom_choice)
],
TYPING_CHOICE: [MessageHandler(Filters.text,
regular_choice)
],
TYPING_REPLY: [MessageHandler(Filters.text,
received_information),
],
},
fallbacks=[MessageHandler(Filters.regex('^Done$'), done)]
)
dp.add_handler(conv_handler)
# log all errors
dp.add_error_handler(error)
# Start the Bot
updater.start_polling()
# Run the bot until you press Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT. This should be used most of the time, since
# start_polling() is non-blocking and will stop the bot gracefully.
updater.idle()
if __name__ == '__main__':
main()
Penjelasan Code
reply_keyboard = [['Age', 'Favourite colour'],
['Number of siblings', 'Something else...'],
['Done']]
markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
Untuk membuat custom keyboard, kita gunakan Class ReplyKeyboardMarkup. Dengan parameter array keyboard. Dari contoh array diatas, maka keyboard layout adalah:
- Baris pertama akan berisi Age dan Favourite Colour.
- Baris kedua berisi Number of siblings dan Something else.
- Baris ketiga berisi Done.
Layout yang tampil di user bisa dilihat pada gambar diatas.
Pada contoh program, parameter one_time_keyboard diisi True, keyboard akan disembunyikan setelah digunakan oleh pengguna. Untuk dokumentasi lengkap dapat lihat disini.
Pada modul ini juga kita menggunakan conversation handler, untuk dokumentasi lengkap lihat disini. Untuk menghandle alur percakapan. State dari percakapan adalah:
- CHOOSING : State dimana bot mengembalikan pilihan dalam bentuk custom keyboard.
- TYPING_CHOICE : State dimana pengguna menjawab menggunakan custom keyboard.
- TYPING_REPLY: State dimana pengguna menjawab dengan android keyboard.
Alur percakapan akan berhenti saat pengguna memilih custom keyboard Done.
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
CHOOSING: [MessageHandler(Filters.regex('^(Age|Favourite colour|Number of siblings)$'),
regular_choice),
MessageHandler(Filters.regex('^Something else...$'),
custom_choice)
],
TYPING_CHOICE: [MessageHandler(Filters.text,
regular_choice)
],
TYPING_REPLY: [MessageHandler(Filters.text,
received_information),
],
},
fallbacks=[MessageHandler(Filters.regex('^Done$'), done)]
)
dp.add_handler(conv_handler)
Untuk menampilkan keyboard, dapat lihat pada fungsi start dan received_information. Pada dasarnya kita tampilkan keyboard dengan mengisi parameter reply_markup pada fungsing update.message_reply_text().
reply_markup sudah dijelaskan pada awal penjelasan code diatas.
def start(update, context):
update.message.reply_text(
"Hi! My name is Doctor Botter. I will hold a more complex conversation with you. "
"Why don't you tell me something about yourself?",
reply_markup=markup)
return CHOOSING
Nah, semoga tutorial Membuat Chat Bot Telegram menggunakan Python ini bisa membantu Anda dalam membuat chat bot yang lebih kompleks sesuai dengan kebutuhan sistem Anda.
SIlakan kunjungi link dibawah, semua code pada tutorial ini diambil dari link Contoh bot dasar. Bila Anda ingi melihat contoh bot yang lebih kompleks, bisa dilihat dilink contoh bot advanced.