Создание Telegram-бота для приёма и сохранения картинок занимает несколько шагов. Чтобы телеграм-бот принимал и скидывал картинки, нужны три вещи: токен от @BotFather, библиотека python-telegram-bot (в 2026 году актуальна версия 22.8) и обработчик на тип сообщения photo. Приём и сохранение присланного фото — это по сути три строки:

photo = update.message.photo[-1] # самый крупный размер tg_file = await context.bot.get_file(photo.file_id) await tg_file.download_to_drive(f"images/{photo.file_unique_id}.jpg")

Ниже — как собрать такого бота с нуля: от регистрации до рабочего скрипта, сохранения на диск и в базу, отправки картинок обратно и типичных ошибок, на которых спотыкаются новички.

Что нужно для создания телеграм-бота под картинки

  • Токен — выдаёт @BotFather за минуту, без него бот не подключится к API.
  • Библиотека — python-telegram-bot 22.8 или aiogram 3.29; обе асинхронные, обе под Python 3.10+.
  • Обработчик фото — ловит сообщения с изображением через фильтр filters.PHOTO.
  • Механика файлов — Telegram отдаёт не сам файл, а file_id; по нему бот вызывает getFile и скачивает картинку (лимит скачивания — 20 МБ).
  • Хранилище — папка на диске, база данных или облако; для пересылки достаточно хранить один file_id.
ОБЗОРНЫЙ ПРАКТИКУМ ПО НАШУМЕВШИМ НЕЙРОСЕТЯМ
Нейросети DEEPSEEK И QWEN За 2 часа сделаем полный обзор новых мощных ИИ-моделей, которые бросают вызов нейросети ChatGPT
ТОП-подарки всем участникам лекции:
  • Возможность получить Доступ в Нейроклуб на целый месяц
  • Как ИИ ускоряет работу и приносит деньги
  • За 2 часа вы получите четкий план, как начать работать с ИИ прямо сейчас!

Шаг 1. Как создать телеграм-бота и получить токен

Откройте в Telegram чат с @BotFather, отправьте команду /newbot, задайте имя и username (он должен заканчиваться на bot). В ответ придёт строка вида 123456789:AAH...тут-секрет — это и есть токен для доступа к Bot API. Один бот — один токен; если токен утёк, здесь же командой /revoke выпускается новый.

Токен — это пароль. Не вставляйте его прямо в код и тем более не коммитьте в репозиторий: храните в переменной окружения или в .env. Ниже во всех примерах токен читается из окружения.

Какую библиотеку выбрать: python-telegram-bot или aiogram

Обе библиотеки живые и покрывают весь Bot API. python-telegram-bot — самый популярный вариант с огромным числом готовых примеров, порог входа ниже. aiogram — тоже полностью асинхронный фреймворк, чуть более гибкая маршрутизация через роутеры, любим за скорость разработки крупных ботов. Для задачи «принять и сохранить картинку» разницы почти нет — берите ту, под которую быстрее найдёте пример.

Критерий python-telegram-bot aiogram
Актуальная версия (2026) 22.8 3.29
Модель Асинхронная, ApplicationBuilder Асинхронная, Dispatcher + роутеры
Python 3.10+ 3.10+
Порог входа Ниже, много примеров Чуть выше, больше гибкости
Приём фото filters.PHOTO F.photo

Важно про версии. С выхода python-telegram-bot 20 старый синхронный стиль (Updater, dispatcher, Filters, use_context=True) больше не работает. Если вы нашли туториал с этими конструкциями — он под версию 13 и на 22.8 не запустится. Актуально: ApplicationBuilder, filters (в нижнем регистре) и async def-обработчики.

Шаг 3. Как бот принимает и сохраняет присланную картинку

Как бот принимает и сохраняет картинку за 4 шага
Как бот принимает и сохраняет картинку за 4 шага

Когда пользователь отправляет фото, Telegram кладёт его в поле message.photo — это массив объектов PhotoSize (одно и то же изображение в нескольких разрешениях). Каждый PhotoSize содержит поля file_id, file_unique_id, width, height и file_size. Последний элемент массива — самый крупный размер, поэтому берут message.photo[-1].

Сам файл в сообщении не приходит. Приходит file_id — по нему бот вызывает getFile, получает объект File с путём file_path, и уже затем скачивает картинку методом download_to_drive(). Ссылка на файл валидна не меньше часа; когда истечёт — просто запросите get_file заново.

from telegram import Update from telegram.ext import ContextTypes async def handle_photo(update: Update, context: ContextTypes.DEFAULT_TYPE): photo = update.message.photo[-1] # крупнейший PhotoSize tg_file = await context.bot.get_file(photo.file_id) path = f"images/{photo.file_unique_id}.jpg" await tg_file.download_to_drive(path) # сохранили на диск await update.message.reply_text("Картинка сохранена.")

Имя файла лучше строить из file_unique_id, а не из file_id: unique-id стабилен во времени и одинаков для разных ботов, тогда как file_id может отличаться. Это спасает от дублей, если один и тот же снимок прислали дважды.

Куда сохранять: диск, база или облако

Для прототипа хватает папки на диске. Как только картинок становится много, встаёт вопрос учёта — тогда в базу пишут не сам файл, а метаданные и file_id. Хранить в БЛОБ саму картинку почти никогда не нужно: file_id занимает десятки байт, и по нему бот в любой момент отправит изображение обратно без повторной загрузки.

import sqlite3 conn = sqlite3.connect("bot.db") conn.execute("CREATE TABLE IF NOT EXISTS pics(user_id INT, file_id TEXT, ts TEXT)") async def handle_photo(update, context): photo = update.message.photo[-1] conn.execute( "INSERT INTO pics VALUES (?, ?, datetime('now'))", (update.effective_user.id, photo.file_id), ) conn.commit() await update.message.reply_text("Записал в базу.")

Как бот отправляет (скидывает) картинку обратно

Отправка — метод send_photo. Картинку можно передать тремя способами: загрузить файл с диска, дать ссылку-URL или подставить уже известный file_id. Третий вариант самый быстрый: Telegram не перезаливает файл, а берёт его со своих серверов.

# с диска await context.bot.send_photo(chat_id=update.effective_chat.id, photo=open("images/pic.jpg", "rb")) # по сохранённому file_id — без повторной загрузки await context.bot.send_photo(chat_id=chat_id, photo=saved_file_id)

Помните про ограничения на отправку. По документации Bot API фото при отправке должно быть не больше 10 МБ, сумма ширины и высоты — не больше 10000, а соотношение сторон — не больше 20:1. Панорамы и узкие полоски под эти рамки не проходят: их либо ужимают, либо шлют документом.

Фото или документ: в чём разница и что выбрать

Одну и ту же картинку Telegram умеет передавать двумя способами. Как фото — с автоматическим сжатием в JPEG и превью; как документ — байт в байт, без потери качества и метаданных. Для бота-хранилища это принципиально: если пользователь хочет сохранить оригинал, PNG с прозрачностью или RAW, он должен слать файл документом.

Параметр Фото (сжатое) Документ (файл)
Поле в сообщении message.photo (массив PhotoSize) message.document
Сжатие Да, JPEG, качество теряется Нет, оригинал
Метаданные (EXIF) Срезаются Сохраняются
Прозрачность / PNG / RAW Теряется Сохраняется
Фильтр в коде filters.PHOTO filters.Document.IMAGE
Когда использовать Быстрый обмен, превью Оригинал, важно качество

Общий для обоих способов потолок: скачать присланный файл бот может размером до 20 МБ — это лимит метода getFile. Если ждёте тяжёлые исходники, предупреждайте пользователя заранее.

Полный рабочий пример бота

Скрипт ниже принимает и фото, и картинки-документы, складывает их в папку images и подтверждает сохранение. Токен читается из переменной окружения TELEGRAM_TOKEN.

import os from telegram import Update from telegram.ext import (ApplicationBuilder, MessageHandler, filters, ContextTypes) TOKEN = os.environ["TELEGRAM_TOKEN"] # токен из окружения, не в коде os.makedirs("images", exist_ok=True) async def save_photo(update: Update, context: ContextTypes.DEFAULT_TYPE): photo = update.message.photo[-1] tg_file = await context.bot.get_file(photo.file_id) await tg_file.download_to_drive(f"images/{photo.file_unique_id}.jpg") await update.message.reply_text("Фото сохранено.") async def save_document(update: Update, context: ContextTypes.DEFAULT_TYPE): doc = update.message.document tg_file = await context.bot.get_file(doc.file_id) await tg_file.download_to_drive(f"images/{doc.file_name}") await update.message.reply_text("Файл без сжатия сохранён.") def main(): app = ApplicationBuilder().token(TOKEN).build() app.add_handler(MessageHandler(filters.PHOTO, save_photo)) app.add_handler(MessageHandler(filters.Document.IMAGE, save_document)) app.run_polling() if __name__ == "__main__": main()

Запуск: установите библиотеку (pip install python-telegram-bot), задайте токен (export TELEGRAM_TOKEN=...) и запустите скрипт. Отправьте боту картинку — она появится в папке images.

Куда это выложить: деплой в двух словах

Локально бот живёт, пока запущен скрипт. Чтобы он работал постоянно, его выносят на сервер (VPS) и запускают как systemd-сервис или в Docker-контейнере — тогда бот переживёт перезапуск машины. Режим run_polling подходит для старта и не требует внешнего IP; для нагруженных ботов переходят на webhook. Для первого проекта достаточно самого дешёвого VPS и polling.

Частые ошибки при создании бота для картинок

  • Токен прямо в коде. Уедет в репозиторий — бота угонят. Только переменные окружения.
  • Берут не тот размер. message.photo[0] — это мелкая превьюшка. Крупное фото — photo[-1].
  • Ждут оригинал от фото. Присланное «как фото» уже сжато в JPEG. Нужен исходник — принимайте документом.
  • Старый синтаксис. Updater/Filters/use_context — это версия 13, на 22.8 код не заведётся.
  • Тяжёлые файлы. getFile не скачает больше 20 МБ — обработайте этот случай, а не роняйте бота исключением.

Сохранение картинок в облако (Яндекс.Диск)

Если папки на сервере мало и нужен доступ отовсюду, сохранённый файл дополнительно заливают в облако. Для Яндекс.Диска берут библиотеку yadisk и OAuth-токен приложения: после download_to_drive() вызывают y.upload(локальный_путь, путь_на_диске), а локальную копию удаляют. Логика приёма фото при этом не меняется — меняется только финальный шаг «куда положить».

Коротко

Бот для картинок собирается из четырёх кирпичей: токен от @BotFather, асинхронная библиотека, обработчик на filters.PHOTO и связка get_filedownload_to_drive. Держите токен в окружении, берите крупнейший размер через photo[-1], помните про лимиты 10 МБ на отправку и 20 МБ на скачивание, а оригиналы принимайте документом. Этого достаточно, чтобы бот надёжно принимал и скидывал изображения.

Материал подготовлен редакцией ya.zerocoder.ru. Обновлено в 2026 году под python-telegram-bot 22.8 и Telegram Bot API. Официальная документация методов — core.telegram.org/bots/api.

РОССИЙСКИЕ НЕЙРОСЕТИ ДЛЯ ЖИЗНИ И КАРЬЕРЫ В 2025
Присоединяйся к онлайн-вебинару.
В прямом эфире разберем и потестируем лучшие на сегодняшний день отечественные ИИ!
Вы узнаете о том:
  • Выполним базовые задачи на российских нейросетях и посмотрим на результаты!
  • Файл-инструкцию «Как сделать нейро-фотосессию из своего фото бесплатно, без иностранных карт и прочих сложностей»
  • Покажем 10+ способов улучшить свою жизнь с ИИ каждому — от ребенка и пенсионера до управленца и предпринимателя
Участвовать бесплатно
ОБЗОРНЫЙ ПРАКТИКУМ ПО НАШУМЕВШИМ НЕЙРОСЕТЯМ
Нейросети DEEPSEEK И QWEN
За 2 часа сделаем полный обзор новых мощных ИИ-моделей, которые бросают вызов нейросети ChatGPT
Вы узнаете:
  • Возможность получить Доступ в Нейроклуб на целый месяц
  • Как ИИ ускоряет работу и приносит деньги
  • За 2 часа вы получите четкий план, как начать работать с ИИ прямо сейчас!
Участвовать бесплатно