رفتن به محتوای اصلی
🔒 سطح: متوسط · رایگان

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

قبل از تحویل فایل، لینک یا کد تخفیف، بررسی می‌کند کاربر عضو کانال شما هست یا نه؛ با دکمهٔ «عضویت در کانال» و دکمهٔ «عضو شدم ✅».

سوال یا راهنمایی لازم داری؟ از صفحهٔ تماس با ما بپرس.

طراحی و کدنویسی: زبان: Python 3وابستگی: requestsزمان راه‌اندازی: ۱۵ دقیقهمجوز: رایگان (CC0)به‌روزرسانی: ۲ مهر ۱۴۰۵

این ربات چه کاری انجام می‌دهد؟

وقتی کاربر به ربات پیام می‌دهد، ربات با متد getChatMember بررسی می‌کند که او عضو کانال شما هست یا نه. اگر عضو نباشد، دکمهٔ عضویت در کانال و دکمهٔ «عضو شدم» را می‌بیند. بعد از عضویت و زدن دکمه، محتوای موردنظر شما (مثلاً کد تخفیف یا لینک دانلود) برایش ارسال می‌شود.

⚠️ نکتهٔ مهم: ربات تلگرام باید روی سروری اجرا شود که به api.telegram.org دسترسی دارد؛ روی خیلی از هاست‌های داخل ایران این آدرس مستقیم باز نیست. اگر ربات اجرا نشد، معمولاً مشکل از دسترسی سرور است نه از کد. اگر گیر کردی، از طریق صفحهٔ تماس با ما کمک بگیر.

آموزش راه‌اندازی قدم‌به‌قدم

این مراحل را به‌ترتیب انجام بده تا ربات روی سیستم خودت یا سرور بالا بیاید. داخل فایل ZIP یک راهنمای README هم هست.

از BotFather در تلگرام توکن ربات را بگیر.
ربات را به کانال خودت اضافه کن و حتماً آن را «ادمین» کانال کن.
در فایل bot.py مقدار TOKEN، آیدی کانال (CHANNEL) و لینک کانال (CHANNEL_LINK) را بگذار.
متن REWARD_TEXT را با محتوایی که می‌خواهی بعد از عضویت تحویل بدهی عوض کن.
pip install requests را اجرا کن، بعد python bot.py را اجرا کن و با یک حساب غیرعضو امتحان کن.

کل سورس ربات (کپی یا دانلود کن)

این همان کدی است که داخل فایل ZIP هم هست. فقط یادت باشد مقدار TOKEN را با توکن رباتت عوض کنی.

bot.py
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
#  ربات عضویت اجباری در کانال تلگرام
#  طراحی و کدنویسی: سروش مقدمی — فیلتور (filtori.com)
# ------------------------------------------------------------
#  قبل از اینکه کاربر به محتوای ربات (فایل، لینک، کد تخفیف و...)
#  دسترسی بگیره، ربات بررسی می‌کنه عضو کانال شما هست یا نه:
#   - اگر عضو نیست: دکمهٔ «عضویت در کانال» و دکمهٔ «عضو شدم ✅»
#   - بعد از عضویت: محتوای موردنظر براش ارسال می‌شه
#
#  ⚠️ خیلی مهم: ربات باید «ادمین» همون کانال باشه؛
#     وگرنه تلگرام اجازهٔ بررسی عضویت رو نمی‌ده.
#  ⚠️ ربات تلگرام باید روی سروری اجرا بشه که به api.telegram.org دسترسی داره.
#
#  آموزش کامل:
#     https://filtori.com/telegram-bot-source/join-check-bot/
#  سوال یا راهنمایی:  https://filtori.com/contact/
# ------------------------------------------------------------

import time

import requests

TOKEN = "توکن_ربات_خودت_را_اینجا_بگذار"
BASE = f"https://api.telegram.org/bot{TOKEN}"

# آیدی کانال با @ (کانال عمومی)
CHANNEL = "@your_channel"
CHANNEL_LINK = "https://t.me/your_channel"

# محتوایی که بعد از تایید عضویت ارسال می‌شه
REWARD_TEXT = (
    "ممنون که عضو کانال شدی 🌟\n\n"
    "کد تخفیف ویژه‌ات: FILTORI20\n"
    "لینک دانلود فایل: https://example.com/file.zip"
)

MEMBER_STATUSES = {"creator", "administrator", "member"}


def api(method, data):
    """فراخوانی یک متد Bot API و برگرداندن پاسخ JSON."""
    try:
        return requests.post(f"{BASE}/{method}", json=data, timeout=15).json()
    except (requests.RequestException, ValueError) as error:
        print(f"خطا در {method}:", error)
        return {"ok": False}


def get_updates(offset):
    params = {"offset": offset, "timeout": 30}
    try:
        return requests.get(f"{BASE}/getUpdates", params=params, timeout=40).json()
    except (requests.RequestException, ValueError) as error:
        print("خطا در دریافت پیام‌ها:", error)
        return {"ok": False, "result": []}


def is_member(user_id):
    """True اگر کاربر عضو کانال باشد."""
    result = api("getChatMember", {"chat_id": CHANNEL, "user_id": user_id})
    if not result.get("ok"):
        # معمولاً یعنی ربات ادمین کانال نیست یا آیدی کانال اشتباه است
        print("بررسی عضویت ناموفق:", result.get("description"))
        return False
    member = result["result"]
    if member.get("status") in MEMBER_STATUSES:
        return True
    # کاربر «محدودشده» ولی همچنان عضو
    return member.get("status") == "restricted" and member.get("is_member", False)


def ask_to_join(chat_id):
    keyboard = {
        "inline_keyboard": [
            [{"text": "📢 عضویت در کانال", "url": CHANNEL_LINK}],
            [{"text": "عضو شدم ✅", "callback_data": "check_join"}],
        ]
    }
    api(
        "sendMessage",
        {
            "chat_id": chat_id,
            "text": "برای استفاده از ربات، اول عضو کانال ما شو 👇\nبعد از عضویت، دکمهٔ «عضو شدم» رو بزن.",
            "reply_markup": keyboard,
        },
    )


def give_reward(chat_id):
    api("sendMessage", {"chat_id": chat_id, "text": REWARD_TEXT})


def handle_message(message):
    chat_id = message["chat"]["id"]
    user_id = message["from"]["id"]
    if is_member(user_id):
        give_reward(chat_id)
    else:
        ask_to_join(chat_id)


def handle_callback(callback):
    user_id = callback["from"]["id"]
    chat_id = callback["message"]["chat"]["id"]
    if callback.get("data") != "check_join":
        api("answerCallbackQuery", {"callback_query_id": callback["id"]})
        return

    if is_member(user_id):
        api("answerCallbackQuery", {"callback_query_id": callback["id"], "text": "عضویتت تایید شد ✅"})
        give_reward(chat_id)
    else:
        api(
            "answerCallbackQuery",
            {
                "callback_query_id": callback["id"],
                "text": "هنوز عضو کانال نشدی! اول عضو شو، بعد دکمه رو بزن.",
                "show_alert": True,
            },
        )


def main():
    print("ربات عضویت اجباری فیلتور روشن شد... (Ctrl+C برای خاموش‌کردن)")
    offset = 0
    while True:
        updates = get_updates(offset)
        if not updates.get("ok"):
            time.sleep(2)
            continue

        for update in updates.get("result", []):
            offset = update["update_id"] + 1
            if "callback_query" in update:
                handle_callback(update["callback_query"])
            elif "message" in update and "from" in update["message"]:
                handle_message(update["message"])

        time.sleep(0.5)


if __name__ == "__main__":
    main()
کل سورس این ربات ↑

⬇ دانلود فایل ZIP این ربات

شخصی‌سازی سریع

با چند تغییر کوچک، ربات را مخصوص کسب‌وکار خودت کن.

محتوای جایزه

REWARD_TEXT را با کد تخفیف، لینک دانلود یا هر متنی که می‌خواهی عوض کن.

کانال خصوصی

برای کانال خصوصی، به‌جای @username آیدی عددی کانال (که با -100 شروع می‌شود) را در CHANNEL بگذار و در CHANNEL_LINK لینک دعوت را قرار بده.

ترکیب با ارسال همگانی

کاربرانی که عضو شدند را می‌توانی با ایدهٔ ربات ارسال همگانی در یک لیست نگه داری.

خطاهای رایج و راه‌حل

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

پیام خطاعلتراه‌حل
401 Unauthorizedتوکن اشتباه است یا فاصلهٔ اضافه دارد.توکن را دوباره از BotFather کپی کن و بین دو علامت نقل‌قول بگذار.
409 Conflictیک نسخهٔ دیگر از ربات در حال اجراست یا روی ربات وب‌هوک تنظیم شده.نسخهٔ دیگر را خاموش کن. اگر قبلاً وب‌هوک گذاشته‌ای، آدرس api.telegram.org/bot<TOKEN>/deleteWebhook را یک بار باز کن.
Timeout یا ConnectionErrorسرور به api.telegram.org دسترسی ندارد.ربات را روی سروری اجرا کن که به تلگرام دسترسی دارد؛ روی بیشتر هاست‌های داخل ایران این آدرس باز نیست.
ModuleNotFoundError: requestsکتابخانهٔ requests نصب نشده.دستور pip install -r requirements.txt یا pip install requests را اجرا کن.
429 Too Many Requestsدر زمان کوتاه پیام زیادی ارسال شده.بین ارسال‌ها مکث بگذار؛ تلگرام حدود ۳۰ پیام در ثانیه اجازه می‌دهد.
ربات در گروه جواب نمی‌دهدPrivacy Mode ربات روشن است.در BotFather دستور /setprivacy را بزن و آن را Disable کن، یا ربات را ادمین گروه کن.

اجرای ۲۴ ساعته روی سرور لینوکس

با python bot.py ربات تا وقتی ترمینال باز است کار می‌کند. برای اجرای دائمی روی سرور لینوکس (Ubuntu/Debian)، فایل‌ها را در پوشهٔ /opt/mybot بگذار و یک سرویس systemd بساز تا ربات بعد از خطا یا ری‌استارت سرور خودش دوباره روشن شود.

/etc/systemd/system/mybot.service
[Unit]
Description=Filtori Telegram Bot
After=network-online.target

[Service]
WorkingDirectory=/opt/mybot
ExecStart=/usr/bin/python3 /opt/mybot/bot.py
Environment=PYTHONUNBUFFERED=1
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
فایل سرویس
terminal
sudo nano /etc/systemd/system/mybot.service   # متن بالا را اینجا بگذار
sudo systemctl daemon-reload
sudo systemctl enable --now mybot             # روشن‌کردن + اجرای خودکار بعد از ری‌استارت
journalctl -u mybot -f                        # دیدن لاگ‌ها
دستورها

راه‌اندازی روی سرور برایت سخت است؟ نصب و راه‌اندازی را به ما بسپار.

درخواست راه‌اندازی

از سورس رایگان تا ربات حرفه‌ای کسب‌وکار

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

امکانسورس رایگاننسخهٔ اختصاصی
ذخیره‌سازیفایل CSV/TXTدیتابیس
پنل مدیریت—✓
پرداخت آنلاین—✓
اتصال به سایت / CRM—✓
نصب و پشتیبانیخودتتیم فیلتور

سوال‌های پرتکرار دربارهٔ این ربات

چرا ربات می‌گوید من عضو نیستم در حالی که عضوم؟

تقریباً همیشه به این دلیل است که ربات ادمین کانال نیست یا آیدی کانال در CHANNEL اشتباه است. تلگرام فقط به ربات‌های ادمین اجازه می‌دهد عضویت را بررسی کنند؛ پیام خطا در ترمینال هم چاپ می‌شود.

برای کانال خصوصی هم کار می‌کند؟

بله، به‌شرط اینکه ربات ادمین کانال باشد و به‌جای @username آیدی عددی کانال را بگذارید.

اگر کاربر بعداً از کانال خارج شود چه می‌شود؟

هر بار که کاربر از ربات چیزی بخواهد، عضویت دوباره بررسی می‌شود؛ پس بعد از خروج، دسترسی‌اش هم قطع می‌شود.

سوال یا مشکلی داشتم از کجا راهنمایی بگیرم؟

از صفحهٔ تماس با ما در filtori.com/contact پیام بدهید یا با شمارهٔ ۰۹۱۲۲۸۷۴۸۶۲ تماس بگیرید؛ اگر نسخهٔ اختصاصی همین ربات را برای کسب‌وکارتان بخواهید هم همین مسیر را استفاده کنید.

طراح و برنامه‌نویس این سورس‌ها · بنیان‌گذار فیلتور

مدیر بخش دیتابیس همراه اول و فعال در توسعهٔ نرم‌افزار از سال ۱۳۹۱؛ با سابقهٔ کار روی سامانه‌های بانکی و پرتراکنش. این سورس‌ها را طوری نوشته که ساده، خوانا و قابل توسعه باشند و مستقیم در کسب‌وکار واقعی استفاده شوند.

سوالی داری یا راهنمایی می‌خواهی؟

اگر در راه‌اندازی گیر کردی، یا می‌خواهی همین ربات برای کسب‌وکارت نصب و شخصی‌سازی شود، از صفحهٔ تماس با ما پیام بده.

سورس‌های دیگر ربات تلگرام