Telegram Custom Keyboad dengan ReplyKeyboardMarkup

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.

Useful Link

Sharing is caring:

Leave a Comment