Lite / app.py
enotkrutoy's picture
Create app.py
c7a5712 verified
raw
history blame
4.01 kB
import os
import logging
import requests
import base64
from PIL import Image
from io import BytesIO
from telegram import Update, InputFile
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
# Настройка логирования
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
# URL API
BASE_URL = "https://faceonlive-face-search-online.hf.space/api/predict"
def image_to_base64(image):
"""Конвертирует изображение в base64."""
buffered = BytesIO()
image.save(buffered, format="JPEG") # JPEG для уменьшения размера
return base64.b64encode(buffered.getvalue()).decode('utf-8')
def compress_image(image, max_size=(512, 512)):
"""Уменьшает изображение до заданного размера."""
image.thumbnail(max_size, Image.ANTIALIAS)
return image
def search_face(file_bytes):
"""Отправляет изображение в API и получает результат."""
try:
response = requests.post(
BASE_URL,
files={"file": ("image.jpg", file_bytes)},
headers={"accept": "application/json"}
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
logger.error(f"Ошибка при запросе к API: {e}")
return {"error": str(e)}
def start(update: Update, context: CallbackContext):
"""Обрабатывает команду /start."""
update.message.reply_text("Привет! Отправьте изображение, чтобы найти совпадения.")
def handle_image(update: Update, context: CallbackContext):
"""Обрабатывает изображения, отправленные пользователями."""
photo = update.message.photo[-1].get_file()
file_bytes = BytesIO()
photo.download(out=file_bytes)
try:
# Открываем и сжимаем изображение
image = Image.open(file_bytes)
image = compress_image(image)
# Конвертируем изображение в байты
compressed_bytes = BytesIO()
image.save(compressed_bytes, format="JPEG")
compressed_bytes.seek(0)
# Отправляем изображение в API
result = search_face(compressed_bytes.getvalue())
except Exception as e:
update.message.reply_text(f"Ошибка обработки изображения: {e}")
return
if "error" in result:
update.message.reply_text(f"Ошибка API: {result['error']}")
return
if not result.get("matches"):
update.message.reply_text("Совпадений не найдено.")
else:
# Отправляем совпадения пользователю
for match in result["matches"]:
url = match.get("url", "No URL provided")
img_base64 = match.get("image")
if img_base64:
# Конвертируем base64 обратно в изображение
img = Image.open(BytesIO(base64.b64decode(img_base64)))
bio = BytesIO()
img.save(bio, format="PNG")
bio.seek(0)
update.message.reply_photo(photo=InputFile(bio), caption=f"Найдено: {url}")
def main():
"""Запускает бота."""
token = "7547882359:AAEvPupQV2CdGgRrs_aqoYnjpHCj41baK7c" # Ваш токен Telegram
updater = Updater(token)
dispatcher = updater.dispatcher
# Регистрируем обработчики
dispatcher.add_handler(CommandHandler("start", start))
dispatcher.add_handler(MessageHandler(Filters.photo, handle_image))
# Запуск бота
updater.start_polling()
updater.idle()
if __name__ == "__main__":
main()