ساخت ربات تلگرامی با پایتون ( صفر تا صد)
اگر تا حالا فکر کردهاید که ساختن یک ربات تلگرامی کار پیچیدهای است که فقط از عهده برنامهنویسهای حرفهای برمیآید، این مطلب همان چیزی است که لازم دارید. قرار است یک ربات ساده اما واقعی بسازیم؛ رباتی که به پیامها جواب میدهد، دکمه نشان میدهد و روی یک سرویس رایگان آنلاین میماند. نیازی به دانش قبلی زیاد نیست، فقط کافی است پایتون را در حد مقدماتی بشناسید.
ربات تلگرام دقیقاً چطور کار میکند؟
هر ربات تلگرامی در واقع یک برنامه است که به سرورهای تلگرام وصل میشود و از طریق یک رابط به اسم Bot API پیامها را میفرستد و دریافت میکند. دو راه برای دریافت پیامها وجود دارد: Polling که برنامه شما هر چند ثانیه یک بار از تلگرام میپرسد «پیام جدیدی هست؟» و Webhook که تلگرام خودش هر وقت پیامی رسید، آن را به آدرس سرور شما میفرستد. برای شروع و برای پروژههای کوچک، Polling راحتتر است چون نیازی به آدرس عمومی ندارد.
مرحله ۱: ساخت ربات در باتفادر
اول باید یک توکن بگیرید. توکن همان کلید دسترسی ربات شماست.
- در تلگرام دنبال حساب
@BotFatherبگردید و آن را باز کنید. - دستور
/newbotرا بفرستید. - یک اسم نمایشی برای ربات انتخاب کنید، مثلاً «دستیار فروشگاه».
- یک یوزرنیم منحصربهفرد بدهید که حتماً باید به
botختم شود، مثلmy_shop_helper_bot. - باتفادر یک رشته طولانی به شما میدهد شبیه
123456789:AAHk3jsdf...— این را جایی امن نگه دارید و برای هیچکس نفرستید.
مرحله ۲: آماده کردن محیط پایتون
یک پوشه جدید بسازید و در همان پوشه، محیط مجازی راه بیندازید:
mkdir telegram-bot
cd telegram-bot
python -m venv venv
venv\Scripts\activate # ویندوز
source venv/bin/activate # مک یا لینوکس
pip install python-telegram-bot --upgrade
کتابخانه python-telegram-bot یکی از پرکاربردترین کتابخانهها برای این کار است و مستندات خوبی هم دارد.
مرحله ۳: نوشتن اولین کد ربات
یک فایل به اسم bot.py بسازید و این را داخلش بنویسید:
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes
TOKEN = "اینجا توکن خودتان را بگذارید"
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("سلام! من آمادهام. هر پیامی بفرستی همون رو برمیگردونم.")
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(update.message.text)
app = ApplicationBuilder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
app.run_polling()
حالا در ترمینال بنویسید python bot.py. اگر خطایی نگرفتید، به تلگرام بروید، ربات خودتان را پیدا کنید و دستور /start را بزنید. باید جواب بدهد.
اضافه کردن دکمه و منو
یک ربات ساده که فقط اکو میکند خیلی به کار نمیآید. بیایید یک منوی دکمهای اضافه کنیم:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
async def menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [
[InlineKeyboardButton("قیمتها", callback_data="prices")],
[InlineKeyboardButton("تماس با ما", callback_data="contact")],
]
await update.message.reply_text("یکی رو انتخاب کن:", reply_markup=InlineKeyboardMarkup(keyboard))
async def button_click(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
if query.data == "prices":
await query.edit_message_text("پلن پایه ۵۰ هزار تومان، پلن حرفهای ۱۲۰ هزار تومان.")
elif query.data == "contact":
await query.edit_message_text("شماره تماس: ۰۹۱۲xxxxxxx")
و در پایین کد اصلی، این دو خط را هم اضافه کنید:
from telegram.ext import CallbackQueryHandler
app.add_handler(CommandHandler("menu", menu))
app.add_handler(CallbackQueryHandler(button_click))
ذخیره اطلاعات کاربران با پایگاه داده ساده
برای پروژههای کوچک نیازی به دیتابیس سنگین نیست. کتابخانه sqlite3 که همراه پایتون میآید کافی است:
import sqlite3
conn = sqlite3.connect("users.db")
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (chat_id INTEGER PRIMARY KEY, name TEXT)")
conn.commit()
async def start(update, context):
cursor.execute("INSERT OR IGNORE INTO users VALUES (?, ?)",
(update.effective_chat.id, update.effective_user.first_name))
conn.commit()
await update.message.reply_text("ثبت شدی، خوش اومدی!")
میزبانی رایگان ربات تا ۲۴ ساعته روشن باشد
اجرای ربات روی لپتاپ شخصی مشکل بزرگی دارد: تا کامپیوتر روشن باشد ربات کار میکند، همین. برای اینکه ربات همیشه فعال بماند چند گزینه رایگان یا ارزان وجود دارد:
Railway
حساب بسازید، ریپازیتوری گیتهاب پروژه را وصل کنید، و Railway خودش پایتون را تشخیص میدهد و اجرا میکند. یک فایل به اسم requirements.txt با محتوای python-telegram-bot در پوشه پروژه لازم دارید تا نصب پکیجها خودکار انجام شود.
PythonAnywhere
پلن رایگان دارد و برای اسکریپتهای ساده خوب کار میکند، ولی برای Polling دائمی محدودیت زمان اجرا دارد؛ برای آزمایش و یادگیری کافی است.
سرور مجازی ارزان + systemd
اگر ربات قرار است جدی بماند، یک VPS ارزان بگیرید و ربات را با systemd بهعنوان سرویس پسزمینه اجرا کنید تا با ریاستارت سرور هم خودش دوباره بالا بیاید.
چند اشتباه رایج که تازهکارها میکنند
- توکن را مستقیم داخل کد مینویسند و بعد آن را روی گیتهاب پابلیک آپلود میکنند. توکن باید در متغیر محیطی یا فایل جدا نگه داشته شود.
- یک نمونه از ربات را همزمان روی لپتاپ و روی سرور اجرا میکنند؛ تلگرام فقط یک اتصال Polling را قبول میکند و دومی خطا میدهد.
- فراموش میکنند خطاها را مدیریت کنند و با اولین پیام عجیب، ربات کرش میکند.
قدم بعدی چیست؟
وقتی این نسخه ساده کار کرد، میتوانید سراغ چیزهای جذابتر بروید: اتصال ربات به یک API خارجی، ساخت فروشگاه داخل تلگرام با پرداخت، یا افزودن هوش مصنوعی برای پاسخدهی خودکار به سوالات کاربران. هر کدام از اینها را میتوان روی همین اسکلت اولیه اضافه کرد، بدون اینکه لازم باشد از اول شروع کنید.