TeleWire
یک مدیر دانلود دسکتاپ برای تلگرام. با اکانت خودت وارد میشوی، میتوانی تاریخچهی رسانههای هر چتی را مرور کنی و فایلها را مستقیم و با چند اتصال موازی روی دیسک بریزی، همراه با قابلیت توقف، ادامه، صفبندی و دانلودهایی که در برابر کرش هم دوام میآورند.
بدون سرور. بدون بات. بدون رله. بکاند این برنامه که با Rust نوشته شده، خودش یک کلاینت تلگرام است، دقیقاً مثل اپ رسمی دسکتاپ. تنها دو طرفی که بایتهای فایل بینشان رد و بدل میشود، دیتاسنترهای تلگرام و دیسک خودت هستند.
رایگان، متنباز، تحت مجوز MIT، و هیچ چیزی برای پرداخت وجود ندارد، هیچ وقت.
اسکرینشاتها
کارهایی که انجام میدهد
| | |
|---|---|
| همهی چتها | کانالها، گروهها، باتها، چتهای خصوصی و پیامهای ذخیره شده، همهشان دستهبندی شده و قابل جستجو |
| همهی نوع فایلها | ویدیو، صدا، عکس و اسناد (mp4، mkv، pdf، zip و...) که هم از روی MIME و هم از روی نام فایل تشخیص داده میشوند |
| دانلود موازی | فایل به تکههای 512 کیلوبایتی تقسیم میشود که چند اتصال همزمان آنها را میکشند |
| سرعت تطبیقی | تعداد ورکرها بر اساس نرخ انتقال واقعی تنظیم میشود، نه یک عدد ثابت حدسی |
| ادامهی امن بعد از کرش | برنامه را وسط انتقال ببند، وقتی دوباره بازش کنی دقیقاً از همان نقطه ادامه میدهد |
| سازماندهی خودکار | فایلها در مسیر <پوشهی دانلود>/<چت>/<سال-ماه>/<نام فایل> قرار میگیرند |
| کنترل صف | توقف، ادامه، لغو و تلاش مجدد، همراه با نرخ انتقال زنده برای هر اتصال |
نصب
پیشنیازها
- Rust نسخه 1.85 یا بالاتر، چون کریتهای
grammersنسخهی 0.10 برای edition 2024 نوشته شدهاند - Node.js نسخه 18 یا بالاتر
- یک webview پلتفرم: WebView2 روی ویندوز (روی ویندوز 11 از قبل نصب است)، WebKitGTK روی لینوکس، WKWebView روی مک
روی ویندوز معمولاً از toolchain مربوط به MSVC استفاده میشود. این پروژه روی toolchain مربوط به x86_64-pc-windows-gnu هم با MinGW-w64 به خوبی build میشود، که وقتی نمیتوانی Visual Studio Build Tools نصب کنی به کارت میآید.
ساخت (Build)
git clone https://github.com/YaserZarifi/TeleDownloader-Telegram-Download-Manager-.git
cd TeleDownloader-Telegram-Download-Manager-
npm install
npm run app # اجرای برنامه
npm run bundle # ساخت فایلهای نصب در src-tauri/target/release/bundle/
اسکریپتهای دیگر:
npm run dev # فقط فرانتاند، داخل مرورگر، با دادههای آزمایشی
npm run build # بررسی نوعها و بیلد فرانتاند
اولین اجرا
با شماره تلفنت وارد میشوی، دقیقاً مثل اپ رسمی تلگرام: شماره تلفن، کد ورود، رمز دو مرحلهای اگر فعال کرده باشی. TeleWire به عنوان یک اکانت کاربری معمولی وارد میشود. این یک بات نیست و میتواند هر چیزی را که اکانت تو از قبل در تلگرام میبیند، دانلود کند.
یک نکته هست که بهتر است توضیح داده شود تا این که پنهان بماند.
دربارهی api_id و api_hash
تلگرام از هر کلاینتی میخواهد که خود برنامه را قبل از باز کردن هر اتصالی معرفی کند. اپ دسکتاپ تلگرام چنین جفتی دارد، هر کلاینت شخص ثالث دیگری هم همین طور. این موضوع ربطی به این که کدام اکانت وارد میشود ندارد، و توکن بات هم نیست.
چون این معرفی باید قبل از ارسال کد ورود انجام شود، نمیشود آن را به بعد از وارد کردن شماره تلفن موکول کرد. پس دو راه برای مدیریت آن وجود دارد:
اگر توزیعکنندهی برنامه هستی، این راه توصیه میشود. یک بار ثبتنام کن و مقادیر را داخل برنامه جاسازی کن. هر کسی که نسخهی تو را اجرا کند، فقط یک فیلد برای شماره تلفن میبیند:
cp src-tauri/telewire.credentials.example src-tauri/telewire.credentials
# دو مقدار را پر کن، بعد
npm run bundle
آن فایل در gitignore قرار دارد. میتوانی TELEWIRE_API_ID و TELEWIRE_API_HASH را هم به عنوان متغیرهای محیطی هنگام build پاس بدهی.
اگر داری از سورس کد بدون مقادیر جاسازی شده build میگیری. برنامه یک تنظیم یکباره را طی میکند: به آدرس https://my.telegram.org/apps برو، با شماره تلفنت وارد شو، یک اپ با هر نامی بساز، و دو مقدار را کپی و جای مناسب پیست کن. این مقادیر داخل keychain سیستمعاملت ذخیره میشوند و دیگر دوباره از تو پرسیده نمیشود.
چرا این پروژه یک جفت مقدار مشترک منتشر نمیکند
اگر api_idای داخل یک ریپازیتوری عمومی منتشر شود، تلگرام آن را با خطای API_ID_PUBLISHED_FLOOD علامتگذاری میکند و از کار میافتد، برای همهی کسانی که از آن استفاده میکنند. انتشار یک جفت مشترک همین که کشف شود برنامه را برای همهی کاربران خراب میکند، به همین دلیل ریپازیتوری از ابتدا عمداً بدون این اطلاعات نگه داشته شده است.
نحوهی کار دانلود
۱. حجم فایل از متادیتای رسانهی همان پیام خوانده میشود.
۲. مقصد به اندازهی کامل فایل از قبل با نام <name>.part رزرو میشود.
۳. فایل به تکههای 512 کیلوبایتی تقسیم میشود. این عدد اتفاقی انتخاب نشده، چون تلگرام میخواهد طول درخواست بر 1 مگابایت بخشپذیر باشد، آفست مضربی از 4 کیلوبایت باشد، و یک درخواست هرگز از مرز 1 مگابایتی رد نشود.
۴. چند ورکر از یک صف مشترک شمارهی تکهها برمیدارند. این همان بخش work-stealing است، یک اتصال کند فقط تکههای کمتری برمیدارد، به جای این که یک بازهی ثابت را قفل کند و بقیه را معطل نگه دارد.
۵. تعداد ورکرها از یک عدد کم شروع میشود و تا زمانی که هر اتصال اضافه واقعاً نرخ انتقال را بهتر میکند، بالا میرود، بعد که دیگر کمک نمیکند یا تلگرام شروع به flood-wait میکند، عقبنشینی میکند.
۶. یک فایل manifest کنار فایل اصلی ثبت میکند کدام تکهها واقعاً روی دیسک نوشته شدهاند، تا وقتی برنامه بعد از یک کرش دوباره اجرا شود، دقیقاً از همان جا ادامه پیدا کند، نه از اول شروع شود و نه بیصدا فایل را خراب کند.
۷. وقتی دانلود تمام شد، تعداد بایتها بررسی میشود، بعد فایل .part به صورت atomic تغییر نام پیدا میکند. اگر فایلی با نام واقعیاش روی دیسک نشسته باشد، یعنی کامل است.
flood-waitها فقط ورکر مربوطه را متوقف میکنند، دقیقاً به همان مدتی که تلگرام خواسته، بقیهی کار همچنان ادامه دارد.
حریم خصوصی
هیچ تلهمتریای وجود ندارد. این برنامه با یک اکانت واقعی تلگرام وارد میشود، پس این یک ادعای مشخص است نه یک جملهی تشریفاتی، و میتوانی خودت داخل سورس کد بررسیاش کنی:
- هیچ آنالیتیکسی، هیچ گزارش کرشی، هیچ ارتباط پنهانی با هیچ سروری وجود ندارد.
- تنها مقصد شبکه، سرورهای خود تلگرام هستند. هیچ چک آپدیتی، هیچ جمعآوری خطایی، و هیچ endpoint شخص ثالثی وجود ندارد.
- کل ترافیک تلگرام داخل Rust انجام میشود. webview هیچ درخواست شبکهای نمیفرستد، زیر یک Content-Security-Policy اجرا میشود که هیچ origin راه دوری را اجازه نمیدهد، حتی فونتها هم داخل برنامه جاسازی شدهاند، نه این که از یک CDN گرفته شوند.
api_hashتو داخل keychain سیستمعامل ذخیره میشود (Windows Credential Manager، macOS Keychain، Linux Secret Service)، نه داخل یک فایل تنظیمات.- نشست MTProto داخل یک فایل SQLite در پوشهی دادهی کاربری تو نگهداری میشود، با دسترسی محدود فقط برای مالک فایل. کلید نشست هیچوقت لاگ نمیشود و هیچوقت به فرانتاند نمیرسد.
اگر روزی گزارش کرش یا آمار استفاده اضافه شود، به صورت opt-in و صریح خواهد بود.
هشدار امنیتی، به صراحت
TeleWire از grammers برای MTProto استفاده میکند. توسعهدهندهی اصلی آن گفته که کد رمزنگاری و احراز هویت به صورت رسمی آدیت نشده است. خودش از آن استفاده میکند و به آن اعتماد دارد، اما به هر کسی که میخواهد آن را در جایی حساس از نظر امنیتی استفاده کند، توصیه میکند خودش grammers-crypto و بخش auth از grammers-mtproto را بررسی کند. چون این برنامه با ورود به یک اکانت واقعی سر و کار دارد، این نکته ارزش دانستن دارد.
استفادهی مسئولانه
این یک ابزار دانلود عمومی است، و این که آن را روی چه چیزی به کار میگیری انتخاب خودت است. مسئولیت این که حق دانلود و استفاده از هر چیزی که با اکانت خودت به آن دسترسی داری را داشته باشی، با خودت است، همان انتظاری که در استفاده از کلاینت رسمی تلگرام هم وجود دارد.
وضعیت پروژه
| مرحله | وضعیت | |---|---| | M1، ورود با شماره تلفن، کد و رمز دو مرحلهای، حفظ نشست بعد از راهاندازی مجدد | انجام شده، روی یک اکانت واقعی تست شده | | M2، مرور صفحهبندی شدهی رسانهها برای چتهای واقعی | انجام شده | | M3، دانلود تکفایلی با نمایش پیشرفت | انجام شده | | M4، دانلود موازی و تکهتکه | انجام شده | | M5، صف با قابلیت توقف، ادامه، لغو و تلاش مجدد | انجام شده | | M6، ادامه بعد از کرش، همزمانی تطبیقی، پوشهبندی خودکار | پیادهسازی شده، ادامه بعد از کرش هنوز روی طیف کامل اندازههای مختلف فایل تست نشده | | M7، فایل نصب برای ویندوز، مک و لینوکس | فقط ویندوز تا الان. اهداف مک و لینوکس تنظیم شدهاند اما هنوز build و تست نشدهاند، هیچ دستگاه اپل یا لینوکسی این را اجرا نکرده |
چیزهایی که هنوز ساخته نشده و عمداً کنار گذاشته شده: جستجوی بین کانالها، تشخیص فایل تکراری با هش فایل، نمودار نرخ انتقال برای هر اتصال، فایلهای نصب امضا شده که با CI ساخته شوند، و آپدیتر خودکار.
بیلدها امضا نشدهاند، پس SmartScreen ویندوز و Gatekeeper مک هنگام اولین اجرا هشدار میدهند تا وقتی گواهیهای code-signing تنظیم شوند.
اعتبارها
توسعه داده شده توسط یاسر ظریفی.
- ریپازیتوری پروژه: https://github.com/YaserZarifi/TeleDownloader-Telegram-Download-Manager-
- گیتهاب: https://github.com/YaserZarifi
- لینکدین: https://www.linkedin.com/in/mohammad-yaser-zarifi/
مجوز
MIT، فایل LICENSE را ببین. سازگار با مجوز دوگانهی MIT/Apache-2.0 مربوط به grammers.
