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

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

cover-image

سلام دوستان .

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

در این قسمت میخوایم ساب ماژول telegram.ext رو برسی کنیم و اولین رباتتون رو با هم بنویسیم.

مقدمه‌ :

ساب ماژول telegram.ext بر روی API های خالص ساخته شده.این ساب ماژول یک فضای بسیار ساده برای برنامه نویس ایجاد کرده که بسیاری از کار ها رو از دوش برنامه نویس برداشه و بنابراین نیازی نیست که کار های تکراری انجام بدین.

این ساب ماژول متشکل از کلاس های زیادی هست، اما دو تا از مهم ترین کلاس های اون telegram.ext.Updater و telegram.ext.Dispatcher هستند.

کلاس Updater ‌به طور دائم بروزرسانی های تلگرام رو دریافت کرده و به کلاس Dispatcher ارسال میکند.اگر شما یک کلاس Updater بسازید ، یک کلاس Dispatcher نیز برای شما ساخته خواهد شد و بوسیله یک Queue به یکدیگر پیوند داده میشوند. سپس شما میتونید Handler های مختلف رو در کلاس Dispatcher ثبت کنید ، که بروزرسانی هایی که از کلاس Updater دریافت میکنه رو بر اساس Handler هایی که ثبت کردین مرتب میکنه و به توابع بازخوانی(callback) که تعریف کردید میفرسته.

هر Handler یک نمونه از ساب کلاس های کلاس telegram.ext.Handler هست.کتابخونه برای همه موارد کلاس های Handler فراهم کرده ، اما اگر شما یک مورد بسیار خواص نیاز داشتید میتونید یک ساب کلاس برای خود بسازید.

برای شروع به توکن احتیاج داریم.اگر قسمت قبل رو مطالعه کردید ، میتونیم از توکنی که در اونجا ساختید استفاده کنیم.و اگر نه : باید به ربات BotFather@ پیام بدین و بعد از انتخاب نام و نام کاربری بات ، توکن رو دریافت میکنید.به هرحال باید قسمت قبل رو مطالعه کرده باشید.

اولین بات شما ، قدم به قدم :

خب بیاید دوباره شروع کنیم! یک ترمینال باز کنید و مفسر پایتون رو اجرا کنید.

اول باید یک شی Updater ایجاد کنید. 'TOKEN' رو با توکنی که دریافت کردید جایگزین کنید.

>>> from telegram.ext import Updater
>>> updater = Updater(token='TOKEN')

مستندات مرتبط : telegram.ext Updater

برای دسترسی سریعتر به Dispatcher ای که توسط Updater استفاده میشه ، میتونید اون رو به صورت محلی معرفی کنید .

>>> dispatcher = updater.dispatcher

الان زمان مناسبی هست که ماژول logging رو راه اندازی کنیم ، تا بدونیم چه موقع و به چه دلیل چیز ها درست کار نمیکنند‌.

>>> import logging 
>>> logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)

نکته :‌اگر میخواهید بیشتر بدونید ، مقاله Exception handling رو مطالعه کنید.

حالا میتونید یه تابع تعریف کنید که یه نوع خاص از اپدیت رو پردازش کنه .

>>> def start(bot, update):
...     bot.send_message(chat_id=update.message.chat_id, text="I'm a bot, please talk to me!")

مستندات مرتبط : sendMessage

هدف این هست که تابع هر دفعه که بات پیام تلگرامی که شامل دستور start/ باشه رو دریافت میکنه ، اجرا بشه.برای کامل کردنش شما میتونید از یک CommandHandler استفاده کنید (یکی از ساب کلاس های فراهم شده توسظ کلاس Handler ) و اون رو در Dispatcher ثبت کنید.

>>> from telegram.ext import CommandHandler 
>>> start_handler = CommandHandler('start', start) 
>>> dispatcher.add_handler(start_handler)

مستندات مرتبط : telegram.ext.CommandHandler و telegram.ext.Dispatcher.add_handler

و این همه آن چیزی است که نیاز دارید.برای اجرای بات بنویسید :

>>> updater.start_polling()

مستندات مرتبط : telegram.ext.Updater.start_polling

امتحانش کنید ! یک گفتوگو با بات‌تون شروع کنید و start/ رو امتحان کنید.اگر همه چیز درست باشه ، بهتون جواب میده.

اما بات ما فعلا فقط به دستور start/ جواب میده.بزارید یه handler دیگه برای پیام های معمولی اضافه کنیم.با استفاده از MessageHandler ، یک ساب کلاس دیگه از کلاس Handler برای اکو کردن همه پیام ها.

>>> 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)

مستندات مرتبط : telegram.ext.MessageHandler

از این به بعد ، بات شما باید همه پیام های غیر دستوری که دریافت میکنه رو اکو کنه.

نکته : همزمان با اضافه کردن Handler های جدید به dispatcher ، اونا فعال میشن.

نکته : کلاس Filters شامل تعدادی تابع برای فیلتر کردن پیام های ورودی برای متن ، عکس ، بروزرسانی های وضعیت و ... است.هر پیامی که حداقل برای یکی از فیلتر های ارسال شده به MessageHandler ، مقدار True برگردونه ، پذیرفته میشه و تابع بازخوانی اش صدا زده میشه.حتی میتونید فیلتر هایی برای خودتون درست کنید. اطلاعات بیشتر در Advanced Filters.

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