پردازش فایل‌ها (عکس، ویدئو، اسناد) با Telebot در پایتون

فهرست مطالب

پردازش فایل‌ها (عکس، ویدئو، اسناد) با Telebot در پایتون

در دنیای امروز، ربات‌های تلگرام به ابزاری قدرتمند برای اتوماسیون و تعامل تبدیل شده‌اند. یکی از قابلیت‌های اساسی و در عین حال پیچیده این ربات‌ها، توانایی پردازش فایل‌ها است. از مدیریت تصاویر و ویدئوها گرفته تا دستکاری اسناد متنی و صفحات گسترده، Telebot در پایتون بستری انعطاف‌پذیر برای توسعه ربات‌هایی فراهم می‌کند که می‌توانند طیف وسیعی از وظایف مربوط به فایل را انجام دهند. این مقاله به صورت عمیق به بررسی چگونگی استفاده از Telebot در ترکیب با کتابخانه‌های قدرتمند پایتون برای پردازش فایل‌ها (عکس، ویدئو، اسناد) می‌پردازد و راهکارهای عملی و کدهای نمونه‌ای را برای پیاده‌سازی این قابلیت‌ها ارائه می‌دهد.

هدف این مقاله، ارائه یک راهنمای جامع و فنی برای توسعه‌دهندگانی است که قصد دارند ربات‌های تلگرام پیشرفته‌ای بسازند که فراتر از پاسخ‌های متنی ساده عمل کنند. ما از راه‌اندازی اولیه ربات تا پیاده‌سازی منطق‌های پیچیده پردازش فایل و مدیریت خطاها را پوشش خواهیم داد. با ما همراه باشید تا پتانسیل‌های بی‌کران پردازش فایل‌ها با Telebot در پایتون را کشف کنید.

مقدمه: پتانسیل پردازش فایل با Telebot در پایتون

تلگرام با بیش از ۷۰۰ میلیون کاربر فعال ماهانه، یک پلتفرم ارتباطی بسیار پرطرفدار است. ربات‌های تلگرام، که از طریق API قدرتمند تلگرام کنترل می‌شوند، می‌توانند به ابزارهایی باورنکردنی برای افزایش بهره‌وری، سرگرمی، و اتوماسیون تبدیل شوند. در میان انواع تعاملات ممکن با ربات‌ها، پردازش فایل‌ها جایگاه ویژه‌ای دارد.

تصور کنید یک ربات تلگرام که می‌تواند:

  • عکس‌های شما را تغییر اندازه دهد، فیلتر اعمال کند یا واترمارک اضافه کند.
  • ویدئوهای شما را برش دهد، فشرده کند یا به فرمت‌های دیگر تبدیل نماید.
  • اسناد PDF را ادغام کند، تقسیم کند یا متن آن‌ها را استخراج نماید.
  • فایل‌های Word را ویرایش کند یا از داده‌های Excel گزارش تهیه نماید.

این‌ها تنها گوشه‌ای از قابلیت‌هایی است که با ترکیب Telebot و کتابخانه‌های پردازش فایل پایتون می‌توان به آن‌ها دست یافت. Telebot، به عنوان یک wrapper محبوب برای Telegram Bot API در پایتون، با سادگی و قدرت خود، توسعه این نوع ربات‌ها را تسهیل می‌کند. این کتابخانه به شما امکان می‌دهد تا به راحتی پیام‌ها را دریافت و ارسال کنید، از جمله پیام‌هایی که حاوی فایل هستند.

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

راه‌اندازی اولیه Telebot و دریافت فایل‌ها

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

۱. نصب Telebot

اولین گام، نصب کتابخانه pyTelegramBotAPI (که به اختصار Telebot نامیده می‌شود) است. این کار از طریق pip، مدیر بسته پایتون، به راحتی انجام می‌شود:

pip install pyTelegramBotAPI

۲. دریافت توکن ربات از BotFather

برای تعامل با Telegram Bot API، به یک توکن (API Token) نیاز دارید. این توکن را می‌توانید با صحبت با @BotFather در تلگرام دریافت کنید. مراحل به شرح زیر است:

  1. جستجوی @BotFather در تلگرام و شروع مکالمه.
  2. ارسال دستور /newbot.
  3. انتخاب یک نام برای ربات (مثلاً “File Processor Bot”).
  4. انتخاب یک نام کاربری (username) برای ربات که باید به bot ختم شود (مثلاً “file_processor_pypy_bot”).
  5. پس از تکمیل این مراحل، BotFather یک توکن API به شما می‌دهد که چیزی شبیه به 123456789:ABCDefgh1jklMNOpqrstuvwXyz است. این توکن را به دقت نگهداری کنید و هرگز آن را به اشتراک نگذارید.

۳. کد اولیه ربات برای دریافت و دانلود فایل‌ها

ربات تلگرام ما برای پردازش فایل‌ها باید قادر باشد فایل‌های دریافتی را تشخیص داده و آن‌ها را دانلود کند. Telegram Bot API انواع مختلفی از فایل‌ها را با فیلدهای مشخصی در شیء پیام (Message Object) نمایش می‌دهد:

  • عکس‌ها (Photos): در فیلد message.photo قرار دارند. این فیلد لیستی از اشیاء PhotoSize است که هر کدام نسخه متفاوتی از عکس (اندازه‌های مختلف) را نشان می‌دهند. بزرگترین عکس معمولاً آخرین مورد در لیست است.
  • ویدئوها (Videos): در فیلد message.video قرار دارند.
  • اسناد (Documents): در فیلد message.document قرار دارند. این فیلد شامل انواع فایل‌ها از جمله PDF، Word، Excel و غیره است.
  • صداها (Audio): در فیلد message.audio قرار دارند.
  • پیام‌های صوتی (Voice): در فیلد message.voice قرار دارند.

برای سادگی، ما یک هندلر کلی برای content_types=['document', 'photo', 'video', 'audio', 'voice'] تعریف می‌کنیم تا بتوانیم هر نوع فایلی را مدیریت کنیم.


import telebot
import os

# توکن ربات خود را اینجا قرار دهید
API_TOKEN = 'YOUR_BOT_TOKEN' 

bot = telebot.TeleBot(API_TOKEN)

# مسیر ذخیره فایل‌ها
DOWNLOAD_FOLDER = 'downloaded_files'
if not os.path.exists(DOWNLOAD_FOLDER):
    os.makedirs(DOWNLOAD_FOLDER)

@bot.message_handler(content_types=['document', 'photo', 'video', 'audio', 'voice'])
def handle_file_messages(message):
    try:
        file_info = None
        file_name = None

        if message.document:
            file_info = bot.get_file(message.document.file_id)
            file_name = message.document.file_name
        elif message.photo:
            # بزرگترین عکس را انتخاب می‌کنیم (آخرین مورد در لیست photo)
            file_info = bot.get_file(message.photo[-1].file_id)
            file_name = f"photo_{message.photo[-1].file_id}.jpg" # نام پیش‌فرض برای عکس
        elif message.video:
            file_info = bot.get_file(message.video.file_id)
            file_name = message.video.file_name if message.video.file_name else f"video_{message.video.file_id}.mp4"
        elif message.audio:
            file_info = bot.get_file(message.audio.file_id)
            file_name = message.audio.file_name if message.audio.file_name else f"audio_{message.audio.file_id}.mp3"
        elif message.voice:
            file_info = bot.get_file(message.voice.file_id)
            file_name = f"voice_{message.voice.file_id}.ogg" # فرمت معمول برای پیام صوتی

        if file_info and file_name:
            downloaded_file = bot.download_file(file_info.file_path)
            
            # پاک‌سازی نام فایل برای جلوگیری از مشکلات مسیر
            safe_file_name = "".join([c for c in file_name if c.isalnum() or c in ('.', '_', '-')]).strip()
            # اگر نام فایل پسوند نداشت، بر اساس نوع فایل یک پسوند اضافه می‌کنیم.
            if '.' not in safe_file_name:
                if message.document:
                    safe_file_name += f".{message.document.mime_type.split('/')[-1]}" if message.document.mime_type else ".bin"
                elif message.photo:
                    safe_file_name += ".jpg"
                elif message.video:
                    safe_file_name += ".mp4"
                elif message.audio:
                    safe_file_name += ".mp3"
                elif message.voice:
                    safe_file_name += ".ogg"


            file_path = os.path.join(DOWNLOAD_FOLDER, safe_file_name)
            with open(file_path, 'wb') as new_file:
                new_file.write(downloaded_file)
            
            bot.reply_to(message, f"فایل شما دریافت شد: {safe_file_name}\nدر مسیر {file_path} ذخیره شد.")
            print(f"File saved: {file_path}")

            # اینجا می‌توانید منطق پردازش فایل را اضافه کنید
            # process_file(file_path, message)

        else:
            bot.reply_to(message, "نوع فایل نامشخص است یا مشکلی در دریافت فایل پیش آمده است.")

    except Exception as e:
        bot.reply_to(message, f"خطا در پردازش فایل: {e}")
        print(f"Error handling file message: {e}")

@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
    bot.reply_to(message, "سلام! من یک ربات برای پردازش فایل هستم. یک عکس، ویدئو یا سند برای من ارسال کنید.")

print("Bot is running...")
bot.polling(none_stop=True)

در کد بالا:

  • API_TOKEN را با توکن واقعی ربات خود جایگزین کنید.
  • یک پوشه downloaded_files برای ذخیره فایل‌ها ایجاد می‌کنیم.
  • تابع handle_file_messages هر پیامی را که شامل سند، عکس، ویدئو، صدا یا پیام صوتی باشد، دریافت می‌کند.
  • با استفاده از bot.get_file(file_id) اطلاعات فایل از جمله file_path آن در سرور تلگرام را بدست می‌آوریم.
  • با bot.download_file(file_info.file_path) محتوای فایل را دانلود می‌کنیم.
  • فایل دانلود شده را در پوشه downloaded_files ذخیره می‌کنیم.
  • یک پاسخ تاییدیه به کاربر ارسال می‌شود.
  • بخش # process_file(file_path, message) جایی است که منطق پردازش فایل شما وارد می‌شود.

با این ساختار پایه، ربات شما قادر به دریافت و ذخیره فایل‌های مختلف است. در بخش‌های بعدی، به تفصیل نحوه پردازش این فایل‌ها با استفاده از کتابخانه‌های مختلف پایتون را بررسی خواهیم کرد.

پردازش تصاویر با Telebot و کتابخانه Pillow

تصاویر یکی از رایج‌ترین انواع فایل‌هایی هستند که کاربران در تلگرام به اشتراک می‌گذارند. پردازش تصاویر می‌تواند شامل عملیاتی نظیر تغییر اندازه (resize)، واترمارک‌گذاری (watermark)، اعمال فیلترها (filters)، چرخش (rotate) و برش (crop) باشد. کتابخانه قدرتمند Pillow (که یک fork از PIL – Python Imaging Library است) بهترین انتخاب برای این وظایف در پایتون محسوب می‌شود.

۱. نصب Pillow

ابتدا باید کتابخانه Pillow را نصب کنید:

pip install Pillow

۲. تغییر اندازه تصاویر (Resizing Images)

یکی از متداول‌ترین نیازها، تغییر اندازه تصاویر است. فرض کنید می‌خواهیم تمام عکس‌های دریافتی را به یک اندازه خاص، مثلاً 300×300 پیکسل، تغییر اندازه دهیم.


from PIL import Image
import os
import telebot

# ... (بخش‌های مربوط به API_TOKEN، bot، و DOWNLOAD_FOLDER از کد قبلی) ...

# تابعی برای پردازش عکس
def process_image(input_path, output_path, target_size=(300, 300)):
    try:
        with Image.open(input_path) as img:
            img.thumbnail(target_size) # thumbnail ابعاد را حفظ می‌کند و تصویر را متناسب می‌کند
            # اگر می‌خواهید ابعاد دقیقاً target_size شود و بخش‌هایی از تصویر ممکن است کراپ شود:
            # img = img.resize(target_size) 
            img.save(output_path)
        return True
    except Exception as e:
        print(f"Error processing image {input_path}: {e}")
        return False

@bot.message_handler(content_types=['photo'])
def handle_photo_messages(message):
    try:
        file_info = bot.get_file(message.photo[-1].file_id)
        original_file_name = f"photo_{message.photo[-1].file_id}.jpg"
        input_file_path = os.path.join(DOWNLOAD_FOLDER, original_file_name)

        downloaded_file = bot.download_file(file_info.file_path)
        with open(input_file_path, 'wb') as new_file:
            new_file.write(downloaded_file)
        
        bot.reply_to(message, "عکس شما دریافت شد. در حال پردازش...")

        processed_file_name = f"resized_{original_file_name}"
        output_file_path = os.path.join(DOWNLOAD_FOLDER, processed_file_name)

        if process_image(input_file_path, output_file_path, target_size=(500, 500)):
            with open(output_file_path, 'rb') as processed_photo:
                bot.send_photo(message.chat.id, processed_photo, caption="عکس تغییر اندازه یافته:")
            bot.reply_to(message, "عکس با موفقیت تغییر اندازه داده شد و ارسال گردید.")
        else:
            bot.reply_to(message, "خطا در تغییر اندازه عکس.")

        # حذف فایل‌های موقت برای صرفه‌جویی در فضا
        os.remove(input_file_path)
        if os.path.exists(output_file_path):
            os.remove(output_file_path)

    except Exception as e:
        bot.reply_to(message, f"خطا در پردازش عکس: {e}")
        print(f"Error handling photo message: {e}")

# ... (بخش‌های مربوط به send_welcome و bot.polling از کد قبلی) ...

در این کد، handle_photo_messages عکس را دانلود می‌کند، process_image با استفاده از Pillow آن را تغییر اندازه می‌دهد و سپس ربات عکس پردازش شده را به کاربر بازمی‌گرداند. استفاده از img.thumbnail() ابعاد تصویر را به گونه‌ای کاهش می‌دهد که هیچ بخشی از آن از دست نرود، در حالی که img.resize() ابعاد دقیقاً به اندازه مورد نظر می‌رسد و ممکن است تصویر را کشیده یا فشرده کند.

۳. واترمارک‌گذاری روی تصاویر (Watermarking Images)

افزودن واترمارک برای محافظت از تصاویر یا برندسازی بسیار مفید است. برای این کار، به یک تصویر واترمارک (مثلاً یک لوگو) و کمی عملیات alpha blending نیاز داریم.


# ... (کد قبلی شامل imports و setup) ...

# یک فایل واترمارک نمونه لازم است. مثلاً "watermark.png" در پوشه DOWNLOAD_FOLDER
# این فایل باید از قبل وجود داشته باشد یا توسط ربات آپلود شده باشد.

def add_watermark(input_path, output_path, watermark_path, position=(10, 10), opacity=0.5):
    try:
        base_image = Image.open(input_path).convert("RGBA")
        watermark_image = Image.open(watermark_path).convert("RGBA")

        # تغییر اندازه واترمارک در صورت نیاز
        # watermark_image = watermark_image.resize((base_image.width // 4, base_image.height // 4))

        # ساخت یک ماسک آلفا برای واترمارک
        alpha = watermark_image.split()[3]
        alpha = Image.eval(alpha, lambda x: x * opacity)
        watermark_image.putalpha(alpha)

        # ساخت یک تصویر شفاف جدید به اندازه تصویر اصلی برای قرار دادن واترمارک
        temp_image = Image.new('RGBA', base_image.size, (255, 255, 255, 0))
        temp_image.paste(watermark_image, position)

        # ترکیب واترمارک با تصویر اصلی
        watermarked_image = Image.alpha_composite(base_image, temp_image)
        
        # ذخیره تصویر نهایی (می‌توانید به فرمت JPG هم ذخیره کنید، اما شفافیت از بین می‌رود)
        watermarked_image.convert("RGB").save(output_path, "JPEG") 
        return True
    except Exception as e:
        print(f"Error adding watermark to {input_path}: {e}")
        return False

@bot.message_handler(commands=['watermark'])
def send_watermark_instruction(message):
    bot.reply_to(message, "لطفا عکسی را برای واترمارک‌گذاری ارسال کنید.")

@bot.message_handler(content_types=['photo'], func=lambda message: message.reply_to_message and message.reply_to_message.text == "لطفا عکسی را برای واترمارک‌گذاری ارسال کنید.")
def handle_watermark_photo(message):
    try:
        # مشابه بخش دانلود عکس در مثال تغییر اندازه
        file_info = bot.get_file(message.photo[-1].file_id)
        original_file_name = f"photo_{message.photo[-1].file_id}.jpg"
        input_file_path = os.path.join(DOWNLOAD_FOLDER, original_file_name)
        downloaded_file = bot.download_file(file_info.file_path)
        with open(input_file_path, 'wb') as new_file:
            new_file.write(downloaded_file)
        
        bot.reply_to(message, "عکس شما دریافت شد. در حال اعمال واترمارک...")

        watermark_file_path = os.path.join(DOWNLOAD_FOLDER, "watermark.png") # فرض کنید این فایل از قبل وجود دارد

        if not os.path.exists(watermark_file_path):
            bot.reply_to(message, "فایل واترمارک (watermark.png) یافت نشد. لطفا آن را در پوشه downloaded_files قرار دهید.")
            os.remove(input_file_path)
            return

        processed_file_name = f"watermarked_{original_file_name}"
        output_file_path = os.path.join(DOWNLOAD_FOLDER, processed_file_name)

        if add_watermark(input_file_path, output_file_path, watermark_file_path, position=(50, 50), opacity=0.7):
            with open(output_file_path, 'rb') as processed_photo:
                bot.send_photo(message.chat.id, processed_photo, caption="عکس واترمارک‌دار:")
            bot.reply_to(message, "واترمارک با موفقیت اعمال شد و ارسال گردید.")
        else:
            bot.reply_to(message, "خطا در اعمال واترمارک.")

        os.remove(input_file_path)
        if os.path.exists(output_file_path):
            os.remove(output_file_path)

    except Exception as e:
        bot.reply_to(message, f"خطا در پردازش عکس برای واترمارک: {e}")
        print(f"Error handling watermark photo message: {e}")

این مثال از یک مکانیزم ساده reply_to_message برای شناسایی عکس‌هایی که قرار است واترمارک شوند، استفاده می‌کند. همچنین، شما باید یک فایل watermark.png در مسیر مشخص شده داشته باشید. این تابع می‌تواند با تنظیم موقعیت و شفافیت، واترمارک را به تصویر اضافه کند.

۴. اعمال فیلترهای ساده (Applying Simple Filters)

Pillow همچنین امکان اعمال فیلترهای مختلف را فراهم می‌کند. در اینجا یک مثال برای تبدیل تصویر به خاکستری (grayscale) و اعمال فیلتر بلور (blur) آورده شده است.


from PIL import Image, ImageFilter
import os
import telebot

# ... (کد قبلی شامل imports و setup) ...

def apply_grayscale_filter(input_path, output_path):
    try:
        with Image.open(input_path) as img:
            grayscale_img = img.convert("L") # "L" برای حالت خاکستری (Luminance)
            grayscale_img.save(output_path, "JPEG")
        return True
    except Exception as e:
        print(f"Error applying grayscale filter to {input_path}: {e}")
        return False

def apply_blur_filter(input_path, output_path, radius=2):
    try:
        with Image.open(input_path) as img:
            blurred_img = img.filter(ImageFilter.GaussianBlur(radius))
            blurred_img.save(output_path, "JPEG")
        return True
    except Exception as e:
        print(f"Error applying blur filter to {input_path}: {e}")
        return False

@bot.message_handler(commands=['grayscale', 'blur'])
def handle_filter_commands(message):
    bot.reply_to(message, f"لطفا عکسی را برای اعمال فیلتر {message.text} ارسال کنید.")

@bot.message_handler(content_types=['photo'], func=lambda message: message.reply_to_message and message.reply_to_message.text and "لطفا عکسی را برای اعمال فیلتر" in message.reply_to_message.text)
def handle_filter_photo(message):
    try:
        command = message.reply_to_message.text.split()[-2] # استخراج 'grayscale' یا 'blur'
        
        file_info = bot.get_file(message.photo[-1].file_id)
        original_file_name = f"photo_{message.photo[-1].file_id}.jpg"
        input_file_path = os.path.join(DOWNLOAD_FOLDER, original_file_name)
        downloaded_file = bot.download_file(file_info.file_path)
        with open(input_file_path, 'wb') as new_file:
            new_file.write(downloaded_file)
        
        bot.reply_to(message, f"عکس شما دریافت شد. در حال اعمال فیلتر {command}...")

        processed_file_name = f"{command}_{original_file_name}"
        output_file_path = os.path.join(DOWNLOAD_FOLDER, processed_file_name)
        
        success = False
        if command == "/grayscale":
            success = apply_grayscale_filter(input_file_path, output_file_path)
        elif command == "/blur":
            success = apply_blur_filter(input_file_path, output_file_path, radius=5) # شعاع بلور را می‌توان تغییر داد

        if success:
            with open(output_file_path, 'rb') as processed_photo:
                bot.send_photo(message.chat.id, processed_photo, caption=f"عکس با فیلتر {command}:")
            bot.reply_to(message, f"فیلتر {command} با موفقیت اعمال شد و ارسال گردید.")
        else:
            bot.reply_to(message, f"خطا در اعمال فیلتر {command}.")

        os.remove(input_file_path)
        if os.path.exists(output_file_path):
            os.remove(output_file_path)

    except Exception as e:
        bot.reply_to(message, f"خطا در پردازش عکس برای فیلتر: {e}")
        print(f"Error handling filter photo message: {e}")

# ... (بخش‌های مربوط به send_welcome و bot.polling از کد قبلی) ...

در این بخش، ما یک ساختار کلی برای پردازش تصاویر با Telebot و Pillow ارائه دادیم. می‌توانید این مثال‌ها را گسترش دهید و فیلترهای پیچیده‌تر، عملیات برش، چرخش، یا ترکیب چند تصویر را پیاده‌سازی کنید. نکته مهم در تمامی این عملیات، مدیریت فایل‌های موقت و حذف آن‌ها پس از اتمام کار است تا از پر شدن فضای دیسک سرور جلوگیری شود.

پردازش ویدئوها: برش، فشرده‌سازی و افزودن متن با MoviePy و OpenCV

پردازش ویدئوها یکی از چالش‌برانگیزترین بخش‌ها در پردازش فایل‌ها است، عمدتاً به دلیل حجم بالای داده و پیچیدگی‌های مرتبط با کدگذاری و رمزگشایی. برای این منظور، کتابخانه‌های MoviePy و OpenCV ابزارهای بسیار قدرتمندی در پایتون هستند.

۱. نصب MoviePy و OpenCV

برای شروع، این دو کتابخانه را نصب کنید. MoviePy به ffmpeg برای کارهای پس‌زمینه نیاز دارد، که معمولاً به صورت خودکار توسط MoviePy مدیریت می‌شود، اما ممکن است در برخی سیستم‌ها نیاز به نصب دستی داشته باشد. OpenCV نیز برای کارهایی مانند تحلیل فریم به فریم مفید است.

pip install moviepy opencv-python

۲. برش ویدئو (Trimming Videos)

برش ویدئو به معنی حذف قسمت‌های ناخواسته از ابتدا یا انتهای آن است. MoviePy این کار را به سادگی انجام می‌دهد.


from moviepy.editor import VideoFileClip
import os
import telebot

# ... (بخش‌های مربوط به API_TOKEN، bot، و DOWNLOAD_FOLDER از کد قبلی) ...

# تابعی برای برش ویدئو
def trim_video(input_path, output_path, start_time, end_time):
    try:
        clip = VideoFileClip(input_path)
        trimmed_clip = clip.subclip(start_time, end_time)
        trimmed_clip.write_videofile(output_path, codec="libx264") # استفاده از کدک H.264
        clip.close()
        trimmed_clip.close()
        return True
    except Exception as e:
        print(f"Error trimming video {input_path}: {e}")
        return False

@bot.message_handler(commands=['trim'])
def send_trim_instruction(message):
    bot.reply_to(message, "لطفا یک ویدئو برای برش ارسال کنید. سپس با فرمت '/set_trim_time start_sec end_sec' زمان‌های برش را ارسال کنید.")

# این هندلر ویدئو را دانلود می‌کند
@bot.message_handler(content_types=['video'], func=lambda message: message.reply_to_message and message.reply_to_message.text == "لطفا یک ویدئو برای برش ارسال کنید. سپس با فرمت '/set_trim_time start_sec end_sec' زمان‌های برش را ارسال کنید.")
def handle_video_for_trim(message):
    try:
        file_info = bot.get_file(message.video.file_id)
        original_file_name = message.video.file_name if message.video.file_name else f"video_{message.video.file_id}.mp4"
        input_file_path = os.path.join(DOWNLOAD_FOLDER, original_file_name)
        downloaded_file = bot.download_file(file_info.file_path)
        with open(input_file_path, 'wb') as new_file:
            new_file.write(downloaded_file)
        
        bot.reply_to(message, f"ویدئو دریافت شد: {original_file_name}. اکنون زمان‌های برش را ارسال کنید (مثال: /set_trim_time 10 30)")

    except Exception as e:
        bot.reply_to(message, f"خطا در دریافت ویدئو: {e}")
        print(f"Error handling video for trim: {e}")

# این هندلر زمان‌های برش را دریافت و ویدئو را پردازش می‌کند
@bot.message_handler(commands=['set_trim_time'])
def handle_trim_time(message):
    try:
        if not message.reply_to_message or not message.reply_to_message.video:
            bot.reply_to(message, "لطفا این دستور را در پاسخ به ویدئویی که قبلا فرستاده‌اید، استفاده کنید.")
            return

        parts = message.text.split()
        if len(parts) != 3:
            bot.reply_to(message, "فرمت دستور اشتباه است. باید '/set_trim_time start_sec end_sec' باشد.")
            return
        
        start_time = int(parts[1])
        end_time = int(parts[2])

        # پیدا کردن مسیر فایل ویدئوی اصلی
        original_file_name = message.reply_to_message.video.file_name if message.reply_to_message.video.file_name else f"video_{message.reply_to_message.video.file_id}.mp4"
        input_file_path = os.path.join(DOWNLOAD_FOLDER, original_file_name)

        if not os.path.exists(input_file_path):
            bot.reply_to(message, "ویدئوی اصلی یافت نشد. لطفا ابتدا ویدئو را ارسال کنید.")
            return
        
        bot.reply_to(message, "در حال برش ویدئو... لطفا صبر کنید.")

        processed_file_name = f"trimmed_{original_file_name}"
        output_file_path = os.path.join(DOWNLOAD_FOLDER, processed_file_name)

        if trim_video(input_file_path, output_file_path, start_time, end_time):
            with open(output_file_path, 'rb') as processed_video:
                bot.send_video(message.chat.id, processed_video, caption=f"ویدئو برش خورده از {start_time} تا {end_time} ثانیه:")
            bot.reply_to(message, "ویدئو با موفقیت برش خورد و ارسال گردید.")
        else:
            bot.reply_to(message, "خطا در برش ویدئو.")

        os.remove(input_file_path)
        if os.path.exists(output_file_path):
            os.remove(output_file_path)

    except Exception as e:
        bot.reply_to(message, f"خطا در پردازش برش ویدئو: {e}")
        print(f"Error handling trim time: {e}")

این مثال از دو هندلر برای مدیریت برش ویدئو استفاده می‌کند: یکی برای دریافت ویدئو و دیگری برای دریافت زمان‌های برش. این روش تعامل به کاربر انعطاف‌پذیری بیشتری می‌دهد. برش ویدئو می‌تواند بسیار زمان‌بر باشد، مخصوصاً برای فایل‌های بزرگ.

۳. فشرده‌سازی و افزودن متن به ویدئو (Compression and Adding Text to Videos)

فشرده‌سازی ویدئوها برای کاهش حجم و سهولت در اشتراک‌گذاری اهمیت دارد. MoviePy به شما امکان می‌دهد تا با تغییر پارامترهای کدک، ویدئو را فشرده کنید. همچنین می‌توانید متن یا لوگو به ویدئو اضافه کنید.


from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
import os
import telebot

# ... (کد قبلی شامل imports و setup) ...

# تابعی برای فشرده‌سازی و اضافه کردن متن به ویدئو
def compress_and_add_text_to_video(input_path, output_path, text="Telebot!", font_size=50, color='white', duration=None):
    try:
        clip = VideoFileClip(input_path)
        
        # اگر مدت زمان مشخص نشده، از کل مدت ویدئو استفاده می‌کنیم
        if duration is None:
            duration = clip.duration

        # ایجاد متن
        txt_clip = TextClip(text, fontsize=font_size, color=color, font='Arial-Bold').set_duration(duration)
        txt_clip = txt_clip.set_position(('center', 'top')) # مثلاً در مرکز و بالای تصویر

        # ترکیب ویدئو با متن
        final_clip = CompositeVideoClip([clip, txt_clip])

        # نوشتن فایل خروجی با کیفیت پایین‌تر برای فشرده‌سازی
        final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", bitrate="1000k") # کاهش bitrate
        
        clip.close()
        txt_clip.close()
        final_clip.close()
        return True
    except Exception as e:
        print(f"Error compressing and adding text to video {input_path}: {e}")
        return False

@bot.message_handler(commands=['compress_text'])
def send_compress_text_instruction(message):
    bot.reply_to(message, "لطفا یک ویدئو برای فشرده‌سازی و افزودن متن ارسال کنید.")

@bot.message_handler(content_types=['video'], func=lambda message: message.reply_to_message and message.reply_to_message.text == "لطفا یک ویدئو برای فشرده‌سازی و افزودن متن ارسال کنید.")
def handle_video_for_compress_text(message):
    try:
        file_info = bot.get_file(message.video.file_id)
        original_file_name = message.video.file_name if message.video.file_name else f"video_{message.video.file_id}.mp4"
        input_file_path = os.path.join(DOWNLOAD_FOLDER, original_file_name)
        downloaded_file = bot.download_file(file_info.file_path)
        with open(input_file_path, 'wb') as new_file:
            new_file.write(downloaded_file)
        
        bot.reply_to(message, "ویدئو دریافت شد. در حال فشرده‌سازی و افزودن متن... لطفا صبر کنید.")

        processed_file_name = f"compressed_text_{original_file_name}"
        output_file_path = os.path.join(DOWNLOAD_FOLDER, processed_file_name)

        if compress_and_add_text_to_video(input_file_path, output_file_path, text="Powered by Telebot!", font_size=40, color='yellow'):
            with open(output_file_path, 'rb') as processed_video:
                bot.send_video(message.chat.id, processed_video, caption="ویدئو فشرده و با متن اضافه شده:")
            bot.reply_to(message, "ویدئو با موفقیت فشرده و متن به آن اضافه شد.")
        else:
            bot.reply_to(message, "خطا در فشرده‌سازی و افزودن متن به ویدئو.")

        os.remove(input_file_path)
        if os.path.exists(output_file_path):
            os.remove(output_file_path)

    except Exception as e:
        bot.reply_to(message, f"خطا در پردازش ویدئو برای فشرده‌سازی و متن: {e}")
        print(f"Error handling video for compress and text: {e}")

# ... (بخش‌های مربوط به send_welcome و bot.polling از کد قبلی) ...

در تابع compress_and_add_text_to_video، ما از پارامتر bitrate در write_videofile برای کنترل کیفیت و در نتیجه حجم فایل خروجی استفاده می‌کنیم. کاهش bitrate منجر به فشرده‌سازی بیشتر می‌شود. همچنین، TextClip ابزاری عالی برای اضافه کردن متن به ویدئو است. می‌توانید فونت، رنگ، اندازه و موقعیت متن را تنظیم کنید.

۴. نکات مهم در پردازش ویدئو

  • مصرف منابع: پردازش ویدئو به شدت به CPU و RAM نیاز دارد. برای ویدئوهای طولانی و با کیفیت بالا، ممکن است زمان زیادی طول بکشد و منابع سرور را به شدت درگیر کند.
  • حجم فایل: فایل‌های ویدئویی می‌توانند بسیار بزرگ باشند. مطمئن شوید که سرور شما فضای کافی برای ذخیره موقت فایل‌های ورودی و خروجی را دارد.
  • محدودیت‌های تلگرام: تلگرام نیز محدودیت‌هایی برای حجم فایل ارسالی دارد (در حال حاضر تا ۲ گیگابایت). ربات شما باید بتواند فایل‌هایی که از این حجم فراتر می‌روند را مدیریت کند.
  • کتابخانه OpenCV: برای پردازش‌های پیچیده‌تر مانند تشخیص حرکت، تشخیص چهره، یا اعمال افکت‌های فریم به فریم، می‌توانید از OpenCV در کنار MoviePy استفاده کنید. MoviePy به شما اجازه می‌دهد تا فریم‌های ویدئو را به عنوان اشیاء Pillow یا آرایه‌های NumPy استخراج کنید، که با OpenCV سازگار هستند.

پردازش ویدئوها با Telebot یک قابلیت بسیار قدرتمند است، اما نیازمند برنامه‌ریزی دقیق برای مدیریت منابع و زمان است. با استفاده از این تکنیک‌ها، می‌توانید ربات‌های تلگرام با قابلیت‌های ویدئویی بسیار جذاب و کاربردی ایجاد کنید.

پردازش اسناد: PDF، Word و Excel با Telebot

مدیریت و پردازش اسناد از قبیل فایل‌های PDF، Word و Excel، یکی دیگر از کاربردهای قدرتمند ربات‌های تلگرام است. این قابلیت به کاربران امکان می‌دهد تا وظایف اداری و داده‌محور را به صورت خودکار انجام دهند. در این بخش، به بررسی کتابخانه‌های پایتون برای هر نوع سند می‌پردازیم.

۱. پردازش فایل‌های PDF با PyPDF2 و ReportLab

فایل‌های PDF (Portable Document Format) به دلیل استاندارد بودن و حفظ قالب‌بندی در پلتفرم‌های مختلف، بسیار رایج هستند. PyPDF2 (یا PyPDF) یک کتابخانه قدرتمند برای خواندن، ویرایش و ترکیب فایل‌های PDF است، در حالی که ReportLab برای تولید PDF از ابتدا کاربرد دارد.

نصب PyPDF2

pip install PyPDF2

ادغام فایل‌های PDF (Merging PDF Files)

یکی از عملیات رایج، ادغام چندین فایل PDF به یک فایل واحد است.


from PyPDF2 import PdfMerger
import os
import telebot

# ... (بخش‌های مربوط به API_TOKEN، bot، و DOWNLOAD_FOLDER از کد قبلی) ...

# تابعی برای ادغام فایل‌های PDF
def merge_pdfs(input_paths, output_path):
    try:
        merger = PdfMerger()
        for pdf in input_paths:
            merger.append(pdf)
        merger.write(output_path)
        merger.close()
        return True
    except Exception as e:
        print(f"Error merging PDFs: {e}")
        return False

# ذخیره‌سازی فایل‌های PDF برای ادغام
pdf_files_to_merge = {} # دیکشنری برای نگهداری فایل‌های PDF هر کاربر

@bot.message_handler(commands=['merge_pdf_start'])
def start_merge_pdf(message):
    bot.reply_to(message, "لطفا فایل‌های PDF مورد نظر برای ادغام را یکی یکی ارسال کنید. پس از اتمام، دستور /merge_pdf_done را ارسال کنید.")
    pdf_files_to_merge[message.chat.id] = []

@bot.message_handler(content_types=['document'], func=lambda message: message.document.mime_type == 'application/pdf' and message.chat.id in pdf_files_to_merge)
def handle_pdf_for_merge(message):
    try:
        file_info = bot.get_file(message.document.file_id)
        file_name = message.document.file_name
        input_file_path = os.path.join(DOWNLOAD_FOLDER, file_name)
        
        downloaded_file = bot.download_file(file_info.file_path)
        with open(input_file_path, 'wb') as new_file:
            new_file.write(downloaded_file)
        
        pdf_files_to_merge[message.chat.id].append(input_file_path)
        bot.reply_to(message, f"فایل '{file_name}' برای ادغام اضافه شد. می‌توانید فایل PDF دیگری ارسال کنید یا برای اتمام /merge_pdf_done را ارسال کنید.")
    except Exception as e:
        bot.reply_to(message, f"خطا در دریافت فایل PDF: {e}")
        print(f"Error handling PDF for merge: {e}")

@bot.message_handler(commands=['merge_pdf_done'])
def finish_merge_pdf(message):
    chat_id = message.chat.id
    if chat_id not in pdf_files_to_merge or not pdf_files_to_merge[chat_id]:
        bot.reply_to(message, "هیچ فایل PDF برای ادغام یافت نشد. لطفا ابتدا فایل‌ها را ارسال کنید.")
        return
    
    if len(pdf_files_to_merge[chat_id]) < 2:
        bot.reply_to(message, "برای ادغام حداقل به دو فایل PDF نیاز دارید.")
        del pdf_files_to_merge[chat_id] # پاک کردن لیست برای این کاربر
        return

    bot.reply_to(message, "در حال ادغام فایل‌های PDF... لطفا صبر کنید.")
    
    output_file_name = f"merged_pdfs_{chat_id}.pdf"
    output_file_path = os.path.join(DOWNLOAD_FOLDER, output_file_name)

    if merge_pdfs(pdf_files_to_merge[chat_id], output_file_path):
        with open(output_file_path, 'rb') as merged_pdf:
            bot.send_document(chat_id, merged_pdf, caption="فایل‌های PDF ادغام شده:")
        bot.reply_to(message, "ادغام با موفقیت انجام شد و فایل ارسال گردید.")
    else:
        bot.reply_to(message, "خطا در ادغام فایل‌های PDF.")

    # حذف فایل‌های موقت
    for f_path in pdf_files_to_merge[chat_id]:
        if os.path.exists(f_path):
            os.remove(f_path)
    if os.path.exists(output_file_path):
        os.remove(output_file_path)
    
    del pdf_files_to_merge[chat_id]

این کد یک مکانیزم چند مرحله‌ای برای دریافت چندین فایل PDF و سپس ادغام آن‌ها ارائه می‌دهد. از دیکشنری pdf_files_to_merge برای ذخیره مسیر فایل‌های هر کاربر استفاده می‌شود.

۲. پردازش فایل‌های Word با python-docx

فایل‌های Word (با پسوند .docx) نیز از اسناد رایج هستند. کتابخانه python-docx به شما امکان می‌دهد تا اسناد Word را ایجاد، باز، و ویرایش کنید.

نصب python-docx

pip install python-docx

خواندن و ویرایش متن در فایل Word


from docx import Document
import os
import telebot

# ... (بخش‌های مربوط به API_TOKEN، bot، و DOWNLOAD_FOLDER از کد قبلی) ...

# تابعی برای خواندن و اضافه کردن متن به یک سند Word
def modify_word_document(input_path, output_path, text_to_add="این متن توسط ربات تلگرام اضافه شده است."):
    try:
        document = Document(input_path)
        document.add_paragraph(text_to_add)
        document.save(output_path)
        return True
    except Exception as e:
        print(f"Error modifying Word document {input_path}: {e}")
        return False

@bot.message_handler(commands=['modify_word'])
def send_modify_word_instruction(message):
    bot.reply_to(message, "لطفا یک فایل Word (.docx) ارسال کنید تا متن به آن اضافه شود.")

@bot.message_handler(content_types=['document'], func=lambda message: message.document.mime_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')
def handle_word_document(message):
    try:
        file_info = bot.get_file(message.document.file_id)
        file_name = message.document.file_name
        input_file_path = os.path.join(DOWNLOAD_FOLDER, file_name)
        
        downloaded_file = bot.download_file(file_info.file_path)
        with open(input_file_path, 'wb') as new_file:
            new_file.write(downloaded_file)
        
        bot.reply_to(message, "فایل Word دریافت شد. در حال ویرایش...")

        processed_file_name = f"modified_{file_name}"
        output_file_path = os.path.join(DOWNLOAD_FOLDER, processed_file_name)

        if modify_word_document(input_file_path, output_file_path, text_to_add=f"تاریخ ویرایش: {telebot.util.to_datetime(message.date)}"):
            with open(output_file_path, 'rb') as modified_doc:
                bot.send_document(message.chat.id, modified_doc, caption="فایل Word ویرایش شده:")
            bot.reply_to(message, "فایل Word با موفقیت ویرایش شد و ارسال گردید.")
        else:
            bot.reply_to(message, "خطا در ویرایش فایل Word.")

        os.remove(input_file_path)
        if os.path.exists(output_file_path):
            os.remove(output_file_path)

    except Exception as e:
        bot.reply_to(message, f"خطا در پردازش فایل Word: {e}")
        print(f"Error handling Word document: {e}")

این مثال نشان می‌دهد که چگونه یک پاراگراف جدید به یک سند Word موجود اضافه کنید. python-docx قابلیت‌های بسیار گسترده‌تری از جمله کار با جداول، تصاویر، و استایل‌ها را نیز دارد.

۳. پردازش فایل‌های Excel با openpyxl

فایل‌های Excel (با پسوندهای .xlsx) برای مدیریت داده‌های جدولی استفاده می‌شوند. openpyxl یک کتابخانه عالی برای خواندن و نوشتن فایل‌های Excel 2010 (xlsx/xlsm/xltx/xltm) است.

نصب openpyxl

pip install openpyxl

خواندن و ویرایش سلول‌ها در فایل Excel


from openpyxl import load_workbook
import os
import telebot

# ... (بخش‌های مربوط به API_TOKEN، bot، و DOWNLOAD_FOLDER از کد قبلی) ...

# تابعی برای خواندن و اضافه کردن داده به یک سند Excel
def modify_excel_document(input_path, output_path, sheet_name="Sheet1", cell_address="A1", value="Modified by Telebot"):
    try:
        workbook = load_workbook(input_path)
        sheet = workbook[sheet_name]
        sheet[cell_address] = value
        workbook.save(output_path)
        return True
    except Exception as e:
        print(f"Error modifying Excel document {input_path}: {e}")
        return False

@bot.message_handler(commands=['modify_excel'])
def send_modify_excel_instruction(message):
    bot.reply_to(message, "لطفا یک فایل Excel (.xlsx) ارسال کنید تا سلول A1 آن ویرایش شود.")

@bot.message_handler(content_types=['document'], func=lambda message: message.document.mime_type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
def handle_excel_document(message):
    try:
        file_info = bot.get_file(message.document.file_id)
        file_name = message.document.file_name
        input_file_path = os.path.join(DOWNLOAD_FOLDER, file_name)
        
        downloaded_file = bot.download_file(file_info.file_path)
        with open(input_file_path, 'wb') as new_file:
            new_file.write(downloaded_file)
        
        bot.reply_to(message, "فایل Excel دریافت شد. در حال ویرایش سلول A1...")

        processed_file_name = f"modified_{file_name}"
        output_file_path = os.path.join(DOWNLOAD_FOLDER, processed_file_name)

        if modify_excel_document(input_file_path, output_file_path, cell_address="A1", value=f"ویرایش شده توسط ربات در تاریخ {telebot.util.to_datetime(message.date)}"):
            with open(output_file_path, 'rb') as modified_excel:
                bot.send_document(message.chat.id, modified_excel, caption="فایل Excel ویرایش شده:")
            bot.reply_to(message, "فایل Excel با موفقیت ویرایش شد و ارسال گردید.")
        else:
            bot.reply_to(message, "خطا در ویرایش فایل Excel.")

        os.remove(input_file_path)
        if os.path.exists(output_file_path):
            os.remove(output_file_path)

    except Exception as e:
        bot.reply_to(message, f"خطا در پردازش فایل Excel: {e}")
        print(f"Error handling Excel document: {e}")

در این مثال، سلول A1 از اولین شیت (Sheet1) فایل Excel ویرایش می‌شود. openpyxl قابلیت‌های گسترده‌ای برای پیمایش شیت‌ها، خواندن و نوشتن داده‌ها در سلول‌های مختلف، و حتی کار با نمودارها و فرمول‌ها را داراست.

با ترکیب Telebot و این کتابخانه‌های تخصصی، می‌توانید ربات‌هایی بسازید که به کاربران اجازه می‌دهند تا پردازش اسناد را به راحتی و به صورت خودکار از طریق تلگرام انجام دهند. این می‌تواند شامل تولید گزارشات، مدیریت داده‌ها، یا حتی تبدیل فرمت‌های مختلف اسناد باشد.

مدیریت خطاها، محدودیت‌ها و بهینه‌سازی عملکرد

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

۱. مدیریت خطاها (Error Handling)

خطاها می‌توانند در هر مرحله از پردازش فایل رخ دهند: از دانلود فایل تا عملیات پردازشی و آپلود مجدد. استفاده از بلوک‌های try-except برای گرفتن و مدیریت این خطاها حیاتی است.


try:
    # کد مربوط به دانلود، پردازش یا آپلود فایل
    # ...
except telebot.apihelper.ApiException as e:
    # خطاهای مربوط به API تلگرام (مثلاً فایل بزرگتر از حد مجاز)
    bot.reply_to(message, f"خطا در ارتباط با سرور تلگرام: {e}")
    print(f"Telegram API error: {e}")
except FileNotFoundError:
    # خطاهایی که هنگام دسترسی به فایل‌های محلی رخ می‌دهند
    bot.reply_to(message, "فایل مورد نظر یافت نشد.")
    print("File not found error.")
except Image.UnidentifiedImageError:
    # خطای خاص Pillow برای فایل‌های تصویری نامعتبر
    bot.reply_to(message, "فایل ارسالی یک تصویر معتبر نیست.")
    print("Unidentified image error.")
except Exception as e:
    # هر خطای دیگری که ممکن است رخ دهد
    bot.reply_to(message, f"خطای نامشخصی رخ داد: {e}")
    print(f"Unexpected error: {e}")

همیشه باید به کاربر بازخورد مناسبی در مورد خطا ارائه دهید تا تجربه کاربری بهبود یابد. همچنین، لاگ کردن خطاها برای اشکال‌زدایی و بهبود ربات بسیار مهم است.

۲. محدودیت‌های Telegram API و فایل‌ها

Telegram API محدودیت‌هایی برای اندازه فایل‌ها و نرخ درخواست‌ها (rate limits) دارد:

  • حجم فایل: در حال حاضر، حداکثر حجم فایل برای آپلود و دانلود از طریق API تلگرام ۲ گیگابایت است. ربات شما باید بتواند فایل‌هایی که از این حد فراتر می‌روند را تشخیص داده و به کاربر اطلاع دهد.
  • نرخ درخواست (Rate Limits): تلگرام محدودیت‌هایی برای تعداد پیام‌هایی که یک ربات می‌تواند در واحد زمان ارسال کند، اعمال می‌کند (مثلاً ۳۰ پیام در ثانیه به یک چت، و تعداد محدودی پیام در ثانیه به کل چت‌ها). تجاوز از این محدودیت‌ها منجر به خطا می‌شود. برای مدیریت این موضوع، می‌توانید از مکانیسم‌های تأخیر (sleep) یا صف‌بندی (queue) استفاده کنید.
  • مدت زمان پردازش: عملیات پردازش فایل، به ویژه ویدئوها، ممکن است زمان‌بر باشد. تلگرام محدودیت زمانی برای پاسخ ربات به پیام‌ها ندارد، اما کاربران انتظار ندارند برای مدت طولانی منتظر بمانند.

۳. بهینه‌سازی عملکرد

برای اطمینان از عملکرد روان ربات، بهینه‌سازی‌های زیر توصیه می‌شود:

  • حذف فایل‌های موقت: همانطور که در مثال‌ها دیدیم، پس از اتمام پردازش فایل و ارسال خروجی، فایل‌های ورودی و خروجی موقت را از دیسک حذف کنید تا از پر شدن فضای ذخیره‌سازی جلوگیری شود.
  • پردازش ناهمزمان (Asynchronous Processing): برای عملیات زمان‌بر مانند پردازش ویدئو، اجرای عملیات به صورت ناهمزمان می‌تواند تجربه کاربری را بهبود بخشد. pyTelegramBotAPI به صورت پیش‌فرض همزمان (synchronous) است، اما می‌توانید از ماژول asyncio در پایتون یا کتابخانه‌هایی مانند aiogram (که بر پایه asyncio ساخته شده) برای پیاده‌سازی ربات‌های ناهمزمان استفاده کنید.

    در مدل همزمان، تا زمانی که یک پردازش کامل نشود، ربات به پیام بعدی پاسخ نمی‌دهد. در مدل ناهمزمان، ربات می‌تواند چندین درخواست را همزمان مدیریت کند، به این معنی که در حین پردازش یک ویدئو، می‌تواند به پیام‌های دیگر نیز پاسخ دهد.

  • استفاده از پس‌زمینه (Background Tasks) و صف‌ها (Queues): برای وظایف بسیار سنگین، می‌توانید از سیستم‌های صف‌بندی مانند Celery با Redis یا RabbitMQ استفاده کنید. ربات پیام را دریافت کرده، وظیفه پردازش فایل را به یک صف ارسال می‌کند، و یک worker در پس‌زمینه آن را پردازش می‌کند. پس از اتمام پردازش، worker نتیجه را به ربات گزارش می‌دهد تا به کاربر اطلاع‌رسانی کند.
  • انتخاب سخت‌افزار مناسب: سرور میزبان ربات شما، به خصوص اگر با فایل‌های بزرگ و عملیات سنگین سر و کار دارید، باید دارای CPU قدرتمند، RAM کافی و فضای دیسک سریع (SSD) باشد.
  • اعتبارسنجی ورودی: همیشه ورودی‌های کاربر (مانند زمان‌های برش ویدئو یا نام شیت Excel) را اعتبارسنجی کنید تا از خطاهای منطقی و امنیتی جلوگیری شود.

با در نظر گرفتن این نکات در طراحی و پیاده‌سازی ربات خود، می‌توانید یک سیستم قوی و قابل اطمینان برای پردازش فایل‌ها با Telebot در پایتون بسازید که قادر به مقابله با چالش‌های دنیای واقعی باشد.

پیاده‌سازی و استقرار ربات پردازش فایل

پس از توسعه ربات پردازش فایل‌ها، گام بعدی پیاده‌سازی و استقرار آن است تا به صورت ۲۴/۷ در دسترس کاربران باشد. این مرحله شامل انتخاب زیرساخت مناسب، پیکربندی، و اطمینان از پایداری ربات است.

۱. انتخاب روش ارتباط با API: Long Polling در مقابل Webhooks

دو روش اصلی برای دریافت به‌روزرسانی‌ها از Telegram API وجود دارد:

  • Long Polling: ربات شما به صورت متناوب (مثلاً هر چند ثانیه) به سرور تلگرام درخواست می‌دهد تا به‌روزرسانی‌های جدید را دریافت کند. این روش برای ربات‌های کوچک تا متوسط که بار ترافیکی بالایی ندارند، ساده‌تر و رایج‌تر است. کد‌های نمونه در این مقاله از Long Polling (bot.polling()) استفاده می‌کنند.
  • Webhooks: شما یک URL را به تلگرام می‌دهید و تلگرام هر زمان که به‌روزرسانی جدیدی برای ربات شما وجود داشته باشد، به آن URL یک درخواست POST ارسال می‌کند. این روش کارآمدتر است، به خصوص برای ربات‌های با ترافیک بالا، زیرا نیاز به درخواست‌های مکرر از سمت ربات را از بین می‌برد و بار سرور تلگرام را کاهش می‌دهد. اما نیازمند یک سرور با IP عمومی و گواهی SSL (HTTPS) است.

برای ربات‌های پردازش فایل، Webhooks معمولاً گزینه بهتری است، زیرا عملیات پردازش ممکن است طولانی شود و با Long Polling ممکن است به‌روزرسانی‌ها به تأخیر بیفتند. اما Long Polling برای شروع و تست ساده‌تر است.

۲. نیازمندی‌های سرور برای پردازش فایل

ربات‌های پردازش فایل به دلیل ماهیت عملیات خود، نیاز به منابع سروری قوی‌تری دارند:

  • CPU: پردازش تصویر (Pillow)، ویدئو (MoviePy/OpenCV) و حتی برخی عملیات PDF، محاسبات سنگینی روی CPU انجام می‌دهند. یک CPU با هسته‌های بیشتر و فرکانس بالاتر، زمان پردازش را به شدت کاهش می‌دهد.
  • RAM: باز کردن و دستکاری فایل‌های بزرگ (به خصوص تصاویر و ویدئوهای با کیفیت بالا) می‌تواند مقادیر زیادی از RAM را مصرف کند. اطمینان حاصل کنید که سرور شما RAM کافی (حداقل ۴ گیگابایت برای شروع، و بیشتر برای کارهای سنگین) دارد.
  • Storage (فضای دیسک): فایل‌های ورودی و خروجی موقت فضای زیادی را اشغال می‌کنند. استفاده از فضای دیسک SSD برای سرعت بالاتر در خواندن و نوشتن فایل‌ها توصیه می‌شود. حتماً مکانیسم‌های منظم حذف فایل‌های موقت را پیاده‌سازی کنید.
  • پهنای باند (Bandwidth): دانلود و آپلود مکرر فایل‌ها نیاز به پهنای باند اینترنت قابل توجهی دارد. سرعت بالای آپلود و دانلود برای سرور ضروری است.

۳. گزینه‌های استقرار (Deployment Options)

  • Virtual Private Server (VPS) / Cloud Providers:
    • AWS (EC2), Google Cloud, Azure, DigitalOcean, Linode: این پلتفرم‌ها کنترل کامل بر سرور را فراهم می‌کنند و مقیاس‌پذیری بالایی دارند. شما می‌توانید سیستم عامل دلخواه خود را نصب کرده و ربات را به هر شکلی که می‌خواهید اجرا کنید. این بهترین گزینه برای ربات‌های با قابلیت پردازش فایل سنگین و ترافیک بالا است.
    • نحوه استقرار (مثال برای Linux VPS):
      1. نصب پایتون و pip.
      2. نصب کتابخانه‌های مورد نیاز (pip install -r requirements.txt).
      3. ایجاد یک سرویس systemd یا استفاده از Supervisor برای اطمینان از اجرای دائمی ربات و راه‌اندازی مجدد خودکار در صورت خطا.
      4. پیکربندی فایروال (مثلاً UFW) برای اجازه دسترسی به پورت‌های مورد نیاز (مثلاً پورت ۸۰/۴۴۳ برای webhook).
  • Platform as a Service (PaaS):
    • Heroku, PythonAnywhere: این پلتفرم‌ها فرآیند استقرار را ساده‌تر می‌کنند، اما ممکن است محدودیت‌هایی در منابع و سفارشی‌سازی داشته باشند. برای ربات‌های پردازش فایل سبک‌تر یا برای شروع کار مناسب هستند. محدودیت‌های رایگان آن‌ها معمولاً برای پردازش فایل‌های بزرگ کافی نیست.
  • Containerization (Docker):
    • استفاده از Docker برای بسته‌بندی ربات و تمامی وابستگی‌هایش در یک کانتینر، فرآیند استقرار را قابل حمل‌تر و قابل تکرار می‌کند. این امر مدیریت وابستگی‌ها و اطمینان از اجرای صحیح ربات در محیط‌های مختلف را آسان‌تر می‌سازد.

۴. مانیتورینگ و لاگ‌برداری

پس از استقرار، مانیتورینگ ربات برای شناسایی مشکلات احتمالی و لاگ‌برداری از فعالیت‌ها حیاتی است:

  • لاگ‌های ربات: تمام خطاهای رخ داده، شروع و پایان پردازش فایل‌ها، و زمان‌های پردازش را لاگ کنید. این اطلاعات برای اشکال‌زدایی و بهبود عملکرد ضروری هستند.
  • مانیتورینگ منابع سرور: استفاده از ابزارهایی مانند htop، grafana یا ابزارهای مانیتورینگ ارائه‌دهندگان ابری برای پیگیری مصرف CPU، RAM، فضای دیسک و پهنای باند. این کمک می‌کند تا گلوگاه‌های احتمالی را شناسایی کنید.
  • گزارش‌دهی به مدیر: در صورت بروز خطاهای جدی، ربات می‌تواند به مدیر خود (مثلاً از طریق تلگرام یا ایمیل) اطلاع‌رسانی کند.

با پیاده‌سازی صحیح این مراحل، ربات پردازش فایل‌ها با Telebot شما به صورت پایدار و کارآمد عمل خواهد کرد و می‌تواند به کاربران زیادی سرویس‌دهی کند.

نتیجه‌گیری و آینده Telebot در پردازش فایل

در این مقاله به صورت جامع و عمیق به بررسی پردازش فایل‌ها (عکس، ویدئو، اسناد) با Telebot در پایتون پرداختیم. از راه‌اندازی اولیه و دریافت انواع فایل‌ها گرفته تا استفاده از کتابخانه‌های تخصصی پایتون مانند Pillow برای تصاویر، MoviePy و OpenCV برای ویدئوها، و PyPDF2، python-docx، و openpyxl برای اسناد، هر مرحله را با جزئیات و مثال‌های کد عملی پوشش دادیم. همچنین، به نکات حیاتی در زمینه مدیریت خطاها، محدودیت‌های API تلگرام، بهینه‌سازی عملکرد، و استقرار ربات پرداخته شد.

همانطور که مشاهده کردید، پتانسیل پردازش فایل‌ها با Telebot بسیار گسترده و قدرتمند است. با دانش و ابزارهایی که در اختیار دارید، می‌توانید ربات‌هایی بسازید که وظایف پیچیده‌ای را به صورت خودکار انجام دهند، از تغییر اندازه عکس و برش ویدئو گرفته تا ادغام اسناد PDF و ویرایش فایل‌های Excel. این قابلیت‌ها می‌توانند در طیف وسیعی از صنایع و کاربردها، از ابزارهای شخصی‌سازی و سرگرمی گرفته تا راهکارهای اتوماسیون سازمانی، انقلابی ایجاد کنند.

آینده Telebot و پردازش فایل نیز بسیار روشن به نظر می‌رسد. با پیشرفت روزافزون در حوزه هوش مصنوعی و یادگیری ماشین، می‌توان انتظار داشت که ربات‌ها قادر به انجام پردازش‌های هوشمندانه‌تر و پیچیده‌تری بر روی فایل‌ها باشند. تصور کنید یک ربات که می‌تواند:

  • تصاویر را برای تشخیص اشیاء یا چهره‌ها تحلیل کند.
  • ویدئوها را برای خلاصه‌سازی خودکار یا تشخیص رویدادهای خاص پردازش کند.
  • اسناد را برای استخراج اطلاعات کلیدی یا خلاصه‌سازی متنی به کار گیرد.
  • با استفاده از مدل‌های تولیدی (Generative AI) محتوای بصری یا متنی جدیدی بر اساس ورودی‌های فایل ایجاد کند.

این‌ها تنها بخشی از امکاناتی است که در آینده نزدیک با ادغام قابلیت‌های پیشرفته هوش مصنوعی و پردازش فایل‌ها در Telebot قابل دستیابی خواهد بود. کلید موفقیت در این حوزه، نه تنها تسلط بر ابزارهای موجود، بلکه توانایی خلاقانه در ترکیب آن‌ها برای حل مشکلات واقعی و ایجاد ارزش برای کاربران است.

امیدواریم این راهنمای جامع شما را در مسیر توسعه ربات‌های تلگرام پیشرفته و کاربردی یاری کرده باشد. با تمرین و کاوش بیشتر، می‌توانید مهارت‌های خود را در این زمینه گسترش داده و مرزهای آنچه با Telebot امکان‌پذیر است را جابجا کنید. دنیای اتوماسیون و تعامل با ربات‌ها در انتظار نوآوری‌های شماست!

“تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”

قیمت اصلی 2.290.000 ریال بود.قیمت فعلی 1.590.000 ریال است.

"تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"

"با شرکت در این دوره جامع و کاربردی، به راحتی مهارت‌های برنامه‌نویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر می‌سازد تا به سرعت الگوریتم‌های پیچیده را درک کرده و اپلیکیشن‌های هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفه‌ای و امکان دانلود و تماشای آنلاین."

ویژگی‌های کلیدی:

بدون نیاز به تجربه قبلی برنامه‌نویسی

زیرنویس فارسی با ترجمه حرفه‌ای

۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان