Skip to main content

ساختن ربات تلگرام با پایتون: آموزش گام به گام

ربات های تلگرام به سادگی می توانند پیچیده ترین قابلیت ها را برای کاربران خود فرآهم کنند. از دانلود ویدیو از یوتیوب و دانلود استوری اینستاگرام گرفته تا بسیاری از کارهایی که تخصصی تر هستند. در مقایسه با سایر پیام رسان ها مانند واتساپ ، این ربات‌ها رابط کاربری بسیار ساده‌ای دارند چراکه فقط لازم است کاربر با آن‌ها گفتگو کند، و ربات های تلگرام هرکاری را که برای آن برنامه نویسی شده باشد می توانند به سادگی انجام دهند.

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

امروزه، ربات های تلگرام در بسیاری از موضوعات استفاده می‌شوند، از کارهای ساده مثل نمایش داده‌های مربوط به زمان و آب‌وهوا گرفته تا عملیات‌های پیچیده‌تر همچون تشخیص اولیه پزشکی و ارتباط با مشتریان. می‌توانید ربات تلگرام ایجاد کنید که هنگامی که مشتریان درباره محصول‌تان سؤال‌های خاصی می‌کنند به آن‌ها کمک کند، یا می‌توانید ربات کمکی شخصی‌ای بسازید که بتواند کارهای اولیه را انجام دهد و به شما یادآوری کند که کِی باید به جلسه یا باشگاه بروید.

وقتی که سخن از راه‌اندازی ربات تلگرام به میان می‌آید گزینه‌های زیادی پیش روی ماست، البته که یکی از ساده ترین و بهترین روش های ساخت ربات تلگرام سون بات است. اما در این آموزش هم قصد داریم شیوه برنامه نویسی ربات تلگرام با پایتون را برای علاقه مندان آموزش دهیم.

این روزها تلگرام یکی از محبوب‌ترین پلتفرم‌های پیام‌رسان است، چون به شما امکان می‌دهد پیام‌ها را به جای دستگاه خودتان در فضای ابری ذخیره کنید و از سیستم عامل‌های مختلف پشتیبانی مطلوبی می‌کند، چون تلگرام را در اندروید، iOS، ویندوز و تقریباً هر پلتفرم دیگری که از نسخه وب پشتیبانی کند می‌توان نصب کرد. ساختن ربات در تلگرام نسبتاً ساده است و فقط به چند مرحله نیاز دارد که در زمان بسیار کمی انجام می‌شود. ربات تلگرام را می‌توان در گروه‌ها و کانال‌های تلگرام ادغام کرد یا از آن به طور مستقل استفاده کرد.

در این آموزش، برای تلگرام رباتی می‌سازیم که می‌تواند از سایت Adorable Avatars تصاویر آواتار را برای پروفایل‌تان دریافت و ایجاد کند. در مثالی که ارائه خواهیم داد با استفاده از کتابخانه Flask در پایتون رباتی می‌سازیم و آن را در سرور رایگان Heroku راه‌اندازی می‌کنیم.

برای این‌که این آموزش را برای خودتان انجام دهید، لازم است روی سیستم‌تان پایتون 3 را نصب کرده باشید و با مهارت‌های کدنویسی پایتون آشنا باشید. همچنین، برخورداری از درک خوبی درباره نحوه عملکرد اپلیکیشن‌ها هم می‌تواند امتیاز مضاعفی به شمار رود ولی ضروری نیست، چراکه بیشتر مواردی را که ارائه می‌کنیم به‌تفصیل شرح خواهیم داد. همچنین باید Git را روی سیستم خود نصب کرده باشید.

در ضمن، برای این آموزش باید در تلگرام حساب کاربری هم داشته باشید که البته رایگان است. از طریق این لینک می‌توانید ثبت‌نام کنید. داشتن حساب کاربری در Heroku هم لازم است و می‌توانید رایگان آن را در این‌جا برای خود بسازید.

چطور ربات تلگرام بسازیم

همانطور که در مقاله ساخت ربات تلگرام با PHP در یک مقاله جداگانه بصورت کامل توضیح داده ایم. برای ساختن ربات در تلگرام، باید به ربات BotFather پیام فرستاد، که در واقع رباتی است برای ساختن ربات‌های دیگر. دستوری که باید بنویسید /start  است که برای ایجاد رباتی که مورد نظرتان است به مراحل زیر منجر می‌شود:

ساختن ربات در Botfather
ساختن ربات در Botfather

ربات باید دو ویژگی داشته باشد: نام و نام کاربری. از نام برای نام‌گذاری ربات استفاده می‌شود، و نام کاربری برای مِنشن کردن و اشتراک‌گذاری به کار می‌رود.

پس از انتخاب نام و نام کاربری ربات – که باید به عبارت «bot» ختم شود – پیامی حاوی مجوز دسترسی دریافت خواهید کرد، و بدیهی است که باید مجوز دسترسی و نام کاربری خود را برای استفاده‌های بعدی ذخیره کنید، چون به آن‌ها نیاز خواهید داشت.

کدنویسی ربات تلگرام

در این آموزش از سیستم عامل لینوکس توزیع Ubuntu استفاده خواهیم کرد. برای کاربران ویندوز، اکثر دستوراتی که این‌جا گفته می‌شوند بدون هیچ مشکلی کار می‌کنند، ولی اگر در استفاده از این نرم‌افزار با مشکل مواجه شدید، لطفاً از این لینک کمک بگیرید. کاربران سیستم عامل mac می‌توانند از این آموزش بی هیچ مشکلی استفاده کنند.

ابتدا بیایید یک محیط مجازی ایجاد کنیم. با این کار می‌توانید ملزومات پروژه خود را از محیط کلی پایتون تفکیک کنید.

python -m venv botenv/

حالا یک دایرکتوری botenv/  خواهیم داشت که شامل تمام کتابخانه‌هایی از پایتون است که از آن‌ها استفاده خواهیم کرد. در ادامه، virtualenv را با استفاده از دستور زیر فعال کنید:

source botenv/bin/activate

ربات‌مان به آن‌ها نیاز داریم عبارتند از:

  • Flask: فریمورک محبوب که برای پایتون ساخته شده است.
  • Python-telegram-bot: پکیج برای پایتون مخصوص ربات های تلگرام است.
  • Requests: کتابخانه http پرکاربردی در پایتون.

با استفاده از دستور pip می‌توانید آن‌ها را در محیط مجازی مورد نظرتان به صورت زیر نصب کنید:

pip install flask
pip install python-telegram-bot
pip install requests

حالا بیایید دایرکتوری پروژه‌مان را مرور کنیم.

.
├── app.py
├── telebot
│   ├── credentials.py
│   |   .
│   |   you can build your engine here
│   |   .
│   └── __init__.py
└── botenv

در فایل   credentials.py به سه متغیر نیاز داریم:

bot_token = "here goes your access token from BotFather"
bot_user_name = "the username you entered"
URL = "the heroku app link that we will create later"

حالا بیایید به app.py خودمان برگردیم و کُد را گام‌به‌گام بررسی کنیم:

# import everything
from flask import Flask, request
import telegram
from telebot.credentials import bot_token, bot_user_name,URL
global bot
global TOKEN
TOKEN = bot_token
bot = telegram.Bot(token=TOKEN)

اکنون ربات شیئی را در اختیار داریم که برای هر عملی که انتظار داریم ربات انجام دهد می‌توان از آن استفاده کرد.

# start the flask app
app = Flask(__name__)

همچنین باید توابع را به مسیرهای مخصوص‌شان وصل کنیم. به عبارت دیگر، باید به کتابخانه Flask بگوییم موقعی که آدرس خاصی فراخوانده می‌شود چه کاری باید انجام دهد. اطلاعات دقیق‌تر درباره Flask و مسیرها را می‌توان در این لینک یافت.

در این مثال، تابع مسیر به یک آدرس وب پاسخ می‌دهد که اساساً /{token} همان  است، و این همان آدرس وبی است که تلگرام آن را فرامی‌خواند تا پاسخ پیام‌های ارسال‌شده به ربات را دریافت کند.

@app.route('/{}'.format(TOKEN), methods=['POST'])
def respond():
   # retrieve the message in JSON and then transform it to Telegram object
   update = telegram.Update.de_json(request.get_json(force=True), bot)

   chat_id = update.message.chat.id
   msg_id = update.message.message_id

   # Telegram understands UTF-8, so encode text for unicode compatibility
   text = update.message.text.encode('utf-8').decode()
   # for debugging purposes only
   print("got text message :", text)
   # the first time you chat with the bot AKA the welcoming message
   if text == "/start":
       # print the welcoming message
       bot_welcome = """
       Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name.
       """
       # send the welcoming message
       bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id)


   else:
       try:
           # clear the message we got from any non alphabets
           text = re.sub(r"\W", "_", text)
           # create the api link for the avatar based on http://avatars.adorable.io/
           url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip())
           # reply with a photo to the name the user sent,
           # note that you can send photos by url and telegram will fetch it for you
           bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id)
       except Exception:
           # if things went wrong
           bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id)

   return 'ok'

روش شهودی برای فعال کردن این تابع آن است که بتوان در هر لحظه‌ای آن را فراخواند تا بررسی کند که آیا پیام جدیدی دریافت شده یا خیر؛ ولی ما به این صورت عمل نمی‌کنیم. در عوض، از Webhook استفاده خواهیم کرد که به ما امکان می‌دهد به ربات اجازه دهیم هر زمان که پیامی دریافت می‌شود به سرورمان متصل شود، به طوری‌که دیگر لازم نخواهد بود سرور بی‌جهت مدتی طولانی منتظر بماند تا پیامی دریافت شود.

بنابراین، تابعی خواهیم ساخت که لازم است خودمان آن را فرابخوانیم تا Webhook مربوط به تلگرام را فعال کند، و در واقع به تلگرام بگوید که با رسیدن پیام جدید، لینک مشخصی را فرابخواند. ما این تابع را فقط یک بار فرا خواهیم خواند، یعنی موقعی که برای اولین بار ربات را می‌سازیم. اگر لینک اپلیکیشن را تغییر دهید، لازم خواهد بود که این تابع را از نو با لینک جدیدی که مورد نظرتان است اجرا کنید.

مسیری که این‌جا ارائه می‌کنیم می‌تواند هر چیزی باشد؛ کسی که قرار است آن را فرابخواند خود شمایید:

@app.route('/setwebhook', methods=['GET', 'POST'])
def set_webhook():
    # we use the bot object to link the bot to our app which live
    # in the link provided by URL
    s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN))
    # something to let us know things work
    if s:
        return "webhook setup ok"
    else:
        return "webhook setup failed"

حالا که همه‌چیز را تنظیم کرده‌ایم، بیایید صفحه اصلی جذابی بسازیم تا بتوانیم پی ببریم که موتور جستجو فعال هست یا نه.

@app.route('/')
def index():
    return '.'
if __name__ == '__main__':
    # note the threaded arg which allow
    # your app to have more than one thread
    app.run(threaded=True)

حالا نگاهی می‌اندازیم به نسخه کامل app.py:

import re
from flask import Flask, request
import telegram
from telebot.credentials import bot_token, bot_user_name,URL


global bot
global TOKEN
TOKEN = bot_token
bot = telegram.Bot(token=TOKEN)

app = Flask(__name__)

@app.route('/{}'.format(TOKEN), methods=['POST'])
def respond():
   # retrieve the message in JSON and then transform it to Telegram object
   update = telegram.Update.de_json(request.get_json(force=True), bot)

   chat_id = update.message.chat.id
   msg_id = update.message.message_id

   # Telegram understands UTF-8, so encode text for unicode compatibility
   text = update.message.text.encode('utf-8').decode()
   # for debugging purposes only
   print("got text message :", text)
   # the first time you chat with the bot AKA the welcoming message
   if text == "/start":
       # print the welcoming message
       bot_welcome = """
       Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name.
       """
       # send the welcoming message
       bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id)


   else:
       try:
           # clear the message we got from any non alphabets
           text = re.sub(r"\W", "_", text)
           # create the api link for the avatar based on http://avatars.adorable.io/
           url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip())
           # reply with a photo to the name the user sent,
           # note that you can send photos by url and telegram will fetch it for you
           bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id)
       except Exception:
           # if things went wrong
           bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id)

   return 'ok'

@app.route('/set_webhook', methods=['GET', 'POST'])
def set_webhook():
   s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN))
   if s:
       return "webhook setup ok"
   else:
       return "webhook setup failed"

@app.route('/')
def index():
   return '.'


if __name__ == '__main__':
   app.run(threaded=True)

این آخرین جزء کُدی است که لازم است برای این آموزش بنویسیم. حالا می‌توانیم وارد آخرین مرحله شویم و اپلیکیشن را در Heroku راه‌اندازی کنیم.

راه‌اندازی ربات تلگرام در Heroku

قبل از ساختن اپلیکیشن باید چند کار دیگر انجام دهیم.

Heroku نمی‌داند که پروژه ما از چه کتابخانه‌هایی استفاده می‌کند، بنابراین با استفاده از فایل  requirements.txt باید این موضوع را برایش مشخص کنیم – مشکلی که معمولاً رخ می‌دهد این است که املای requirements را اشتباه می‌نویسند، پس مراقب باشید – تا بتواند با استفاده از pip، فایل requirements را ایجاد کند:

pip freeze > requirements.txt

حالا فایل requirements مورد نظرمان را ساخته‌ایم.

حالا به Procfile  نیاز داریم که به Heroku بگوید اپلیکیشن ما از کجا شروع می‌شود؛ بنابراین یک فایل Procfile  ایجاد می‌کنیم و کد زیر را به آن می‌افزاییم:

web: gunicorn app:app

یک گام تسریع‌کننده: می‌توان یک فایل .gitignoreرا به پروژه اضافه کرد تا بدین ترتیب، فایل‌های نامربوط در مخزن آپلود نشوند.

از داشبورد خود در Heroku، اپلیکیشن جدیدی ایجاد می‌کنیم. پس از انجام دادن این کار، ما را به صفحه Deploy هدایت می‌کند. سپس، نوار Settings را در پنجره جدیدی باز می‌کنیم و دامنه اپلیکیشن را کپی می‌کنیم که چیزی شبیه به  https://appname.herokuapp.com/ خواهد بود، و آن را در قسمت آدرس URL در داخل   credentials.py پِیست می‌کنیم.

داشبورد Heroku
داشبورد Heroku

حالا به نوار Deploy برمی‌گردیم و مراحل را ادامه می‌دهیم:

توجه: کاربران widnows و سیستم عامل mac می‌توانند مراحلی را که در این‌جا توضیح داده شده است دنبال کنند.

در Heroku وارد حساب کاربری خود می‌شویم:

heroku login

لطفاً توجه داشته باشید که این روش گاهی در مرحله  waiting for login گیر می‌کند. اگر برای شما این اتفاق رخ داد، سعی کنید با استفاده از دستور زیر وارد شوید:

heroku login -i

یک مخزن Git را در دایرکتوری خود راه‌اندازی می‌کنیم:

$ git init
$ heroku git:remote -a {heroku-project-name}

حالا نوبت رسیده به پیاده‌سازی اپلیکیشن:

git add .
git commit -m "first commit"
git push heroku master

در این مرحله، در پایانه خود پیشرفت فرایند ساخته شدن اپلیکیشن را مشاهده خواهید کرد. اگر مشکلی پیش نیاید، چیزی خواهید دید شبیه این:

remote: -----> Launching...
remote:        Released v6
remote:        https://project-name.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.

حالا به صفحه اپلیکیشن می‌رویم (همان لینک دامنه‌ای که قبلاً کپی کردیم) و عبارت  /setwebhook را به انتهای لینک اضافه می‌کنیم. آدرس مورد نظر حالا باید چیزی شبیه  https://appname.herokuapp.com/setwebhook باشد. اگر با پیام webhook setup ok  مواجه شُدید، به معنای آن است که کار تمام است!

وقتش رسیده که با ربات‌مان حرف بزنیم

تست کردن ربات تلگرام نوشته شده با پایتون
تست کردن ربات تلگرام نوشته شده با پایتون

اصلاحات نهایی، نکات و ترفندها

حالا ربات تلگرامی ساخته و راه‌اندازی کرده‌اید که 24 ساعته و بدون نیاز به دخالت شما فعال خواهد بود. می‌توانید هر ویژگی‌ای که دوست دارید به ربات خود اضافه کنید؛ بنابراین، مثلاً می‌توانید با افزودن وضعیت «typing» و وضعیت «sending a photo» ربات واقعی‌تری بسازید، مثل آن‌چه در زیر بیان می‌کنیم:

قطعه کُد بعدی مربوط به تابع  respond() است:

   if text == "/start":
       # print the welcoming message
       bot_welcome = """
       Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name.
       """
       # send the welcoming message
       bot.sendChatAction(chat_id=chat_id, action="typing")
       sleep(1.5)
       bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id)


   else:
       try:
           # clear the message we got from any non alphabets
           text = re.sub(r"\W", "_", text)
           # create the api link for the avatar based on http://avatars.adorable.io/
           url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip())
           # reply with a photo to the name the user sent,
           # note that you can send photos by url and telegram will fetch it for you
           bot.sendChatAction(chat_id=chat_id, action="upload_photo")
           sleep(2)
           bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id)
       except Exception:
           # if things went wrong
           bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id)

همان‌طور که در این قطعه کد مشاهده می‌کنید، برای وقتی که می‌خواهیم به صورت متنی اطلاعاتی به ربات ارسال کنیم، ویژگی «typing» را اضافه کردیم، و برای هنگامی که می‌خواهیم عکسی بفرستیم، ویژگی «uploaded photo» را به آن افزودیم و بدین ترتیب ربات واقعی‌تری ساختیم. برای آموزش افزودن ویژگی‌های بیشتر، می‌توانید به این لینک مراجعه کنید.

همچنین می‌توان تصویر و توضیحات ربات را از کانال BotFather تغییر داد تا حالت کاربرپسندتری داشته باشد.

در سایت GitHub نمونه‌های ساده‌تر فراوانی از ربات‌های تلگرام را در صفحه python-telegram-bot می‌توان یافت.

می‌توانید همین رباتی را که با هم ساختیم ارتقا دهید و آن را به ربات پیشرفته‌تری با هوش مصنوعی بهتر تبدیل کنید – تنها کاری که باید انجام دهید این است که ویژگی مورد نظرتان را در تابع respond()  ادغام کنید. مثلاً، ویژگی مورد نظر شما می‌تواند در برنامه فرعی جداگانه‌ای باشد که می‌توان آن را داخل تابع respond()  فراخواند، مثل این یکی:

.
├── app.py
├── telebot
│   ├── credentials.py
│   ├──ai.py
│   |   .
│   |   you can build your engine here
│   |   .
│   └── __init__.py
└── botenv

و داخل ai.py:

def generate_smart_reply(text):
    # here we can do all our work
    return "this is a smart reply from the ai!"

حالا آن را در app.py فرامی‌خوانیم:

import re
from time import sleep
from flask import Flask, request
import telegram
From telebot.ai import generate_smart_reply
from telebot.credentials import bot_token, bot_user_name,URL

سپس، آن را فقط در داخل respond() کد  فرامی‌خوانیم.

def respond():
   # retrieve the message in JSON and then transform it to Telegram object
   update = telegram.Update.de_json(request.get_json(force=True), bot)

   chat_id = update.message.chat.id
   msg_id = update.message.message_id

   # Telegram understands UTF-8, so encode text for unicode compatibility
   text = update.message.text.encode('utf-8').decode()
   # for debugging purposes only
   print("got text message :", text)
   # here call your smart reply message
   reply = generate_smart_reply(text)
   bot.sendMessage(chat_id=chat_id, text=reply, reply_to_message_id=msg_id)

حالا رباتی دارید که می‌توانید از آن بخواهید کارها را مطابق میل شما انجام دهد – بروید و پروژه بزرگ دیگری انجام دهید!

امیدوارم از این‌که توانستید اولین ربات خود را در تلگرام بسازید لذت برده باشید.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *