Создание 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.

- Возможность получить Доступ в Нейроклуб на целый месяц
- Как ИИ ускоряет работу и приносит деньги
- За 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. Как бот принимает и сохраняет присланную картинку

Когда пользователь отправляет фото, 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_file → download_to_drive. Держите токен в окружении, берите крупнейший размер через photo[-1], помните про лимиты 10 МБ на отправку и 20 МБ на скачивание, а оригиналы принимайте документом. Этого достаточно, чтобы бот надёжно принимал и скидывал изображения.
Материал подготовлен редакцией ya.zerocoder.ru. Обновлено в 2026 году под python-telegram-bot 22.8 и Telegram Bot API. Официальная документация методов — core.telegram.org/bots/api.
- Выполним базовые задачи на российских нейросетях и посмотрим на результаты!
- Файл-инструкцию «Как сделать нейро-фотосессию из своего фото бесплатно, без иностранных карт и прочих сложностей»
- Покажем 10+ способов улучшить свою жизнь с ИИ каждому — от ребенка и пенсионера до управленца и предпринимателя
- Возможность получить Доступ в Нейроклуб на целый месяц
- Как ИИ ускоряет работу и приносит деньги
- За 2 часа вы получите четкий план, как начать работать с ИИ прямо сейчас!