قبل از تحویل فایل، لینک یا کد تخفیف، بررسی میکند کاربر عضو کانال شما هست یا نه؛ با دکمهٔ «عضویت در کانال» و دکمهٔ «عضو شدم ✅».
سوال یا راهنمایی لازم داری؟ از صفحهٔ تماس با ما بپرس.
وقتی کاربر به ربات پیام میدهد، ربات با متد getChatMember بررسی میکند که او عضو کانال شما هست یا نه. اگر عضو نباشد، دکمهٔ عضویت در کانال و دکمهٔ «عضو شدم» را میبیند. بعد از عضویت و زدن دکمه، محتوای موردنظر شما (مثلاً کد تخفیف یا لینک دانلود) برایش ارسال میشود.
این مراحل را بهترتیب انجام بده تا ربات روی سیستم خودت یا سرور بالا بیاید. داخل فایل ZIP یک راهنمای README هم هست.
این همان کدی است که داخل فایل ZIP هم هست. فقط یادت باشد مقدار TOKEN را با توکن رباتت عوض کنی.
# -*- 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()
با چند تغییر کوچک، ربات را مخصوص کسبوکار خودت کن.
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 بساز تا ربات بعد از خطا یا ریاستارت سرور خودش دوباره روشن شود.
[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
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 پیام بدهید یا با شمارهٔ ۰۹۱۲۲۸۷۴۸۶۲ تماس بگیرید؛ اگر نسخهٔ اختصاصی همین ربات را برای کسبوکارتان بخواهید هم همین مسیر را استفاده کنید.
اگر در راهاندازی گیر کردی، یا میخواهی همین ربات برای کسبوکارت نصب و شخصیسازی شود، از صفحهٔ تماس با ما پیام بده.