ساخت یک چت بات (Chatbot) با تلگرام و پایتون (بخش اول) — از صفر تا صد
تلگرام یک اپلیکیشن پیامرسانی موبایل و دسکتاپ است. یکی از بهترین امکانات تلگرام رباتهای آن هستند. هر کس میتواند رباتهای خاص خود را در تلگرام ایجاد کند.
در این راهنما یک چت بات با استفاده از پایتون میسازیم که در زمان آغاز به کار، خوشامدگویی میکند و همچنین دستورهایی برای تبدیل پیامها به حالت حروف بزرگ و بازگشت دادن آن به کاربر در خود دارد. ما چتبات خود را روی پلتفرم ابری Heroku توزیع میکنیم.
ربات چیست؟
رباتها در تلگرام یک کاربر خودکار هستند که میتوانند برخی وظایف خاص را اجرا کنند. برای نمونه بات میتواند بهترین قیمت یک محصول را از وبسایتهای فروشگاهی دریافت کند. اگر چنین رباتی وجود نداشته باشد، مجبور هستیم تک تک به همه فروشگاههای آنلاین سر بزنیم و محصول را انتخاب کرده و با وارد کردن کوئری جستجو نتیجه را دریافت کنیم. اگر از ربات به این منظور استفاده بکنیم، صرفاً نام محصول را به ربات میدهیم و ربات نتیجه را به ما بازمیگرداند. این وضعیت باعث سرعت و سهولت زیادی میشود.
تنظیمات اولیه
پیش از آن که اقدام به ساختن ربات خود بکنیم، باید یک حساب کاربری در تلگرام ایجاد بکنیم. به این منظور بهتر است از کلاینت وب تلگرام استفاده کنید، چون بدین ترتیب میتوانید به سرعت و در مرورگر کار خود را آغاز کنید.
اپلیکیشن تلگرام را باز کنید، به دنبال کاربری به نام BotFather@ بگردید و گفتگوی خود را آغاز کنید. در ادامه عبارت newbot/ را در این گفتگو وارد کنید. این کاربر از شما میخواهد که نام و نام کاربری ربات خود را وارد کنید. پس از وارد کردن این مقادیر، موارد زیر را دریافت میکنید:
- توکن دسترسی
- لینک به مستندات رباتهای تلگرام (+)
اگر به مستندات رباتهای تلگرام مراجعه کنید، میبینید که URL مورد نیاز برای API ربات ما به صورت https://api.telegram.org/bot<token>/METHOD_NAME است که به جای <token> باید توکن خود را وارد کنید. ما از این آدرس برای گفتگو با ربات خود استفاده خواهیم کرد. اینک تلاش میکنیم پاسخی از این URL دریافت کنیم. آدرس فوق را با جایگذاری توکن دسترسی خودتان به جای <token> و قرار دادن نام متد getMe به جای METHOD_NAME به نوار آدرس مرورگر وب کپی کنید تا جزئیات رباتی که ایجاد کردهاید را دریافت کنید. در این صورت رشته JSON زیر را در پاسخ دریافت خواهید کرد:
1{
2 "ok": true,
3 "result": {
4 "id": YOUR_BOT_ID,
5 "is_bot": true,
6 "first_name": "YOUR_BOT_NAME",
7 "username": "YOUR_BOT_USERNAME"
8 }
9}
اینک مراحل راهاندازی بات تلگرام پایان یافته است. در مرحله بعدی کتابخانه python-telegram-bot را نصب میکنیم:
pip install python-telegram-bot
کتابخانه python-telegram-bot یک رابط خالص پایتون برای API ربات تلگرام ارائه میکند. این کتابخانه برخی انتزاعها دارد که فرایند توسعه رباتهای تلگرام را ساده و سرراستتر میسازد. این کتابخانه وظیفه ارسال پیام به URL ربات تلگراممان را بر عهده میگیرد و پاسخها را از آن URL دریافت میکند.
بدین ترتیب مراحل راهاندازی اولیه پایان یافته محسوب میشود.
کدنویسی چت بات
کتابخانه python-telegram-bot یک ماژول فرعی به نام telegram.ext دارد که از آن برای کدنویسی ربات خود استفاده خواهیم کرد. ماژول telegram.ext چندین کلاس در خود دارد؛ ولی ما در مثال خود از کلاسهای Updater و Dispatcher ،CommandHandler ،MessageHandler و Filters استفاده خواهیم کرد.
هدف از کلاس Updater بازیابی بهروزرسانیهای صورت گرفته از سمت تلگرام و ارائه آن به dispatcher است. dispatcher دستگیرههایی (handler) دارد که بسته به این که بهروزرسانی وارده یک دستور یا پیام معمولی باشد به آن واکنش نشان میدهند.
ابتدا باید یک شیء Updater ایجاد کنیم و مقدار TOKEN را با توکن ربات خود عوض کنیم.
1from telegram.ext import Updater
2updater = Updater(token='TOKEN')
اینک باید شیء Updater خود را به dispatcher لینک کنیم. این کار با دستور زیر ممکن است:
1dispatcher = updater.dispatcher
اکنون باید یک تابع برای مدیریت انواع خاص بهروزرسانیها بنویسیم:
1def start(bot, update):
2 update.message.reply_text("I'm a bot, Nice to meet you!")
سپس دستگیره دستور را به آن اضافه میکنیم:
1from telegram.ext import CommandHandler
2start_handler = CommandHandler('start', start)
3dispatcher.add_handler(start_handler)
در این مرحله باید ربات را آغاز کنیم. این کار به وسیله دستور زیر میسر است:
updater.start_polling()
در این گام، اسکریپت کلی ما به صورت زیر در آمده است:
1# - *- coding: utf- 8 - *-
2from telegram.ext import Updater, CommandHandler
3
4def start(bot, update):
5 update.message.reply_text("I'm a bot, Nice to meet you!")
6
7def main():
8 # Create Updater object and attach dispatcher to it
9 updater = Updater(TOKEN)
10 dispatcher = updater.dispatcher
11 print("Bot started")
12
13 # Add command handler to dispatcher
14 start_handler = CommandHandler('start',start)
15 dispatcher.add_handler(start_handler)
16
17 # Start the bot
18 updater.start_polling()
19
20 # Run the bot until you press Ctrl-C
21 updater.idle()
22
23if __name__ == '__main__':
24main()
اکنون اسکریپت را اجرا کنید. اگر همه چیز درست باشد، ربات وقتی که دستور آغاز را با وارد کردن start/ به آن بدهید، پاسخی بازمیگرداند.
با افزودن دستگیرههای فرمان به dispatcher و نوشتن متدهایی برای مدیریت آنها، قادر خواهید بود دستورهای بیشتری را به ربات خود بیافزائید.
کدهای بیشتر
همه چیز تا به اینجا به خوبی پیش رفته است؛ اما ربات ما تاکنون تنها میتواند دستور start را مدیریت کند. اگر هر متن تصادفی دیگر یا هر دستور دیگری به آن بفرستید هیچ پاسخی از آن دریافت نخواهید کرد. بنابراین در ادامه این مشکل را با تعریف کلاس MessageHandler رفع میکنیم.
کلاس MessageHandler به مدیریت همه پیامهای غیردستوری میپردازد. این کلاس همه پیامهای غیردستوری را که دریافت کنید، به صورت پیامهای تبدیل شده به حالت حروف بزرگ بازگشت میدهد. MessageHandler را به صورت زیر به کلاس اضافه کنید:
1from telegram.ext import MessageHandler
2upper_case = MessageHandler(Filters.text, upper_case)
3dispatcher.add_handler(upper_case)
ما در این دستگیره از Filters.text برای فیلتر کردن همه پیامهای غیردستوری یعنی متنهای تصادفی استفاده میکنیم و سپس متد upper_case برای مدیریت بهروزرسانی فراخوانی میکنیم. اینک میتوانیم تابع مورد نیاز برای مدیریت پیامهای غیردستوری را به صورت زیر تعریف کنیم:
1def upper_case(bot, update):
2 update.message.reply_text(update.message.text.upper())
بنابراین اسکریپت نهایی ما به صورت زیر خواهد بود:
1# - *- coding: utf- 8 - *-
2from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
3
4def start(bot, update):
5 update.message.reply_text("I'm a bot, Nice to meet you!")
6
7def convert_uppercase(bot, update):
8 update.message.reply_text(update.message.text.upper())
9
10def main():
11 # Create Updater object and attach dispatcher to it
12 updater = Updater(TOKEN)
13 dispatcher = updater.dispatcher
14 print("Bot started")
15
16 # Add command handler to dispatcher
17 start_handler = CommandHandler('start',start)
18 upper_case = MessageHandler(Filters.text, convert_uppercase)
19 dispatcher.add_handler(start_handler)
20 dispatcher.add_handler(upper_case)
21
22 # Start the bot
23 updater.start_polling()
24
25 # Run the bot until you press Ctrl-C
26 updater.idle()
27
28if __name__ == '__main__':
29main()
اکنون یک بار دیگر اسکریپت خود را اجرا میکنیم. اگر همه چیز به درستی اجرا شده باشد، ربات در صورت دریافت پیام start اقدام به خوشامدگویی میکند و در صورتی که پیام غیردستوری دریافت کند، همان متن را به صورت حروف بزرگ بازگشت میدهد.
سخن پایانی
بدین ترتیب به پایان مراحل طراحی ربات تلگرام خود در پایتون میرسیم. شما میتوانید با مراجعه به این آدرس (+) موارد بیشتری را در مورد قابلیتها و امکانات رباتهای تلگرام بیاموزید.
ربات ما یک مشکل بزرگ دارد و آن این است که وقتی اسکریپت پایتون خود را متوقف کنیم و سپس بخواهیم با ربات خود ارتباط بگیریم، هیچ پیامی دریافت نخواهیم کرد. بدین ترتیب ما باید به نحوی همواره اسکریپت پایتون خود را در حال اجرا داشته باشیم و این کار از طریق میزبانی آن روی یک سرور ممکن است (مثلاً روی سرورهای Heroku). در بخش بعدی این مقاله روش میزبانی ربات تلگرام روی یک سرور Heroku را توضیح خواهیم داد تا بتوانید هر زمان بدون نیاز به راهاندازی مجدد اسکریپت از آن استفاده کنید.
اگر این مطلب برایتان مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزش های برنامه نویسی پایتون
- مجموعه آموزشهای برنامهنویسی
- آموزش ساخت ربات تلگرام با پایتون — از صفر تا صد
- آموزش نحوه نصب و راه اندازی پایتون
- آموزش مقدمه ای در رابطه با یادگیری ماشین با پایتون (Python)
- آموزش مهم ترین دستورهای زبان پایتون
==
سلام من وارد پروفایل شخصی در تلگرام شدم که لینک یک چت ربات ناشناس بود وقتی روی لینککلیک کردم و استارت رو زدم پیام امد که شما اکنون در حال چت با شخص مورد نظر هستید البته من از بات خارج شدم و دیلیت چت کردم ،ایا واقعا پیام من برای ایشون ارسال شده ؟و اینکه می توانند متوجه بشوند که چه کسی پیام ارسال کرده؟
سلام می خواستم بدونم این چت ربات های هوش مصنوهی مثل cleverbot و replika و simsimi و دیگر ربات های آنلاینی که آدم می تونی باهاشون صحبت کنه چطور ساخته می شن؟
یعنی اگه بخوام چنین رباتی رو بسازم باید چه مراحلی رو طی کنم؟
آیا میشه یه ربات خیلی ساده و کوچولو موچولو برای خودم طراحی کنم؟
لطفا مقدمات یادگیریش رو بفرمایید. خیلی ممنونم.
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
فناوری اصلی که در چتباتها به کار گرفته میشود، پردازش زبان طبیعی (NLP) و یادگیری ماشین (ماشین لرنینگ) است. وقتی که سوالی از چتبات پرسیده میشود، مجموعهای از الگوریتمهای پیچیده ورودی دریافتی را پردازش میکنند، آنچه پرسیده شده درک میشود و بر اساس آن، پاسخ مناسب برای آن سوال مشخص خواهد شد.
چتباتها انواع مختلفی دارند که به طور کلی شامل ۲ دسته «چتباتهای مبتنی بر قانون» (Rule-based) و «چتباتهای مبتنی بر یادگیری ماشین» میشوند.
پلتفرمهایی که با استفاده از آنها چتباتها را توسعه میدهند شامل پلتفرم واتسون شرکت IBM، پلتفرم Azure Bot Service شرکت مایکروسافت، QnA Maker، پلتفرم Semantic Machines، پلتفرم Recast.ai و سایر موارد میشود. همچنین پلتفرمهایی هم برای استقرار چتباتها وجود دارند. تفاوت این دو نوع پلتفرم این است که پلتفرمهای انتشار یا Publishing Platforms محیطهایی هستند که میتوان در آنها با بات تعامل داشت. پس از توسعه و ساخت چتبات باید آن را در یک پلتفرم استقراری جای داد. از جمله این پلتفرمها میتوان به مسنجر فیسبوک، اسلک، اسکایپ سازمانی، Facebook Workplace و سایر موارد اشاره کرد.
مطلب دیگری هم در این راستا پیشتر در مجله فرادرس منتشر شده است که مطالعه آن هم میتواند مفید واقع شود:
برای شما آرزوی سلامتی و موفقیت داریم.
عالی بود ممنونم
سلام من پس از اجرای ربات خطای Connection to api.telegram.org timed out. (connect timeout=5.0)’)) رو دریافت میکنم ممنون میشم برای رفعش راهنماییم کنید
علتش چیه که وقتی به بات استارت مینویسم اورور میده:
AttributeError: ‘CallbackContext’ object has no attribute ‘message’
ممنون میشم راهنماییم کنین
سلام واسه من main() ارور میده و ارورش invalid syntax هستش اگه میشه توضیح بدید مشکلش چیه + راه حلش
به اول main دو تا space بذار
سلام . دستور pip install python-telegram-bot کجا اجرا کنیم ؟
ممنون میشم راهنمایی کنید.
در محیط cmd