Учебный Telegram-бот для хакатонного проекта: принимает фото тренировочной задачи ЕНТ, отправляет изображение в Gemini и возвращает короткий ответ.
Формат ответа:
ОТВЕТ: A | РЕШЕНИЕ: короткое пояснение до 20-30 слов
Python лучше всего подходит для такого прототипа: python-telegram-bot быстро запускается через polling, код короткий, деплой на Render/PythonAnywhere простой.
- Gemini API через Google AI Studio: обычно лучший вариант для хакатона, хорошо читает изображения, есть бесплатные квоты.
- OpenAI GPT-4o: сильный fallback для изображений, но бесплатный доступ зависит от аккаунта/кредитов.
- OpenRouter: иногда дает бесплатные модели с vision, но стабильность и лимиты зависят от модели.
- Groq: быстрый и часто бесплатный для текста, но vision-доступ зависит от актуальных моделей.
По официальной документации Google сейчас рекомендует пакет google-genai. Старый google-generativeai находится в legacy-режиме, поэтому в проекте используется google-genai.
- Откройте Telegram.
- Найдите
@BotFather. - Отправьте команду
/newbot. - Введите название бота, например
ENT Solver. - Введите username, который заканчивается на
bot, напримерent_solver_demo_bot. - Скопируйте токен вида
123456:ABC.... - Вставьте токен в
bot.py:
TELEGRAM_TOKEN = "ваш_токен"Или задайте переменную окружения TELEGRAM_TOKEN.
- Откройте https://aistudio.google.com/app/apikey.
- Войдите в Google-аккаунт.
- Нажмите
Create API key. - Скопируйте ключ.
- Вставьте ключ в
bot.py:
GEMINI_API_KEY = "ваш_ключ"Или задайте переменную окружения GEMINI_API_KEY.
По требованию проекта в коде стоит модель gemini-1.5-pro. Если API вернет ошибку, задайте:
$env:GEMINI_MODEL="gemini-2.5-flash"Fallback включится только если заполнен OPENAI_API_KEY.
$env:OPENAI_API_KEY="ваш_openai_key"Если OpenAI не нужен, оставьте пустым.
Рекомендуемый вариант:
pip install -r requirements.txtЕсли нужно строго одной строкой:
pip install python-telegram-bot google-genai requestsLegacy-вариант из старых гайдов:
pip install python-telegram-bot google-generativeai requestsДля этого проекта нужен именно google-genai.
Если телефон будет на мобильном интернете, он не сможет отправить файл на локальный IP компьютера. Нужен публичный адрес:
- Render/PythonAnywhere, где запущен
bot.py. - Или временный туннель вроде ngrok/Cloudflare Tunnel к вашему ПК.
В bot.py есть endpoint:
POST /upload?chat_id=ВАШ_CHAT_ID&secret=ВАШ_SECRET
Он принимает скриншот как сырое тело запроса, решает задачу через Gemini и отправляет ответ в Telegram.
Для защиты задайте секрет:
$env:UPLOAD_SECRET="любая_длинная_строка"На Render добавьте UPLOAD_SECRET в Environment.
Пример публичного URL:
https://your-app.onrender.com/upload?chat_id=123456789&secret=любая_длинная_строка
В MacroDroid:
HTTP-запрос.- Метод:
POST. - URL: публичный
/upload. - Вкладка
Тело сообщения. - Выберите
Файл. - В поле файла укажите последний скриншот:
/storage/emulated/0/DCIM/Screenshots/{trigger_that_fired}
или:
/storage/emulated/0/Pictures/Screenshots/{trigger_that_fired}
Так MacroDroid не обязан поддерживать Telegram multipart/form-data: он просто отправляет файл вашему серверу.
python bot.pyПосле запуска откройте своего бота в Telegram, нажмите /start и отправьте фото задачи.
Самый простой способ: запустите бота и отправьте ему команду:
/id
Бот ответит:
Ваш chat_id: 123456789
Альтернативный способ через Telegram API:
- Напишите любое сообщение своему боту в Telegram.
- Откройте ссылку в браузере, заменив токен:
https://api.telegram.org/botВАШ_ТОКЕН/getUpdates
- Найдите поле:
"chat":{"id":123456789}123456789 и есть ваш chat_id.
Используйте только для своих учебных материалов и демо хакатона.
Итоговая схема:
Скриншот учебной задачи
→ Tasker видит новый файл
→ Tasker отправляет фото боту
→ бот отправляет изображение в Gemini
→ Gemini решает
→ бот присылает уведомление в Telegram
- Установите Tasker.
- Создайте новый
Profile. - Выберите
Event. - Выберите
File ModifiedилиFolder Monitor. - Укажите папку скриншотов:
/storage/emulated/0/Pictures/Screenshots
На некоторых телефонах путь может быть:
/storage/emulated/0/DCIM/Screenshots
- Создайте новую
Task, напримерSend Screenshot To Bot. - Добавьте действие
Waitна 1-2 секунды, чтобы файл успел сохраниться. - Добавьте действие
List Files. - Directory: папка скриншотов.
- Match:
*.jpg/*.pngили просто оставьте пустым. - Sort Select:
Modification Date, Reverse. - Variable Array:
%files. - Добавьте действие
HTTP Request. - Method:
POST. - URL:
https://api.telegram.org/botВАШ_ТЕЛЕГРАМ_ТОКЕН/sendPhoto
- Body:
Form-Data. - Добавьте form-data поля:
chat_id = ВАШ_CHAT_ID
photo = %files1
Для поля photo выберите тип File, если Tasker показывает такой переключатель.
- Сохраните профиль и сделайте тестовый скриншот тренировочной задачи.
Если Tasker не подставляет %files1 как файл, установите AutoTools или используйте действие HTTP Post с multipart/form-data.
iOS не дает Tasker и не разрешает полностью фоновую отправку каждого нового скриншота в Telegram Bot API. Рабочий учебный вариант:
- Откройте приложение
Команды/Shortcuts. - Создайте shortcut
Send Screenshot To Bot. - Добавьте действие
Получить последние фото/Get Latest Photos. - Количество:
1. - Добавьте действие
Получить содержимое URL/Get Contents of URL. - URL:
https://api.telegram.org/botВАШ_ТЕЛЕГРАМ_ТОКЕН/sendPhoto
- Method:
POST. - Request Body:
Form. - Поля:
chat_id = ВАШ_CHAT_ID
photo = результат Get Latest Photos
- Запускайте shortcut вручную, через виджет, Back Tap или Siri.
Полностью автоматический триггер "после каждого скриншота" на iOS обычно недоступен без сторонних обходных решений.
- Загрузите проект на GitHub.
- Создайте Render
Web Service. - Build command:
pip install -r requirements.txt- Start command:
python bot.py- В
Environmentдобавьте:
TELEGRAM_TOKEN
GEMINI_API_KEY
OPENAI_API_KEY
GEMINI_MODEL
Для polling веб-порт не нужен, но Render Web Service может ожидать открытый порт. Для стабильного бесплатного демо проще запускать локально или на PythonAnywhere.
- Загрузите файлы
bot.pyиrequirements.txt. - Откройте Bash console.
- Выполните:
pip install --user -r requirements.txt
python bot.pyДля постоянной работы настройте Always-on task, если он доступен в вашем тарифе.
TELEGRAM_TOKEN is empty: вставьте токен вbot.pyили переменную окружения.- Gemini вернул 404 по модели: задайте
GEMINI_MODEL=gemini-2.5-flash. - Бот отвечает, что принимает только фото: отправляйте изображение как фото, не как файл.
- Tasker не отправляет фото: проверьте
chat_id, токен, разрешение на доступ к файлам и multipart/form-data.