Телеграм-бот для поиска фотографий через API-ключ фотостока
Определение функциональных требований к боту
Перед работой над созданием бота, я решил создать реестр требований, чтобы точно отслеживать какие моменты я хочу увидеть в работе бота.
В моем представлении, бот, работающий с API фотостока, должен уметь работать с медиа-файлами. Помимо всего прочего, бот - есть бот, он должен уметь первоначально взаимодействовать с пользователем и отзываться на его команды. Соответственно, необходимо эти команды придумать и понять, что пользователь захочет сделать.
Размышляя таким образом, я пришел к следующему реестру функциональных и нефункциональных требований:
- Бот должен уметь начинать работу с пользователем через команду /start
- Бот должен уметь рассказывать о себе и о том зачем он нужен
- В случае, если пользователь забыл команды - напомнить пользователю о них через команду /help
- Иметь возможность работать как с открытыми запросами (на случай, если нужна случайная фотография), так и с закрытыми (при конкретных запросах)
- Выдавать ссылку на источник с фотографией, при выборе пользователем нужной фотографии (из 4-х)
Получение API и создание внутреннего конфигурационного API файла
Далее также важный момент, для работы бота потребуется ДВА API ключа. Первый - Telegram Bot Key, второй - как раз Unsplash API.
Для того, чтобы получить ключ для бота Telegram, необходимо его создать. Сделать это можно через бота @BotFather.
При заходе в бота, необходимо открыть внутреннее интегрированное приложение через кнопку "Open" и создать своего бота:
После получения доступа к API бота - его нужно будет в дальнейшем сохранить в файл .env в той же папке, где и сам файл Python, но об этом чуть позже.
Теперь нужно получить API ключ фотостока, я выбрал Unsplash, так как получение API там не затруднено лишними тарифными планами и дополнительными регистрациями.
Чтобы получить доступ к API Unsplash необходимо зайти на их сайт, зарегистрироваться и в личном кабинете открыть новое приложение (проект), указать его вид и название. Важно, что Access и Secret ключи должны быть конфиденциальны и не могут передаваться третьим лицам, поэтому в этом проекте и статье, ключи будут скрыты.
После получения всех требуемых API ключей - сохраняем их в файл окружения .env в переменные, которые в дальнейшем будем использовать в Python-коде.
Разработка бота
Начало работы и создание заглушки
Для начала был создан файлик с начальными зависимостями в Python
"requirements.txt"
После создания этого файлика необходимо запустить команду `pip install -r [путь к файлу]` и указать путь к созданному requirements.txt
Начало разработки кода
Так как разработка в Python позволяет работать с разными существующими библиотеками, имеющие свои документации, будем пользоваться предоставленными правами.
Для работы бота я подключил несколько библиотек, такие как:
- python-telegram-bot - основная библиотека для создания Telegram ботов
- requests - библиотека для отправки HTTP-запросов к API Unsplash
- python-dotenv - загрузка переменных окружения из файла .env
- logging - логирование событий и ошибок для отладки
- os - взаимодействие с операционной системой
- uuid - генерация уникальных идентификаторов
В соответствии с ранее описанными функциональными требованиями диаграмма UML ниже

Непосредственная работа с кодом приложения
Код перед созданием класса =
Импорт вышеописанных библиотек и подгрузка переменных из файла .env:
Настройка логирования
Работа с классом
Далее, так как пользователей у бота может быть несколько - крайне важно создать класс, который поможет работать нескольким пользователям одновременно в соответствие с объектно-ориентированным программированием.
Для этого я создал класс, в котором указал основные метаданные, а также функции:
Программирование функций класса бота
- /start - основная команда, которая будет запускать бота и создавать класс в нем. После отправки этой команды пользователь должен получать информацию о боте.
- /help - дополнительная команда, которая будет отчасти повторять функционал команды /start, но описывать функционал более подробно.
- /search или сообщение без команды - основа всего бота, поиск фотографий и показ 4-х фотографий.
- /random - случайное фото из Unsplash.
- /popular - случайное фото из подборки "Популярное" из Unsplash. делается наподобие команды /random.
Написание обработчика на запуск бота
Функция на запуск бота, включает в себя создание приложения, обработчики команд и логгирование всех команд в терминале.
Вне класса также создаем класс и запускаем бота.
Запуск бота и его тестирование
📚 Методические материалы
| Description | |
|---|---|
| Python | Python в русском языке распространено название пито́н) — высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций. Язык является полностью объектно-ориентированным в том плане, что всё является объектами |
| Description | |
|---|---|
| UML | UML (англ. Unified Modeling Language — унифицированный язык моделирования) — язык графического описания для объектного моделирования в области разработки программного обеспечения, для моделирования бизнес-процессов, системного проектирования и отображения организационных структур. |
| Description | |
|---|---|
| Telegram | Telegram — это мессенджер и платформа для сообществ, где можно создавать групповые чаты, каналы и ботов для координации командной работы и учебных проектов. |
| Description | |
|---|---|
| API | Интерфейс прикладного программирования application programming interface (API) - — описание способов взаимодействия одной компьютерной программы с другими. API (интерфейс прикладного программирования) упрощает процесс программирования при создании приложений, абстрагируя базовую реализацию и предоставляя только объекты или действия, необходимые разработчику. Если графический интерфейс для почтового клиента может предоставить пользователю кнопку, которая выполнит все шаги для выборки и выделения новых писем, то API для ввода/вывода файлов может дать разработчику функцию, которая копирует файл из одного места в другое, не требуя от разработчика понимания операций файловой системы. |

