enotkrutoy commited on
Commit
c7a5712
·
verified ·
1 Parent(s): c01cb10

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +104 -0
app.py ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import logging
3
+ import requests
4
+ import base64
5
+ from PIL import Image
6
+ from io import BytesIO
7
+ from telegram import Update, InputFile
8
+ from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
9
+
10
+ # Настройка логирования
11
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
12
+ logger = logging.getLogger(__name__)
13
+
14
+ # URL API
15
+ BASE_URL = "https://faceonlive-face-search-online.hf.space/api/predict"
16
+
17
+ def image_to_base64(image):
18
+ """Конвертирует изображение в base64."""
19
+ buffered = BytesIO()
20
+ image.save(buffered, format="JPEG") # JPEG для уменьшения размера
21
+ return base64.b64encode(buffered.getvalue()).decode('utf-8')
22
+
23
+ def compress_image(image, max_size=(512, 512)):
24
+ """Уменьшает изображение до заданного размера."""
25
+ image.thumbnail(max_size, Image.ANTIALIAS)
26
+ return image
27
+
28
+ def search_face(file_bytes):
29
+ """Отправляет изображение в API и получает результат."""
30
+ try:
31
+ response = requests.post(
32
+ BASE_URL,
33
+ files={"file": ("image.jpg", file_bytes)},
34
+ headers={"accept": "application/json"}
35
+ )
36
+ response.raise_for_status()
37
+ return response.json()
38
+ except requests.exceptions.RequestException as e:
39
+ logger.error(f"Ошибка при запросе к API: {e}")
40
+ return {"error": str(e)}
41
+
42
+ def start(update: Update, context: CallbackContext):
43
+ """Обрабатывает команду /start."""
44
+ update.message.reply_text("Привет! Отправьте изображение, чтобы найти совпадения.")
45
+
46
+ def handle_image(update: Update, context: CallbackContext):
47
+ """Обрабатывает изображения, отправленные пользователями."""
48
+ photo = update.message.photo[-1].get_file()
49
+ file_bytes = BytesIO()
50
+ photo.download(out=file_bytes)
51
+
52
+ try:
53
+ # Открываем и сжимаем изображение
54
+ image = Image.open(file_bytes)
55
+ image = compress_image(image)
56
+
57
+ # Конвертируем изображение в байты
58
+ compressed_bytes = BytesIO()
59
+ image.save(compressed_bytes, format="JPEG")
60
+ compressed_bytes.seek(0)
61
+
62
+ # Отправляем изображение в API
63
+ result = search_face(compressed_bytes.getvalue())
64
+ except Exception as e:
65
+ update.message.reply_text(f"Ошибка обработки изображения: {e}")
66
+ return
67
+
68
+ if "error" in result:
69
+ update.message.reply_text(f"Ошибка API: {result['error']}")
70
+ return
71
+
72
+ if not result.get("matches"):
73
+ update.message.reply_text("Совпадений не найдено.")
74
+ else:
75
+ # Отправляем совпадения пользователю
76
+ for match in result["matches"]:
77
+ url = match.get("url", "No URL provided")
78
+ img_base64 = match.get("image")
79
+
80
+ if img_base64:
81
+ # Конвертируем base64 обратно в изображение
82
+ img = Image.open(BytesIO(base64.b64decode(img_base64)))
83
+ bio = BytesIO()
84
+ img.save(bio, format="PNG")
85
+ bio.seek(0)
86
+
87
+ update.message.reply_photo(photo=InputFile(bio), caption=f"Найдено: {url}")
88
+
89
+ def main():
90
+ """Запускает бота."""
91
+ token = "7547882359:AAEvPupQV2CdGgRrs_aqoYnjpHCj41baK7c" # Ваш токен Telegram
92
+ updater = Updater(token)
93
+ dispatcher = updater.dispatcher
94
+
95
+ # Регистрируем обработчики
96
+ dispatcher.add_handler(CommandHandler("start", start))
97
+ dispatcher.add_handler(MessageHandler(Filters.photo, handle_image))
98
+
99
+ # Запуск бота
100
+ updater.start_polling()
101
+ updater.idle()
102
+
103
+ if __name__ == "__main__":
104
+ main()