چای ۴: خودکارسازی تلگرام، دانلود مدیا‌های یک کانال/گروه

تلگرام به دلیل APIهای فراوانی که ارائه میده، علاوه‌بر اینکه پلتفرم بسیار پویا و خوبیه، قابلیت خودکارسازی بسیار خوبی هم داره. به عنوان نمونه یکی از این خودکار‌سازی‌ها شرایطی را در نظر بگیرین که به هر دلیل نیاز داریم فایل‌های به اشتراک گذاشته شده در یک گروه یا کانال تلگرام را به‌‌صورت دسته‌ای دانلود کنیم، برای مثال، می‌خواهیم ۱۰ فایل آخر، یا فایل‌هایی که پسوند xd. دارند و یا تمامی تصاویر را دانلود کنیم. طبیعتا انجام این‌کار به‌صورت خودکار و برنامه‌نویسی شده بسیار راحت‌تر است. بنابراین در این آموزش با استفاده از پایتون و کتابخونه Telethon تمامی آهنگ‌هایی که در کانال cctracks@ به اشتراک گذاشته شده رو دانلود می‌کنیم.نکتهآهنگ‌هایی که در کانال cctracks@ به اشتراک گذاشته‌شده اند گواهی‌نامه Creative Commons داشته و اشتراک‌گذاری آن‌ها مجاز است.صادقانه خواهش می‌کنم از این روش برای دانلود محتوی دارای حق کپی‌رایت (آهنگ، کتاب و ...) استفاده نکنید. این پست جنبه آموزشی داشته و هدف آن نقض قوانین کپی‌رایت نیست.روشی که در این آموزش استفاده می‌کنیم با توسعه ربات‌های تلگرام متفاوت است، در این روش ما به یک برنامه اجازه می‌دهیم به پلتفرم تلگرام با استفاده از اکانت ما دسترسی داشته باشد. البته کتابخونه Telethon امکان دسترسی به تلگرام به عنوان یک ‌ربات را هم می‌دهد. اما ربات‌های تلگرام قادر به اینکار نیستند و به محتوی گروه‌ها و کانال‌هایی که در آن عضو نیستند دسترسی ندارند.پیش‌نیاز‌هاپایتون ۳+مدیر بسته pipپکیج‌های Telethon و tqdmهمانطور که گفته‌شد برای اینکار نیاز داریم تا یک برنامه با استفاده از اکانت ما به پلتفرم تلگرام وصل شود، برای اینکار نیاز است این برنامه به‌صورتی احراز هویت شود.دریافت اعتبار‌نامه‌هابرای احراز هویت ربات لازم است دو رشته کد api_id و api_hash را از تلگرام دریافت کنیم. برای اینکار وارد my.telegram.org و سپس قسمت API development tools می‌شویم:صفحه API development toolsدر این صفحه اطلاعات مربوط به برنامه، نظیر نام و توضیحات و نوع آن را به دلخواه خود مشخص کرده و با کلیک بر روی Create application کد‌های api_id و api_hash را دریافت کنید.این کد‌ها منحصرا برای شما بوده و نباید به اشتراک گذاشته شوند، حتما توجه کنید که آن‌ها را در دسترسی عموم قرار ندین.با استفاده از این کد‌ها برنامه می‌تواند اقدام به احراز هویت کرده و به اکانت ما دسترسی داشته باشد. خوشبختانه کتابخانه Telethon عمل احراز هویت را بسیار ساده کرده که در ادامه بررسی می‌کنیم.دسترسی به پیام‌های یک کانال/گروه تلگرامپس از دریافت اعتبارنامه‌های لازم (api_id و api_hash) می‌توانیم با استفاده از اون‌ها امکان دسترسی به اکانت خودمون و در نتیجه دسترسی به محتوی کانال/گروه‌هایی که در آن‌ها عضو هستیم را به یک برنامه رابط بدهیم. برای اینکار از پایتون و کتابخونه Telethon استفاده می‌کنیم. Telethon امکان استفاده از API تلگرام را بسیار ساده کرده و می‌توان از آن برای کنترل ربات‌ها و اکانت شخصی استفاده کرد، در واقع با استفاده از آن می‌توان هم به عنوان بات و هم به عنوان یک اکانت حقیقی به تلگرام دسترسی داشت.کتابخونه Telethon به راحتی با pip نصب می‌شود:نکته بهتر است قبل از نصب آن‌ها یک محیط مجازی برای این پروژه بسازیم و بعد اقدام به نصب کنیم. (اختیاری)pip install telethonاحراز هویتدر اولین استفاده نیاز داریم تا اقدام به احراز هویت بکنیم. برای اینکار بدین صورت عمل می‌کنیم:from telethon import TelegramClient, events, sync # These example values won't work. You must get your own api_id and # api_hash from https://my.telegram.org, under API Development. api_id = 12345 api_hash = '0123456789abcdef0123456789abcdef' client = TelegramClient('session_name', api_id, api_hash) client.start()‌با اجرای این کد،‌ از شما خواسته می‌شود یک bot token و یا یک شماره موبایل برای ورود وارد کنید. از اونجایی که ما نیاز به دسترسی به گروه‌ها و کانال‌های خودمون رو داریم شماره خودمون رو وارد می‌کنیم. با وارد کردن شماره موبایل به صورت 989123456789+ پیامی در تلگرام حاوی کد تایید هویت ارسال می‌شود. این کد را وارد می‌کنیم. در ادامه اگر برای اکانتمون cloud password برای Two-step verification تنظیم کرده باشیم، ‌نیاز است تا آن را هم وارد کنیم:احراز هویتدر نهایت یک فایل به نام session_name.session در کنار برنامه ما ذخیره می‌شود که از آن برای احراز هویت استفاده می‌کنیم.توجه کنید که می‌توانیم sessionهای مختلف با هویت‌های مختلف با اعتبارنامه‌هایی که داریم (api_id و api_hash) داشته باشیم.از این به بعد با استفاده از این فایل احراز هویت را انجام داده و دیگر نیاز به مراحل بالا نیست،‌ مگر برای ورود به یک اکانت دیگر.حالا، برای شروع یک پیام به خودمون (saved messages) می‌فرستیم:from telethon.sync import TelegramClient, events api_id = <YOUR APP ID> api_hash = &quot<YOUR API HASH>&quot with TelegramClient('session_name', api_id, api_hash) as client: client.send_message('me', 'Hello, myself!')نتیجه رو می‌تونید تو GIF زیر ببینین:ارسال پیام به خودنکتههمونطور که می‌بینین میشه از TelegramClient به عنوان یک context manager استفاده کرد. همچنین، می‌توانیم به لیست تمامی گروه‌ها و کانال‌هایی که در آن‌ها عضو هستیم به‌صورت زیر دسترسی داشته باشیم:from telethon.sync import TelegramClient, events api_id = <YOUR APP ID> api_hash = &quot<YOUR API HASH>&quot with TelegramClient('session_name', api_id, api_hash) as client: for dialog in client.iter_dialogs(): print(dialog.name, 'has ID', dialog.id)دانلود مدیا‌های یک کانال/گروهحال که کمی با Telethon آشنا شدیم،‌ می‌تونیم مدیا‌های کانال cctracks@ رو دانلود کنیم. اگر در این کانال عضو نیستید عضو شوید و کد زیر را اجرا کنید:from telethon.sync import TelegramClient, events from tqdm import tqdm import os api_id = <YOUR APP ID> api_hash = &quot<YOUR API HASH>&quot with TelegramClient('session_name', api_id, api_hash) as client: messages = client.get_messages('cctracks', limit=50) print(len(messages)) for msg in tqdm(messages): msg_file = msg.file if msg_file and msg_file.mime_type == 'audio/mpeg': msg.download_media(file=os.path.join('musics', msg_file.name))ابتدا با استفاده از متد get_messages و مشخص کردن limit=50، تا ۵۰ پیام آخر کانال را دریافت کردیم. اگر با استفاده از limit تعداد پیام‌ها مشخص نشوند، تنها یک پیام خوانده می‌شود.سپس با استفاده از متد download_media که هر آبجکت پیام (اینجا msg) دارد می‌توانیم به راحتی آن را دانلود کنیم.فایل‌های دانلود شدهاین پست، قسمت چهارم از چای، مجموعه‌ای در باب «چیزی که امروز یادگرفتم» است. باقی چای‌ها رو می‌تونید از اینجا مشاهده کنید و در مورد فلسفه اینکار بخونید.