Files
memes_bot/README.fa.md
T
goyban 82b5da41b8 Add public mode with channel membership requirements
Completes TODO #2. PUBLIC_MODE swaps the ALLOWED_USERS allowlist for a
membership check against REQUIRED_CHATS, with REQUIRE_MODE choosing
between needing every chat or just one.

- Stop is_admin() falling back to "everyone is an admin" when
  ADMIN_USERS is unset once PUBLIC_MODE is on. That fallback is the
  original single-owner convenience, but under public mode it handed
  moderation, /edit and /delete to anyone who found the bot. Public
  mode now grants admin to nobody until ADMIN_USERS is set, and says
  so at startup. Private deployments are unaffected.
- Cache membership answers: inline search queries on every keystroke,
  so an uncached check meant several API calls per typed character.
  Grants last five minutes, refusals thirty seconds, so a user who has
  just joined is not locked out for the full window.
- Fail closed when the membership check errors, and validate
  REQUIRED_CHATS at startup so a chat the bot cannot read is reported
  rather than silently refusing every user.
- Refused users get a join prompt with real links instead of silence;
  inline shows a tappable bar that opens the bot and explains why.
  A private bot stays silent as before.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 21:50:01 +00:00

6.3 KiB

Memes Bot

ربات شخصی تلگرام برای ذخیره و جستجوی میم (عکس، گیف، ویدیو، صدا، موزیک، استیکر، فایل) با کلیدواژه.

English


پیش‌نیازها

  • یک سرور با Docker نصب‌شده
  • توکن ربات تلگرام از @BotFather

راه‌اندازی

۱. ساخت ربات در BotFather

  • /newbot ← توکن بگیرید
  • /setinline ← حالت اینلاین را فعال کنید (مثلاً: جستجوی میم...)

۲. پیدا کردن شناسه تلگرام

برای وایت‌لیست کردن خودتان به ID عددی نیاز دارید.

  • ساده‌ترین روش: یک پیام به @userinfobot فوروارد کنید — شناسه شما را برمی‌گرداند
  • روش دیگر: تلگرام وب را باز کنید، روی پروفایل کلیک کنید، عدد داخل URL شناسه شماست
  • برای چند کاربر: ID هر نفر را با کاما جدا کنید

۳. کلون و تنظیم

git clone https://git.goyban.com/goyban/memes_bot
cd memes_bot
cp .env.example .env

فایل .env را ویرایش کنید:

BOT_TOKEN=توکن_ربات_شما
ALLOWED_USERS=123456789,987654321

۴. اجرا

docker compose up -d --build

دیتابیس در مسیر ./bot_db/media.db ذخیره می‌شود.

نحوه استفاده

افزودن میم — یک عکس، گیف، ویدیو، صدا، موزیک، استیکر یا هر فایلی برای ربات بفرستید. ربات از شما کلیدواژه می‌خواهد. کلیدواژه‌ها را یکی‌یکی یا با کاما جدا بفرستید، سپس /done بزنید.

جستجوی اینلاین — در هر چتی بنویسید @نام_ربات کلیدواژه تا نتایج نمایش داده شود.

دستورات

دستور توضیح
/list نمایش همه رسانه‌های ذخیره‌شده
/review بررسی یک‌به‌یک ارسال‌های در انتظار تأیید (فقط ادمین)
/delete <id> حذف یک مورد (ID را از /list بگیرید)
/cancel لغو عملیات جاری

عمومی‌کردن ربات

با تنظیم PUBLIC_MODE=true ربات به‌جای فهرست ALLOWED_USERS، به هر کسی که شرط عضویت را داشته باشد اجازه دسترسی می‌دهد:

PUBLIC_MODE=true
ADMIN_USERS=123456789
REQUIRED_CHATS=@mychannel,@mygroup
REQUIRE_MODE=all

در REQUIRED_CHATS می‌توانید @username یا شناسه عددی بنویسید. ربات باید در هر کدام ادمین باشد، وگرنه نمی‌تواند عضویت را بررسی کند و همه رد می‌شوند. ربات هنگام راه‌اندازی این را بررسی می‌کند و نام هر چتی را که نمی‌تواند بخواند در لاگ می‌نویسد. مقدار all یعنی عضویت در همه چت‌ها لازم است و any یعنی یکی کافی است. اگر REQUIRED_CHATS خالی باشد ربات برای همه باز است.

کاربری که شرط را ندارد پیامی می‌بیند که فهرست چت‌های لازم را نشان می‌دهد. در جستجوی inline هم به‌جای نتیجه خالی و بدون توضیح، یک نوار قابل لمس می‌بیند که ربات را باز می‌کند و همین توضیح را می‌دهد.

قبل از روشن‌کردن این گزینه حتماً ADMIN_USERS را تنظیم کنید. وقتی ADMIN_USERS خالی باشد، ربات خصوصی کاربرانش را ادمین حساب می‌کند؛ این برای ربات تک‌نفره راحت است اما در حالت عمومی یعنی همه ادمین می‌شوند. به همین دلیل در حالت عمومی تا وقتی ADMIN_USERS تنظیم نشده باشد هیچ‌کس ادمین نیست و ربات هنگام راه‌اندازی خطا ثبت می‌کند.

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

پذیرش ارسال کاربران

اگر در فایل .env مقدار ACCEPT_SUBMISSIONS=true را تنظیم کنید، کاربران غیرادمین هم می‌توانند رسانه بفرستند. این موارد ذخیره می‌شوند اما تا وقتی یک ناظر تأییدشان نکند در جستجوی inline و /list دیده نمی‌شوند. رسانه‌ای که خود ادمین‌ها می‌فرستند مثل قبل مستقیم ذخیره می‌شود.

با دستور /review می‌توانید صف را بررسی کنید. هر مورد همراه با کلیدواژه‌هایش و چهار دکمه نمایش داده می‌شود: تأیید، رد، اصلاح کلیدواژه‌ها، و توقف.

صف هیچ نشانگری ذخیره نمی‌کند و /review همیشه قدیمی‌ترین مورد در انتظار را می‌آورد. برای همین می‌توانید بعد از چند مورد متوقف شوید و فردا ادامه دهید، و چند ناظر هم می‌توانند هم‌زمان کار کنند — اگر دو نفر یک مورد را باز کنند، تصمیم اولی ثبت می‌شود و به دومی گفته می‌شود که قبلاً بررسی شده است.

تا وقتی مطمئن نیستید این گزینه را خاموش بگذارید. وقتی ALLOWED_USERS خالی باشد همه کاربرِ مجاز حساب می‌شوند، پس روشن‌کردن این گزینه یعنی پذیرفتن رسانه از هر کسی که ربات را پیدا کند.

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

فقط کافی است این دو فایل را منتقل کنید:

  • .env
  • bot_db/media.db