Отправка медиа

vk-bot поддерживает отправку фотографий и документов с автоматической загрузкой на серверы VK.

Отправка фотографий

Метод send_photo принимает файл, загружает его через VK API и отправляет как вложение к сообщению.

Из файла на диске

bot.send_photo(chat_id, photo="path/to/image.jpg")

Из байтов

with open("image.png", "rb") as f:
    image_bytes = f.read()

bot.send_photo(chat_id, photo=image_bytes, caption="Мое фото")

Из файлового объекта

with open("photo.jpg", "rb") as f:
    bot.send_photo(chat_id, photo=f, caption="Фото из файла")

С клавиатурой

kb = types.InlineKeyboardMarkup()
kb.add(types.InlineKeyboardButton(text="Нравится", callback_data="like"))

bot.send_photo(
    chat_id,
    photo="photo.jpg",
    caption="Нравится?",
    reply_markup=kb,
)

Отправка документов

Метод send_document работает аналогично send_photo, но загружает файл как документ.

# Из пути к файлу
bot.send_document(chat_id, document="report.pdf")

# Из байтов
bot.send_document(chat_id, document=pdf_bytes, caption="Отчёт")

# Из файлового объекта
with open("archive.zip", "rb") as f:
    bot.send_document(chat_id, document=f, caption="Архив")

Ответ на сообщение

Метод reply_to автоматически подставляет chat_id и reply_to из исходного сообщения:

@bot.message_handler(commands=["ping"])
def handle_ping(message: types.Message):
    bot.reply_to(message, "pong!")

Работа с вложениями входящих сообщений

Извлечение фотографий и документов из полученного сообщения:

@bot.message_handler(content_types=["photo"])
def handle_photo(message: types.Message):
    photos = message.get_photos()
    for photo in photos:
        print(f"URL: {photo.url}")
        print(f"Attachment: {photo.attachment}")

@bot.message_handler(content_types=["doc"])
def handle_doc(message: types.Message):
    docs = message.get_documents()
    for doc in docs:
        print(f"{doc.title}.{doc.ext} ({doc.size} байт)")
        print(f"Скачать: {doc.url}")

Длинные сообщения

VK ограничивает длину сообщения 4096 символами. Используйте split_text для автоматического разбиения:

from vk_bot import util

long_text = "..." * 5000  # Очень длинный текст

for part in util.split_text(long_text):
    bot.send_message(chat_id, part)