اتوماسیون
ربات دانلود ویدیو از اینستاگرام و تیکتاک
لینک را میفرستی، ویدیو را همانجا در چت تحویل میگیری. بدون سایت واسط، بدون تبلیغ، بدون ثبتنام. و اگر فایل بزرگ باشد، ربات خودش کیفیت را کم میکند تا زیر سقف ۵۰ مگابایتی تلگرام جا شود.
مشکل چه بود؟
یک ویدیوی کوتاه را میبینی و میخواهی نگهش داری. راه معمولش این است: سایتهای واسط پر از تبلیغ، دکمههای دانلودِ تقلبی، و گاهی درخواست نصب برنامه.
کاری که واقعاً میخواهی یک کار است — گرفتن همان فایل. بقیهاش اضافه است.
چی ساختم؟
یک ربات تلگرام که فقط همین یک کار را میکند. لینک را میفرستی، ویدیو را میفرستد. هیچ فایلی نگه نمیدارد — هر ویدیو در یک پوشهی موقت دانلود میشود و بلافاصله بعد از ارسال پاک میشود.
چطور کار میکند؟
چطور زیر ۵۰ مگابایت نگهش میدارم؟
تلگرام به رباتها اجازه میدهد فایل تا ۵۰ مگابایت بفرستند. یک ویدیوی یکدقیقهای با کیفیت بالا راحت از این سقف رد میشود. پس ربات نباید فقط شکست بخورد — باید خودش راهحل پیدا کند.
ربات یک نردبان کیفیت دارد. اول بهترین حالت را امتحان میکند. فایل را روی دیسک اندازه میگیرد؛ اگر بزرگتر از حد بود، پاکش میکند و یک پله پایینتر میرود.
نسخهی اول نردبان روی اینستاگرام خراب کار میکرد. پلهها بر اساس حجم فایل و ارتفاع تصویر نوشته شده بودند، ولی اینستاگرام هیچکدام را اعلام نمیکند. نتیجه این شد که چهار پله پشتسرهم رد میشدند و ربات ته نردبان — یعنی بدترین کیفیت — را تحویل میداد. هم کند بود، هم بیکیفیت.
راهحل این بود که داخل هر پله چند جایگزین گذاشتم. اگر سایت حجم را نگفت، میرود سراغ ارتفاع؛ اگر آن را هم نگفت، بهترین چیز موجود را برمیدارد. حالا کار معمولی با یک بار دانلود تمام میشود، نه پنج بار.
سقف کیفیت هم روی ۷۲۰p است. روی صفحهی موبایل تفاوتش با ۱۰۸۰p دیده نمیشود، ولی فایل بهمراتب کوچکتر و ارسالش سریعتر است.
یک باگ که پیدا کردنش وقت برد
ویدیوها دانلود میشدند ولی موقع ارسال، کار با خطای «تمام شدن زمان» میمرد. عجیب بود، چون مهلت زمانی را روی ۳۰۰ ثانیه گذاشته بودم.
علتش این بود که python-telegram-bot برای فرستادن فایل
یک تنظیم جداگانه دارد: media_write_timeout — که بهصورت پیشفرض
فقط ۲۰ ثانیه است. آن ۳۰۰ ثانیه اصلاً به فایلها ربطی نداشت.
روی یک اینترنت کند، ۲۰ ثانیه برای فرستادن ویدیو کافی نیست.
وقتی کار پیش نمیرود
هیچوقت خطای خام پایتون به کاربر نشان داده نمیشود. هر حالت پیام فارسی خودش را دارد:
- لینکی که اینستاگرام یا تیکتاک نباشد — درخواست لینک درست
- ویدیوی خصوصی یا پاکشده — گفتن اینکه در دسترس نیست
- فایلی که حتی با کمترین کیفیت هم جا نمیشود — گفتن صادقانهی همین
- اینترنت کند و طولانی شدن ارسال — پیشنهاد دوباره امتحان کردن
با چه ابزارهایی
پایتون، yt-dlp برای گرفتن ویدیو، python-telegram-bot
برای بخش تلگرام، و python-dotenv تا توکن ربات داخل کد نوشته نشود.
ربات با روش polling کار میکند، پس به آدرس اینترنتی عمومی نیاز ندارد و
همین کد بدون تغییر روی هر سروری هم بالا میآید.
نتیجه
یک کار، بدون تبلیغ و بدون واسطه. ربات کیفیت را خودش تنظیم میکند، چیزی از کاربر ذخیره نمیکند، و وقتی کاری از دستش برنمیآید همان را روشن میگوید.