آموزش ساخت ربات تلگرام - قسمت سوم

توسط Hamid Reza — در در تاریخ

cover-image

سلام دوستان.

اگر قسمت اول رو مطالعه نکردید میتونید از اینجا مطالعه کنید و قسمت دوم رو از اینجا .

در این قسمت به کامل کردن بات قسمت قبل و ادامه مبحث Handler ها میپردازیم.

در قست قبل ، بات به اینجا رسید :

>>> from telegram.ext import Updater
>>> updater = Updater(token='TOKEN')
>>> dispatcher = updater.dispatcher
>>> import logging
>>> logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
...                     level=logging.INFO)
>>> def start(bot, update):
...     bot.send_message(chat_id=update.message.chat_id, text="I'm a bot, please talk to me!")
>>> from telegram.ext import CommandHandler
>>> start_handler = CommandHandler('start', start)
>>> dispatcher.add_handler(start_handler)
>>> updater.start_polling()
>>> def echo(bot, update):
...     bot.send_message(chat_id=update.message.chat_id, text=update.message.text)
...
>>> from telegram.ext import MessageHandler, Filters
>>> echo_handler = MessageHandler(Filters.text, echo)
>>> dispatcher.add_handler(echo_handler)

حالا بیاید یکم قابلیت های کاربردی به بات اضافه کنیم.میخوایم یه دستور به نام caps ایجاد کنیم که یه متن رو دریافت میکنه و اون رو به صورت حروف بزرگ برمیگردونه.برای ساده کردن کار ،میتونید ارگمان هایی (به صورت لیست، جدا شده با فاصله ) که به دستورات ارسال میشن رو در تابع بازخوانی دریافت کنید:

>>> def caps(bot, update, args):
...     text_caps = ' '.join(args).upper()
...     bot.send_message(chat_id=update.message.chat_id, text=text_caps)
...
>>> caps_handler = CommandHandler('caps', caps, pass_args=True)
>>> dispatcher.add_handler(caps_handler)

نکته : به pass_args=True در تعریف CommandHandler دقت کنید.این لازم هست تا handler بدونه که شما میخواید لیست ارگمان های دستور رو به تابع بازخوانی فرستاده بشه.تمام handler ها چنین ارگمان هایی دارن.بعضی ها در تمام handler ها مشابه هستند و بعضی ها اختصاص به تعدادی خاص هستند.اگر برای اولین از یک نوع جدید از handler استفاده میکنید ،با نگاه کردن به مستندات ، میتونید اونایی که براتون مفید هستن رو استفاده کنید. یکی دیگر از قابلیت های جالب ربات های تلگرا م ، Inline Mode یا حالت خطی هست.اگر میخواید حالت خطی رو به بات خودتون اضافه کنید ، اول باید با BotFather@ صحبت کنید و حالت خطی رو با دستور setinline/ فعال کنید.بعضی اوقات یکم طول میکشه تا بات شما به عنوان یه بات خطی روی کلاینت تلگرامتون ثبت بشه.برای سرعت بخشیدن به این فرایند ،‌میتونید برنامه تلگرامتون رو ری اسارت کنید. (یا گاهی اوقات فقط باید مدتی صبر کنید.) حالا بیاید حالت خطی رو به بات‌تون اضافه کنیم.شما احتمالا الان دیگه روند کار رو میدونید، اما تعدادی نوع جدید استفاده شده پس بهتره دقت کنید:

>>> from telegram import InlineQueryResultArticle, InputTextMessageContent
>>> def inline_caps(bot, update):
...     query = update.inline_query.query
...     if not query:
...         return
...     results = list()
...     results.append(
...         InlineQueryResultArticle(
...             id=query.upper(),
...             title='Caps',
...             input_message_content=InputTextMessageContent(query.upper())
...         )
...     )
...     bot.answer_inline_query(update.inline_query.id, results)
...
>>> from telegram.ext import InlineQueryHandler
>>> inline_caps_handler = InlineQueryHandler(inline_caps)
>>> dispatcher.add_handler(inline_caps_handler)

مستندات مرتبط : telegram.ext.InlineQueryHandler, answerInlineQuery خب الان بات شما ، هم به صورت خطی و هم به صورت دستوری میتونه پیام ها رو به صورت حروف بزرگ برگردونه ! بعضی از کاربران گیج ( :) ) ممکنه سعی کنن پیام هایی به بات بفرستند که بات متوجه اونا نمیشه.پس میتونید از یه MessageHandler و یه فیلتر command استفاده کنید تا به تمام دستوراتی که توسط handler های قبلی تشخیص داده نشدن ، جواب بده.

>>> def unknown(bot, update):
...     bot.send_message(chat_id=update.message.chat_id, text="Sorry, I didn't understand that command.")
...
>>> unknown_handler = MessageHandler(Filters.command, unknown)
>>> dispatcher.add_handler(unknown_handler)

نکته : این handler باید در اخر اضافه بشه.اگر زودتر اضافه اش کنید ، ممکن قبل از اینکه CommandHandlers بتونه به اپدیت ها نگاهی بندازه ، این handler اجرا بشه.وقتی یه handler اجرا بشه تمام handler های بعد از اون چشم پوشی میشه و اجرا نمیشن.برای حل این مشکل میتونید کلمه کلیدی group (int) رو با مقداری غیر از 0 به صورت ارگمان به add_handler بدید. اگر بازی کردن با بات‌تون تموم شده ، میتونید بوسیله دستور زیر بات رو متوقف کنید:

>>> updater.stop()

نکته : همونطور که قبلا خوندید ، Updater در یه ریسه (thread) جداگانه اجرا میشه که برای این اموزش خیلی عالی هست.اما اگر شما اسکریپت مینویسین ، احتمالا بخواید که بات رو با Ctrl + C یا ارسال سیگنال به پروسس بات ، متوقف کنید. برای این کار، از ()updater.idle استفاده کنید. نحوه کارش اینجور هست که اجرا رو بلاک میکنه تا وقتی که یکی از اون دو اتفاق رخ بده. سپس ()updater.stop رو صدا میزنه و به ادامه اجرای اسکریپت میپردازه. در قسمت بعدی آموزش ، به صف کار (JobQueue) میپردازیم.