ساخت ربات تلگرام با استفاده از پایتون
حتما تا بحال در محیط تلگرام با یک ربات صحبت کردهاید. امروزه رباتهای زیادی در تلگرام برای هدفهای مختلف و کارهای متفاوتی وجود دارد. کاربران به سادگی با آنها ارتباط برقرار کرده و نیازهایشان را برطرف میکنند. شما به ربات درخواستی را ارسال میکنید و ربات به شما جوابی را برمیگرداند؛ به همین سادگی. اما آیا واقعا این عملیات به این سادگی انجام میشود؟ یک ربات چگونه میتواند به نیازهای ما پاسخ دهد؟ در این بخش قصد داریم یک ربات ساده بسازیم. این ربات پیامی را از کاربران تلگرام دریافت کرده، آنها را درون یک پایگاه داده ذخیره میکند و به آنها پاسخی برمیگرداند.
کارهای اولیه
برای ساخت یک ربات، ابتدا باید به BotFather پیام دهید. همانطور که از نام آن مشخص است، به نوعی این ربات، پدر تمام رباتهای تلگرام است. حال باید دستورات زیر را برای این ربات ارسال کنید تا ربات مورد نظر شما ساخته شود.
* متن پایین به صورت مکالمه نوشته شده است. پیام شما You و پاسخ ربات BotFather میباشد.
You: /newbot BotFather: Alright, a new bot. How are we going to call it? Please choose a name for your bot. You: Zero to Hero Bot BotFather: Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot. You: zerotoherobot BotFather: Done! Congratulations on your new bot. You will find it at telegram.me/zerotoherobot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this. Use this token to access the HTTP API: 123456789:AaBbCcDdEeFfGgHh-ZzYyXxWwVvUu For a description of the Bot API, see this page: https://core.telegram.org/bots/api
با ارسال دستور newbot درخواست ایجاد یک ربات را ارسال کرده و پس از آن نام ربات را Zero to Hero Bot قرار دادیم. سپس نام کاربری zerotoherobot را به ربات خود اختصاص داده که BotFather در پاسخ آدرس ربات و یک توکن API برای ما ارسال میکند. حال با استفاده از این توکن میتوانیم یک برنامه نوشته و ربات خود را کنترل نماییم.
میتوان با ارسال دستور /help برای BotFather سایر دستورات را مشاهده نمود. شما میتوانید برای ربات خود دستوراتی تعریف کرده، توضیحاتی به آن اضافه کنید و یا عکسی برای آن قرار دهید.
نوشتن برنامهی ربات
- توجه کنید در این آموزش از پایتون ۲ استفاده شده است.
برای ساخت یک ربات با استفاده از پایتون، به کتابخانهی python-telegram-bot نیاز داریم. پس به کمک pip این کتابخانه را نصب میکنیم.
pip install python-telegram-bot
شما میتوانید تمام submodule های این کتابخانه را در اینجا مشاهده کنید. ما در اینجا از ماژول telegram.ext در برنامهی خود استفاده میکنیم. این ماژول شامل کلاسهایی است که به ما در دریافت دستورات وارد شدهی کاربر و خواندن پیامهایش کمک میکند. کلاس Updater در این ماژول به صورت مداوم پیامهای تلگرام را برای ربات بروز کرده و آنها را برای کلاسی دیگر بنام Dispatcher ارسال میکند. با ساخت یک شئ از کلاس Updater، بطور خودکار یک Dispatcher ایجاد شده و به یکدیگر لینک میشوند. پس از آن میتوانیم پیامهای دریافتی را مدیریت کرده و درون یک تابع، عملیات دلخواه خود را بر روی این پیامهای دریافتی انجام دهیم. این کار با کمک کلاس Handler در این ماژول صورت میگیرد (در ادامه این مراحل را پیاده سازی مینماییم).
حال به برنامه نویسی ربات خود میپردازیم. در ابتدا کتابخانههای مورد نیاز را فراخوانی میکنیم.
import sqlite3 from telegram.ext import Updater from telegram.ext import CommandHandler from telegram.ext import MessageHandler, Filters from datetime import datetime
همانطور که گفته بودیم، قصد داریم پیامهای دریافتی را درون یک پایگاه داده ذخیره کنیم. پس لازم است کتابخانهی sqlite3 را فراخوانی نماییم تا بتوان از پایگاه داده sqlite استفاده نمود. حال لازم است از توکن خود در برنامه برای کنترل ربات استفاده کنیم.
updater = Updater(token='123456789:AaBbCcDdEeFfGgHh-ZzYyXxWwVvUu') dispatcher = updater.dispatcher
همانطور که مشاهده میکنید یک dispatcher تعریف کرده تا بتوانیم راحتتر به شئ updater دسترسی داشته باشیم. درادامه یک تابع نوشته تا در صورتی که دستور start را دریافت نمود، متنی را به کاربر نمایش دهد.
def start(bot, update): bot.sendMessage(chat_id=update.message.chat_id, text="Welcome to 'Zero to Hero' Bot") start_handler = CommandHandler('start', start) dispatcher.add_handler(start_handler)
همانطور که مشخص است، این تابع یک پیام را به کاربری که دستور را از او دریافت نمود ارسال میکند. از آنجا که قصد داریم هر زمان که دستور start دریافت شد این تابع (تابع start) اجرا شود، از کلاس CommandHandler به منظور مدیریت دستورات استفاده کرده و آن را به dispatcher اضافه نمودیم.
تا به اینجا ربات ما قادر به دریافت دستور start و نمایش یک پیام به کاربر است. اگر بخواهیم این ربات یک متن از کاربر دریافت کند باید چه کرد؟ به این منظور لازم است یک تابع دیگر برای مدیریت پیامهای دریافتی تعریف نماییم.
def getCm(bot, update): bot.sendMessage(chat_id=update.message.chat_id, text="Thanks. Our channel address: telegram.me/zerotoheroir") userInfo = update.message.chat userMessage = update.message.text userId = userInfo['id'] userName = userInfo['username'] cn = sqlite3.connect("zthdb.sqlite") cn.execute("PRAGMA ENCODING = 'utf8';") cn.text_factory = str cn.execute("CREATE TABLE IF NOT EXISTS user_comment(u_id MEDIUMINT, u_name VARCHAR(50), u_comment TEXT, u_time DATETIME);") cn.execute("INSERT INTO user_comment VALUES (?, ?, ?, ?,);", (userId, userName, userMessage, datetime.now())) cn.commit() cn.close() cm_handler = MessageHandler([Filters.text], getCm) dispatcher.add_handler(cm_handler)
در این تابع ابتدا به کمک شئ update نام و ID کاربر و سپس پیام او را دریافت کردیم. سپس با پایگاه داده sqlite ارتباط برقرار کرده و این مشخصات کاربر را همراه با زمان ارسال پیام درون جدولی بنام user_comment ذخیره نمودیم. قصد داریم هر زمان که پیامی دریافت شد، این تابع (تابع getCm) نیز اجرا شود. پس آن را به کمک کلاس MessageHandler به dispatcher اضافه میکنیم.
حال تنها کافی است دستور زیر را در انتهای برنامه وارد نماییم تا ربات ما شروع به کار کند.
updater.start_polling() updater.idle() updater.stop()
کلاس Updater برای هر کاربر بصورت جداگانه اجرا میشود. اما اگر بخواهیم برنامه را در حین اجرا متوقف نماییم، لازم است از updater.idle() و updater.stop() به منظور متوقف نمودن اجرای برنامه استفاده نماییم.
با اجرای این برنامه، ربات شما شروع به کار کرده و میتواند به پیامهای دریافت شده از سوی کاربران پاسخ دهد.
ماژول telegram کلاسهای متنوع و مختلفی به منظور مدیریت انواع پیامها در اختیار شما قرار داده است که با استفاده از آنها میتوانید رباتهایی با قابلیتهای گوناگون بسازید.
شما همچنین کد کامل این ربات را میتوانید از اینجا دریافت نمایید.
مطالب زیر را حتما مطالعه کنید
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
آشنایی با رشته در پایتون
برنامه نویسی چند نخی در پایتون
تولید اعداد Random با Python
26 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام ببخشید دلیل این ارور چیه که بعد از اجرا این کد میاد برام؟
UserWarning: Using a list of filters in MessageHandler is getting deprecated, please use bitwise operators (& and |) instead. More info: https://git.io/vPTbc.
warnings.warn(‘Using a list of filters in MessageHandler is getting ‘
سلام دوست عزیز.
این خطا نیست در واقع warning هست. ربات شما باید بدون مشکل اجرا بشه.
سلام
میشه ی اموزش بزارین یا حداقل بگین رباتی که با پایتون طراحی کردیم رو چطور باید به سرور وصل کرد؟؟
طوری که وقتی برنامه پایتون رو بستیم ربات به کارش ادامه بده
سلام.
شاید استفاده از هاستهای رایگانی که از پایتون پشتیبانی میکنن بتونه برای بازهی زمانی کوتاهی بهتون کمک کنه.
سلام من با دستور command handeler مشکل دارم که جز کتابخونه telegram.ext قبولش نمی کنه ( نمشناسته )در پایتون ٣.۶ لطفا راهنمایی کنید، ممنونم
سلام.
شاید دستور رو اشتباه تایپ کردید. به صورت CommandHandler نوشته میشه.
با سلام … من پایتون تلگرام بات را نصب میکنم ولی زمانی که ماژول تلگرام را امپورت میکنم به مشکل برمیخورم … لطفا راهنمایی کنید
سلام.
لطفا با استفاده از ابزار pip این کتابخونه رو نصب کنید.
ببخشید و ممنون از مقاله ی خوبتون اما چند تا سوال داشتم خواهش می کنم جواب بدید
۱.چطوری میشه فیلتر درست کرد
۲.چطوری میشه کیبورد درست کرد
۳.چطوری میشه مثلا یک عدد از کاربر ربات گرفت یا مثلا اسم کاربر را
سلام.
برای درست کردن فیلتر میتونید متد Filters رو از کتابخونهی telegram.ext مثل همین برنامه import کنید. برای نحوه کار با فیلتر ها هم میتونید اینجا رو ببینید.
برای ساخت کیبورد از متد ReplyKeyboardMarkup استفاده کنید.
برای دریافت مشخصات و اسم کاربر هم همین برنامه میتونه بهتون کمک کنه.
به زودی یک مقاله دیگه در مورد ساخت ربات تلگرام در سایت قرار میگیره که سعی میکنیم تمام این موارد رو پوشش میدیم.
سلام
می خواستم بدونم میشه که مثلا با دادن یک رشته ی خاص یک فانکشن اجرا بشه؟
این رو برای ایدم نیاز دارم لطقا جواب بدهید.
با تشکر
سلام.
خیلی از ربات ها در حال حاضر همچین عملیاتی رو با قرار دادن keyboard برای ربات انجام میدن و اگه شما هر کدوم از اون گزینهها رو انتخاب کنید، تابع جداگانهای اجرا میشه.
برای اطلاعات بیشتر میتونید به اینجا مراجعه کنید.
سلام من برنامه ربات رو مینویسم اما بعد از بستن پایتون ربات متوقف میشه!!!!!!چرا؟؟؟؟
سلام.
خب چون این برنامه درحال کنترل ربات شماست، برنامه تا زمانی که در حال اجرا هست میتونه کار کنه.
برای اینکه همیشه ربات شما قابلیت پاسخگویی داشته باشه، برنامتون باید همیشه در حال اجرا باشه. (برای مثال میتونید برنامه رو در یک سرور اجرا کنید)
چه طور برنامه رو روی سرور اجرا کنم میشه یکم بیشتر توضیح بدید
با سلام ممنون از آموزشی که گذاشتید
یک خواهشی داشتم اگر امکانش هست نحوه ی اضافه کردن یک دکمه رو هم بگذارید و حالا مثلا اگر بخواهیم اگر این دکمه زده شد یک تابع اجرا شود رو هم توضیح بدید ممنون میشم چون شرمنده من یکم صفر کیلومترم
ممنون و تشکر
سلام برای نوشتن دکمه هایی که توی ربات وجود داره از چه تابعی استفاده میشه یا باید چطور تابع رو تغریف کنیم؟
سلام دوست عزیز.
شما میتونید بسته به نیازتون از متدهایی مثل InlineKeyboardMarkup و یا ReplyKeyboardMarkup در برنامتون استفاده کنید.
برای اطلاعات تکمیلی میتونید به اینجا مراجعه کنید و با این متدها بیشتر آشنا بشید.
بازم سلام یه سوال دیگه برای تبدیل به پایتون ۳ باید چه تغییراتی توی کدها بدیم؟
سلام.
اگه منظورتون این برنامه هست، لازم به تغییر نیست. فقط کافیه پایتون ۳ و کتابخونهی python-telegram-bot رو براش نصب کنید و برنامه رو اجرا کنید.
اگه هم منظورتون این هست که قصد دارید کد برنامههایی که دارید رو به پایتون ۳ تغییر بدید، میتونید پایتون ۳ رو نصب کنید و از دستور زیر داخل خط فرمان سیستمتون استفاده کنید:
python C:\Python35\Tools\scripts\2to3.py your-script.py
ممکن هست این مسیر در سیستم شما متفاوت باشه.
سپاس برای تارنما و مطالبتون ک خیلی سودمندن
سلام
دستورات تعیین شده رو نمیخونه
مثلا /dar گذاشتم
جالبه تو دستورات شرطی else گذاشتم ولی بازم نمی خوندش و جزو else هم نیست؟؟؟؟؟؟؟
سلام. برای هر دستور باید تابع جداگانه مثل تابع start تعریف کنید. سپس از کلاس CommandHandler برای اون دستور استفاده کنید.
الان من با else و if نوشتم جواب میده ولی دستوراتی از قبل تو ربات تعیین شده و با / شروع میشن رو نمیخونه
def start(bot, update):
bot.sendMessage(chat_id=update.message.chat_id, text=”\nربات دستیار\nنوشته شده به زبان قدرتمند\پایتون”)
start_handler = CommandHandler(‘start’, start)
dispatcher.add_handler(start_handler)
result = ‘ربات دستیار’
def get_req(bot, update):
userInfo = update.message.chat
userMessage = update.message.text
userId = userInfo[‘id’]
userName = userInfo[‘username’]
if userMessage==’سلام’:
result = ‘سلام عزیز’
else:
result = ‘jjjjjj’
print(‘—————————–‘)
bot.sendMessage(chat_id=update.message.chat_id, text=result)
ممنون بابت مقالتون