Search / app.py
Lambeckkk's picture
Create app.py
73b98c7 verified
import os, uuid, shutil
from flask import Flask, request, jsonify
from PIL import Image
import face_recognition
import requests
from io import BytesIO
from bs4 import BeautifulSoup
TMP_DIR = "temp"
os.makedirs(TMP_DIR, exist_ok=True)
app = Flask(__name__)
def scrape_yandex_reverse(image_bytes):
session = requests.Session()
headers = {"User-Agent": "Mozilla/5.0"}
temp_path = os.path.join(TMP_DIR, f"{uuid.uuid4().hex}.jpg")
with open(temp_path, "wb") as f:
f.write(image_bytes)
files = {"upfile": open(temp_path, "rb")}
upload_url = "https://yandex.com/images/search"
r = session.post(upload_url, files=files, headers=headers, allow_redirects=True)
search_url = r.url
r2 = session.get(search_url, headers=headers)
soup = BeautifulSoup(r2.text, "html.parser")
image_elements = soup.select("img.serp-item__thumb")
image_links = [img.get("src") for img in image_elements if img.get("src")]
return image_links[:10]
@app.route('/upload', methods=['POST'])
def upload():
if 'image' not in request.files:
return jsonify({"error": "No image uploaded"}), 400
uploaded = request.files['image']
image = face_recognition.load_image_file(uploaded)
try:
original_enc = face_recognition.face_encodings(image)[0]
except:
return jsonify({"error": "No face found"}), 400
matches = []
image_bytes = uploaded.read()
results = scrape_yandex_reverse(image_bytes)
for link in results:
try:
response = requests.get(link, timeout=6)
img = Image.open(BytesIO(response.content)).convert("RGB")
path = os.path.join(TMP_DIR, f"{uuid.uuid4().hex}.jpg")
img.save(path)
comp = face_recognition.load_image_file(path)
encs = face_recognition.face_encodings(comp)
for enc in encs:
if face_recognition.compare_faces([original_enc], enc, tolerance=0.5)[0]:
matches.append({"image_url": link, "source_url": link})
break
except:
continue
shutil.rmtree(TMP_DIR)
os.makedirs(TMP_DIR, exist_ok=True)
return jsonify({"matches": matches})
if __name__ == '__main__':
app.run(host="0.0.0.0", port=7860)