Spaces:
Configuration error
Configuration error
| import os | |
| import io | |
| import json | |
| from fastapi import FastAPI, File, UploadFile, Form | |
| from fastapi.responses import HTMLResponse | |
| from PIL import Image | |
| import imagehash | |
| app = FastAPI() | |
| DATABASE_DIR = "scam_database" | |
| VOTES_FILE = "votes.json" | |
| # ฟังก์ชันโหลดข้อมูลโหวตจากไฟล์ JSON | |
| def load_votes(): | |
| if os.path.exists(VOTES_FILE): | |
| try: | |
| with open(VOTES_FILE, "r", encoding="utf-8") as f: | |
| return json.load(f) | |
| except Exception: | |
| return {} | |
| return {} | |
| # ฟังก์ชันบันทึกข้อมูลโหวตลงไฟล์ JSON | |
| def save_votes(votes_data): | |
| with open(VOTES_FILE, "w", encoding="utf-8") as f: | |
| json.dump(votes_data, f, ensure_ascii=False, indent=2) | |
| # ฟังก์ชันดึง Hash ของรูปทั้งหมดในฐานข้อมูล | |
| def get_database_hashes(): | |
| hashes = {} | |
| if not os.path.exists(DATABASE_DIR): | |
| os.makedirs(DATABASE_DIR) | |
| for filename in os.listdir(DATABASE_DIR): | |
| if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.webp')): | |
| filepath = os.path.join(DATABASE_DIR, filename) | |
| try: | |
| img = Image.open(filepath) | |
| h = str(imagehash.phash(img)) | |
| hashes[filename] = h | |
| except Exception as e: | |
| print(f"Error loading {filename}: {e}") | |
| return hashes | |
| def serve_index(): | |
| if os.path.exists("index.html"): | |
| with open("index.html", "r", encoding="utf-8") as f: | |
| return f.read() | |
| return "<h1>index.html not found</h1>" | |
| async def check_image(file: UploadFile = File(...)): | |
| try: | |
| contents = await file.read() | |
| uploaded_img = Image.open(io.BytesIO(contents)) | |
| uploaded_hash_obj = imagehash.phash(uploaded_img) | |
| uploaded_hash_str = str(uploaded_hash_obj) | |
| db_hashes = get_database_hashes() | |
| votes_data = load_votes() | |
| MATCH_THRESHOLD = 12 | |
| matched_hash_key = None | |
| is_in_db = False | |
| # เปรียบเทียบกับภาพในฐานข้อมูล | |
| for filename, db_hash_str in db_hashes.items(): | |
| db_hash_obj = imagehash.hex_to_hash(db_hash_str) | |
| distance = uploaded_hash_obj - db_hash_obj | |
| if distance <= MATCH_THRESHOLD: | |
| matched_hash_key = db_hash_str | |
| is_in_db = True | |
| break | |
| # ถ้าไม่เจอในฐานข้อมูล ใช้ Hash ของภาพที่อัปโหลดเป็น Key | |
| if not matched_hash_key: | |
| matched_hash_key = uploaded_hash_str | |
| # ดึงคะแนนโหวต | |
| image_vote = votes_data.get(matched_hash_key, {"likes": 0, "dislikes": 0}) | |
| likes = image_vote.get("likes", 0) | |
| dislikes = image_vote.get("dislikes", 0) | |
| # เงื่อนไขตรวจสอบสถานะ | |
| if likes >= 100: | |
| is_scam = False | |
| result_text = "ปลอดภัย" | |
| detail_text = f"รูปภาพนี้ได้รับการยืนยันว่าปลอดภัยจากผู้ใช้งาน (กดไลก์ {likes} คน)" | |
| elif is_in_db: | |
| is_scam = True | |
| result_text = "มิจแน่นอน100%" | |
| detail_text = "พบรูปภาพตรงกับฐานข้อมูลรูปภาพโปรโมทหลอกลวง" | |
| else: | |
| is_scam = False | |
| result_text = "ไม่สามารถตรวจสอบได้" | |
| detail_text = "ยังไม่พบรูปภาพนี้ในฐานข้อมูลมิจฉาชีพ" | |
| return { | |
| "is_scam": is_scam, | |
| "result": result_text, | |
| "detail": detail_text, | |
| "image_hash": matched_hash_key, | |
| "likes": likes, | |
| "dislikes": dislikes | |
| } | |
| except Exception as e: | |
| return {"error": f"เกิดข้อผิดพลาดในการประมวลผล: {str(e)}"} | |
| async def vote_image(image_hash: str = Form(...), vote_type: str = Form(...)): | |
| try: | |
| votes_data = load_votes() | |
| if image_hash not in votes_data: | |
| votes_data[image_hash] = {"likes": 0, "dislikes": 0} | |
| if vote_type == "like": | |
| votes_data[image_hash]["likes"] += 1 | |
| elif vote_type == "dislike": | |
| votes_data[image_hash]["dislikes"] += 1 | |
| save_votes(votes_data) | |
| likes = votes_data[image_hash]["likes"] | |
| dislikes = votes_data[image_hash]["dislikes"] | |
| # คำนวณสถานะใหม่หลังกดโหวต | |
| db_hashes = get_database_hashes() | |
| is_in_db = image_hash in db_hashes.values() | |
| if likes >= 100: | |
| is_scam = False | |
| result_text = "ปลอดภัย" | |
| detail_text = f"รูปภาพนี้ได้รับการยืนยันว่าปลอดภัยจากผู้ใช้งาน (กดไลก์ {likes} คน)" | |
| elif is_in_db: | |
| is_scam = True | |
| result_text = "มิจแน่นอน100%" | |
| detail_text = "พบรูปภาพตรงกับฐานข้อมูลรูปภาพโปรโมทหลอกลวง" | |
| else: | |
| is_scam = False | |
| result_text = "ไม่สามารถตรวจสอบได้" | |
| detail_text = "ยังไม่พบรูปภาพนี้ในฐานข้อมูลมิจฉาชีพ" | |
| return { | |
| "success": True, | |
| "likes": likes, | |
| "dislikes": dislikes, | |
| "is_scam": is_scam, | |
| "result": result_text, | |
| "detail": detail_text | |
| } | |
| except Exception as e: | |
| return {"error": f"เกิดข้อผิดพลาดในการโหวต: {str(e)}"} | |