بات تلگرامی که با گرفتن آیدی عددی، یوزرنیم، لینک پیام یا یک فوروارد، پیامهای آن شخص را در چتهایی که خودتان عضوشان هستید پیدا میکند — گروه به گروه، با لینک مستقیم به خود پیام.
همان کاری که دستی در تلگرام میکنید (باز کردن گروه → سرچ → فیلتر «از طرف این عضو»)، ولی روی همهی چتهایتان یکجا و خودکار.
این بات نمیتواند پیامهای چتهایی که شما عضوشان نیستید را ببیند. نه به این دلیل که پیادهسازی نشده — تلگرام چنین چیزی را در اختیار هیچ برنامهای نمیگذارد. هر ابزاری که ادعای خلافش را بکند دروغ میگوید یا کلاهبرداری است.
همچنین با Bot API معمولی اصلاً شدنی نیست: یک بات نه میتواند تاریخچهی گروه را بخواند و نه پیامهای قبل از عضو شدنش را ببیند. بنابراین این پروژه از MTProto با اکانت خودتان (کتابخانهی Telethon) استفاده میکند و بات تلگرامی فقط نقش رابط کاربری را دارد.
نتیجهی این معماری: روی Cloudflare Workers قابل اجرا نیست (اتصال دائمی MTProto با مدل اجرای Workers سازگار نیست) — به یک سرور همیشهروشن نیاز دارید. یک VPS ارزان کافی است.
| جای پیام | پیدا میشود؟ | توضیح |
|---|---|---|
| سوپرگروهها و گروههای عادی | ✅ | فیلتر فرستنده سمت سرور تلگرام انجام میشود، سریع و دقیق |
| گروههای موضوعی (Forum) | ✅ | لینک مستقیم به همان تاپیک ساخته میشود |
| چت خصوصی خودتان با آن شخص | ✅ | |
| کانالها | فقط با محدودهی «همهجا»؛ پستهای کانال به نام خود کانال ثبت میشوند، پس معمولاً خالی است. کامنتها در گروه گفتگوی کانال پیدا میشوند | |
| گروههایی که ترکشان کردهاید | ❌ | دیگر در لیست چتهای شما نیست |
| هر جایی که شما عضو نیستید | ❌ | غیرممکن |
روی یک سرور Debian یا Ubuntu، به عنوان root:
bash <(curl -fsSL https://raw.githubusercontent.com/AssA7778/TG/main/install.sh)اسکریپت خودش پکیجها را نصب میکند، venv میسازد، یک ویزارد تعاملی برای ورود بالا میآورد و سرویس systemd را راه میاندازد.
اگر ترجیح میدهید دستی کلون کنید
git clone https://github.com/AssA7778/TG.git /opt/msgfinder
cd /opt/msgfinder && sudo bash install.sh- توکن بات — در تلگرام به @BotFather بروید،
/newbotبزنید و توکن را کپی کنید. - شمارهی موبایل اکانت خودتان — ویزارد کد ورود میفرستد (کد در خود تلگرام میآید، نه پیامک).
API_IDوAPI_HASH— اگر ندارید فقط Enter بزنید تا از کلید عمومی Telegram Desktop استفاده شود.
نصب که تمام شد، بات را در تلگرام باز کنید و /start بفرستید.
آیدی یا یوزرنیم طرف را بفرستید، یا یکی از اینها:
| ورودی | مثال |
|---|---|
| یوزرنیم | @someone |
| آیدی عددی | 123456789 |
| لینک پیام | https://t.me/c/1234567890/456 |
| فوروارد | یک پیام از آن شخص را برای بات فوروارد کنید |
| اسم | علی — بین کسانی که بات قبلاً دیده میگردد |
| شماره | +989123456789 — فقط اگر حریم خصوصیاش اجازه بدهد |
بعد کارت آن شخص با این دکمهها باز میشود:
- 🔎 شروع جستجو / 👥 فقط گروهها / 🌐 همهجا
- 🔤 جستجو با کلمهی کلیدی — فقط پیامهایی که آن عبارت را دارند
- 🔔 دنبالکردن زنده — هر پیام جدیدش در هر گروهی، همان لحظه با دکمهی «دیدن پیام در گروه» برایتان میآید
- 🆕 پیامهای جدید — آرشیو همان پیامهای زنده
نتایج صفحهبندی شدهاند، خلاصهی «کدام گروه چند پیام» دارند، و با 📄 خروجی کامل یک فایل HTML با همهی نتایج و لینکهای کلیکشدنی میگیرید.
| دستور | کار |
|---|---|
/start |
منوی اصلی |
/find <آیدی یا یوزرنیم> |
جستجوی سریع |
/id <یوزرنیم> |
گرفتن آیدی عددی — بدون ورودی، آیدی خودتان |
/saved |
افراد ذخیرهشده |
/index |
ایندکس اعضای گروهها (پایین را بخوانید) |
/addmember <آیدی> |
اجازهی استفاده به یک نفر دیگر |
/delmember <آیدی> / /members |
مدیریت مجازها |
/cancel |
توقف جستجوی در حال اجرا |
/id @durov
اسم، یوزرنیم و آیدی عددی طرف را میدهد؛ روی عدد بزنید تا کپی شود. فوروارد کردن یک پیام
از او هم دقیقاً همین کار را میکند. با دکمهی «🆔 گرفتن آیدی عددی» در منو هم در دسترس است.
/id بدون ورودی، آیدی عددی خودتان را میدهد.
جهت برعکس (آیدی عددی ← شخص) همیشه شدنی نیست؛ بخش بعد توضیحش است.
تلگرام اجازه نمیدهد یک عدد خالی را به کاربر تبدیل کنید. هر کاربر یک access_hash دارد که
سرور فقط وقتی به شما میدهد که اکانتتان آن شخص را جایی دیده باشد (گروه مشترک، مخاطب،
فوروارد و…). این یک قانون حریم خصوصی سمت سرور است، نه محدودیت این بات.
در این حالت خود بات دکمهی «🔍 بگرد توی اعضای گروههایم» را نشان میدهد: گروههایتان را یکییکی میگردد و بهمحض پیدا شدن آن آیدی میایستد. هر کسی هم که سر راه ببیند ذخیره میکند، پس دفعهی بعد فوری جواب میدهد. اگر طرف در هیچ گروه مشترکی نباشد، صادقانه میگوید پیدا نشد.
راههای سریعتر:
- لینک یکی از پیامهایش را بفرستید — از همان یک پیام، دسترسی کامل ساخته میشود.
- یک پیام از او فوروارد کنید — مگر اینکه نمایش اکانتش در فوروارد را بسته باشد، که در آن حالت هیچ راهی برای بیرون کشیدن آیدی از خود پیام وجود ندارد.
/indexرا یک بار اجرا کنید — اعضای همهی گروههایتان را از قبل ذخیره میکند.
- بات فقط برای شماست. هر کس دیگری بفرستد نادیده گرفته میشود. با
/addmemberمیتوانید کسی را اضافه کنید — ولی حواستان باشد که او هم در چتهای شما جستجو میکند. - سشن اکانت را کپی نکنید. اگر همان لاگین را همزمان در دو برنامه استفاده کنید و IP فرق کند،
تلگرام کلید را برای هر دو باطل میکند (
AUTH_KEY_DUPLICATED). ویزارد عمداً یک ورود جدید و مستقل میسازد. - فایل
.envشامل کلید ورود اکانت شماست و با دسترسی600ذخیره میشود. هر کسی که آن را داشته باشد اکانت شما را دارد. در گیت commit نکنید (در.gitignoreهست). - در تلگرام → Settings → Devices یک دستگاه به اسم tg-msg-finder میبینید. اگر Terminateاش کنید بات از کار میافتد.
- جستجو عمداً ترتیبی و آهسته است (حدود یک چت در ثانیه). تلگرام محدودیت عددی منتشر نمیکند
و موازیسازی فقط زودتر به محدودیت میخورد. اگر
FLOOD_WAITبگیرید، نتایج تا آن لحظه ذخیره میشود و پیام میدهد. - خواندن چتهای خودتان ذاتاً کمخطر است، ولی هر اتوماسیونی روی اکانت شخصی ریسک دارد. روی اکانت قدیمی و شمارهی واقعی استفاده کنید، نه اکانت تازهساخت.
- این ابزار برای پیدا کردن پیامها در فضای خودتان است. استفادهاش برای تعقیب و آزار کسی، هم غیراخلاقی است و هم در بسیاری از کشورها غیرقانونی.
systemctl status msgfinder
systemctl restart msgfinder
journalctl -u msgfinder -f # لاگ زنده
bash /opt/msgfinder/install.sh # بهروزرسانی کد
bash /opt/msgfinder/install.sh --reconfigure # تغییر توکن یا ورود دوباره
bash /opt/msgfinder/install.sh --uninstall # حذف سرویساگر لاگین باطل شود، سرویس با کد خروج 78 میایستد (systemd عمداً دوباره اجرایش نمیکند) و
بات برایتان پیام میدهد که --reconfigure را اجرا کنید.
msgfinder/
├── config.py خواندن و اعتبارسنجی .env
├── session.py ساخت دو کلاینت؛ تبدیل StringSession به سشن دیسکی
├── resolve.py تبدیل ورودی به کاربر (یوزرنیم / آیدی / لینک / فوروارد / شماره)
├── search.py موتور جستجو + ایندکس اعضا
├── db.py sqlite: کش افراد، نتایج، افراد ذخیرهشده، مجازها
├── links.py لینک عمیق پیام، نامها، خلاصهی متن
├── jalali.py تاریخ شمسی، بدون وابستگی خارجی
├── render.py صفحهبندی نتایج، خلاصه، خروجی HTML
├── ui.py منوها، ویزارد، دکمهها
├── watch.py اعلان زندهی پیامهای افراد دنبالشده
└── setup_wizard.py ورود تعاملی و نوشتن .env
تلگرام هیچ متدی برای «همهی پیامهای این آدم در همهجا» ندارد:
messages.searchGlobal اصلاً فیلد from_id ندارد. تنها فیلتر فرستنده، per-chat است —
messages.search با کوئری خالی و from_id — که همان چیزی است که خود اپهای رسمی برای
«نمایش پیامهای این عضو» استفاده میکنند. پس بات لیست چتهای شما را میگیرد و یکییکی
همان درخواست را میفرستد.
دو تصمیم مهم:
- ترتیبی، نه موازی. تلگرام محدودیت flood را per-request-type ذخیره میکند؛ وقتی یک
messages.searchمحدود شود بقیه هم بلافاصله محدود میشوند. پس موازیسازی فقط زودتر به دیوار میخورد. - چتهای خصوصی جدا حساب میشوند. سرور در چت یکبهیک
from_idرا نادیده میگیرد و Telethon مجبور میشود کل گفتگو را ورق بزند. چون فقط یک چت خصوصی میتواند پیام آن شخص را داشته باشد (چت خودش)، بقیهی چتهای خصوصی کلاً رد میشوند.
StringSession هیچ کشی از افراد نگه نمیدارد، بنابراین هنگام اجرا به یک فایل سشن SQLite
تبدیل میشود تا access_hashها بین ریاستارتها بمانند.
MIT