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

""

۱. مقدمه

در بسیاری از ربات‌های تلگرامی، لازم است بعضی امکانات فقط برای:

  • کاربران پرداخت‌کننده
  • اعضای خاص
  • ادمین‌ها یا تیم مدیریت

در دسترس باشند.

📌 مزایا:

  • حفظ منابع و جلوگیری از استفاده بی‌رویه.
  • ایجاد پلن‌های 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()

📌 توضیح کد:

  1. ALLOWED_USERS → مجموعه‌ای از ID های تلگرامی.
  2. اگر کاربر در لیست نبود، پیام خطا نمایش داده می‌شود.

۵. ساخت سیستم ثبت‌نام

برای اضافه یا حذف کاربر به صورت داینامیک:

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)

هر کاربر نقش خاصی دارد:

  • admin
  • vip
  • user

📌 دیتابیس جدول:

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("✅ خوش آمدید ادمین عزیز!")

۹. کنترل دسترسی بر اساس پرداخت آنلاین

(این بخش با فصل ۱۶ مرتبط است و فقط ساختار کلی را می‌گوییم)

📌 مراحل:

  1. اتصال به سیستم پرداخت (مانند Zarinpal، IdPay، یا Stripe).
  2. دریافت تایید پرداخت.
  3. تغییر نقش کاربر به 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 برای خرید/فعال‌سازی ساده.
محمد وب‌سایت

دیدگاهتان را بنویسید

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