Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔎 tg-msg-finder

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

همان کاری که دستی در تلگرام می‌کنید (باز کردن گروه → سرچ → فیلتر «از طرف این عضو»)، ولی روی همه‌ی چت‌هایتان یک‌جا و خودکار.


⚠️ اول این را بخوانید

این بات نمی‌تواند پیام‌های چت‌هایی که شما عضوشان نیستید را ببیند. نه به این دلیل که پیاده‌سازی نشده — تلگرام چنین چیزی را در اختیار هیچ برنامه‌ای نمی‌گذارد. هر ابزاری که ادعای خلافش را بکند دروغ می‌گوید یا کلاهبرداری است.

همچنین با 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

قبل از نصب چه چیزهایی لازم دارید

  1. توکن بات — در تلگرام به @BotFather بروید، /newbot بزنید و توکن را کپی کنید.
  2. شماره‌ی موبایل اکانت خودتان — ویزارد کد ورود می‌فرستد (کد در خود تلگرام می‌آید، نه پیامک).
  3. 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 دارد که سرور فقط وقتی به شما می‌دهد که اکانتتان آن شخص را جایی دیده باشد (گروه مشترک، مخاطب، فوروارد و…). این یک قانون حریم خصوصی سمت سرور است، نه محدودیت این بات.

در این حالت خود بات دکمه‌ی «🔍 بگرد توی اعضای گروه‌هایم» را نشان می‌دهد: گروه‌هایتان را یکی‌یکی می‌گردد و به‌محض پیدا شدن آن آیدی می‌ایستد. هر کسی هم که سر راه ببیند ذخیره می‌کند، پس دفعه‌ی بعد فوری جواب می‌دهد. اگر طرف در هیچ گروه مشترکی نباشد، صادقانه می‌گوید پیدا نشد.

راه‌های سریع‌تر:

  1. لینک یکی از پیام‌هایش را بفرستید — از همان یک پیام، دسترسی کامل ساخته می‌شود.
  2. یک پیام از او فوروارد کنید — مگر اینکه نمایش اکانتش در فوروارد را بسته باشد، که در آن حالت هیچ راهی برای بیرون کشیدن آیدی از خود پیام وجود ندارد.
  3. /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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages