فصل ۱۵: ساخت سیستم عضویت و محدودیت دسترسی در ربات تلگرام

۱. مقدمه
در بسیاری از رباتهای تلگرامی، لازم است بعضی امکانات فقط برای:
- کاربران پرداختکننده
- اعضای خاص
- ادمینها یا تیم مدیریت
در دسترس باشند.
📌 مزایا:
- حفظ منابع و جلوگیری از استفاده بیرویه.
- ایجاد پلنهای VIP و درآمدزایی.
- امنیت بیشتر (جلوگیری از سوءاستفاده).
۲. رویکردهای رایج برای محدودیت دسترسی
| روش | توضیح | مثال |
|---|---|---|
| لیست سفید (Whitelist) | فقط ID های ثبتشده مجاز هستند | ربات شرکتی |
| لیست سیاه (Blacklist) | کاربرانی که بلاک شدهاند | فیلتر اسپم |
| سطح دسترسی (Role) | هر کاربر نقش خاص دارد (ادمین، VIP، معمولی) | گروهها و رباتهای خدماتی |
| بررسی پرداخت | دسترسی بر اساس پرداخت آنلاین یا دستی | ربات فروش دورهها |
۳. پیشنیاز
- نصب:
pip install python-telegram-bot
- داشتن دیتابیس یا فایل برای ذخیره اعضا (SQLite، JSON یا حتی CSV).
۴. پیادهسازی ساده – محدودیت بر اساس لیست سفید
در این مثال فقط کاربرانی که در لیست هستند میتوانند دستور خاصی اجرا کنند.
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
TOKEN = "توکن_ربات"
# لیست کاربران مجاز
ALLOWED_USERS = {123456789, 987654321} # ID های تلگرامی
async def restricted_command(update, context):
if update.message.chat_id not in ALLOWED_USERS:
await update.message.reply_text("❌ شما مجاز به استفاده از این دستور نیستید.")
return
await update.message.reply_text("✅ شما دسترسی دارید، این داده محرمانه است!")
app = ApplicationBuilder().token(TOKEN).build()
app.add_handler(CommandHandler("secret", restricted_command))
app.run_polling()
📌 توضیح کد:
- ALLOWED_USERS → مجموعهای از ID های تلگرامی.
- اگر کاربر در لیست نبود، پیام خطا نمایش داده میشود.
۵. ساخت سیستم ثبتنام
برای اضافه یا حذف کاربر به صورت داینامیک:
ALLOWED_USERS = set()
async def register(update, context):
ALLOWED_USERS.add(update.message.chat_id)
await update.message.reply_text("✅ ثبتنام شما انجام شد.")
async def unregister(update, context):
ALLOWED_USERS.discard(update.message.chat_id)
await update.message.reply_text("🛑 شما از سیستم خارج شدید.")
app.add_handler(CommandHandler("register", register))
app.add_handler(CommandHandler("unregister", unregister))
📌 در حالت حرفهای باید این اطلاعات در دیتابیس ذخیره شود تا با ریستارت ربات پاک نشود.
۶. ذخیره در دیتابیس SQLite
import sqlite3
def init_db():
conn = sqlite3.connect("members.db")
c = conn.cursor()
c.execute("CREATE TABLE IF NOT EXISTS members (user_id INTEGER PRIMARY KEY)")
conn.commit()
conn.close()
def add_member(user_id):
conn = sqlite3.connect("members.db")
c = conn.cursor()
c.execute("INSERT OR IGNORE INTO members (user_id) VALUES (?)", (user_id,))
conn.commit()
conn.close()
def is_member(user_id):
conn = sqlite3.connect("members.db")
c = conn.cursor()
c.execute("SELECT 1 FROM members WHERE user_id=?", (user_id,))
result = c.fetchone()
conn.close()
return result is not None
📌 استفاده:
async def vip_command(update, context):
if not is_member(update.message.chat_id):
await update.message.reply_text("❌ این بخش مخصوص اعضای VIP است.")
return
await update.message.reply_text("🎉 خوش آمدید به بخش VIP!")
۷. سیستم نقشها (Role System)
هر کاربر نقش خاصی دارد:
adminvipuser
📌 دیتابیس جدول:
CREATE TABLE IF NOT EXISTS members (
user_id INTEGER PRIMARY KEY,
role TEXT
);
📌 ذخیره نقش:
def add_member_role(user_id, role="user"):
conn = sqlite3.connect("members.db")
c = conn.cursor()
c.execute("INSERT OR REPLACE INTO members (user_id, role) VALUES (?, ?)", (user_id, role))
conn.commit()
conn.close()
📌 بررسی نقش:
def has_role(user_id, role):
conn = sqlite3.connect("members.db")
c = conn.cursor()
c.execute("SELECT 1 FROM members WHERE user_id=? AND role=?", (user_id, role))
result = c.fetchone()
conn.close()
return result is not None
۸. محدودیت بر اساس نقش
async def admin_only(update, context):
if not has_role(update.message.chat_id, "admin"):
await update.message.reply_text("🚫 فقط ادمینها میتوانند این کار را انجام دهند.")
return
await update.message.reply_text("✅ خوش آمدید ادمین عزیز!")
۹. کنترل دسترسی بر اساس پرداخت آنلاین
(این بخش با فصل ۱۶ مرتبط است و فقط ساختار کلی را میگوییم)
📌 مراحل:
- اتصال به سیستم پرداخت (مانند Zarinpal، IdPay، یا Stripe).
- دریافت تایید پرداخت.
- تغییر نقش کاربر به
vip.
📌 نمونه ساده بدون پرداخت (شبیهسازی):
async def buy_vip(update, context):
add_member_role(update.message.chat_id, "vip")
await update.message.reply_text("✅ شما اکنون عضویت VIP دارید!")
۱۰. سوالات متداول
س: چطور ID کاربر را پیدا کنم؟
ج: وقتی کاربر /start میزند، update.message.chat_id برمیگردد.
س: اگر کاربر نقش خود را تغییر دهد؟
ج: در دیتابیس جداول باید قابلیت ویرایش داشته باشند.
س: آیا لازم است نقشها در حافظه باشند یا دیتابیس؟
ج: دیتابیس برای پایداری توصیه میشود.
۱۱. اشتباهات رایج
| اشتباه | توضیح |
|---|---|
| ذخیره اطلاعات عضویت فقط در حافظه | با ریستارت پاک میشود |
| نبود اعتبارسنجی ID ورودی | ممکن است امنیت ربات کاهش یابد |
| اجازه اجرای دستور مهم توسط همه | به اشتباه محدودیت حذف شود |
۱۲. نکات حرفهای
- کش کردن نقشها در حافظه برای سرعت بیشتر (همراه با دیتابیس برای پایداری).
- ایجاد سیستم مدیریت از طریق پنل مخصوص ادمین.
- ثبت زمان شروع و پایان عضویت VIP برای مدیریت تمدید.
- ترکیب این سیستم با Inline Keyboard برای خرید/فعالسازی ساده.