Spaces:
Sleeping
Sleeping
File size: 4,658 Bytes
ff3fc75 fde8374 7230c8c 27f34ba 0ea130d 57896de 5d2a27a 3da121b 884a60b dbfff3c 9e0fa9c 0ea130d bca9901 27f34ba aa9a7c9 ddfa90b 27f34ba 5f014d7 27f34ba 5f014d7 ddfa90b 24f7b24 7230c8c 5d2a27a dbfff3c 27f34ba dbfff3c 7230c8c efa22ad 53be93f 27f34ba efa22ad 5d2a27a 27f34ba 5d2a27a 27f34ba 5d2a27a 24f7b24 efa22ad e01bdd4 9052625 efa22ad 9052625 efa22ad 24f7b24 dbfff3c 9e0fa9c 27f34ba 9e0fa9c 3da121b 20b5a1e 9e0fa9c 6e6e56f 884a60b 6e6e56f 884a60b 6e6e56f 884a60b 6e6e56f 884a60b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# app.py
from fastapi import FastAPI, HTTPException, Query, Depends, Header
from pydantic import BaseModel, HttpUrl, Field
from typing import List, Dict, Optional, Any
from parser.assembler import parse_law_from_texts
from supabase_utils import save_law_to_supabase
from helpers.indexer import build_indexed_response
from helpers.blocks_all import extract_from_url
from parser.extract_tables_by_article import extract_tables_from_url
import os
app = FastAPI(
title="Text Extractor API",
description="API لاستخراج النصوص من صفحات الويب مع إمكانية التحكم في النطاقات",
version="2.1.0"
)
API_TOKEN = os.getenv("API_TOKEN")
def verify_api_token(x_api_token: str = Header(None)):
# إذا لم يتم إرسال التوكن
if not x_api_token:
raise HTTPException(
status_code=401,
detail="API token is required"
)
# إذا لم يكن التوكن مضبوط في secrets
if not API_TOKEN:
raise HTTPException(
status_code=500,
detail="API token not configured on server"
)
# إذا كان التوكن غير مطابق
if x_api_token != API_TOKEN:
raise HTTPException(
status_code=401,
detail="Invalid API token"
)
class IndexedURLRequest(BaseModel):
url: HttpUrl
save_to_supabase: bool = False
timeout: int = Field(10, ge=1, le=60)
title_index: Optional[int] = Field(None, ge=0)
preamble_start: Optional[int] = Field(None, ge=0)
preamble_end: Optional[int] = Field(None, ge=0)
body_start: Optional[int] = Field(None, ge=0)
body_end: Optional[int] = Field(None, ge=0)
return_parsed: bool = Field(False, description="إرجاع النتيجة محلّلة (parsed) بدلاً من raw texts")
ranges: Optional[List[List[int]]] = None
from fastapi import Depends
@app.post("/extract")
async def extract_indexed(
request: IndexedURLRequest,
_: None = Depends(verify_api_token)
):
try:
# 1) استخراج النصوص الخام من الرابط
raw_texts = await extract_from_url(str(request.url), request.timeout)
# 2) بناء قائمة مفهرسة بالخيارات المرسلة (قد تكون None)
datalist = build_indexed_response(
texts=raw_texts,
title_index=request.title_index,
preamble_start=request.preamble_start,
preamble_end=request.preamble_end,
body_start=request.body_start,
body_end=request.body_end
)
# 3) إذا كان return_parsed = True → نرجّع البيانات بعد التحليل
if request.return_parsed:
parsed = parse_law_from_texts(datalist, str(request.url))
# 4) حفظ إلى Supabase إذا طُلب
if request.save_to_supabase:
save_law_to_supabase(parsed["law"])
return parsed
# 5) وإلا نرجّع القائمة المفهرسة كما هي
return datalist
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"خطأ في معالجة المحتوى: {str(e)}"
)
# ============================
# نقطة GET بسيطة لإرجاع النصوص بدون فهرسة
# ============================
@app.get("/extract_link")
async def extract_link_get(
url: HttpUrl = Query(..., description="رابط الصفحة المراد استخراج النصوص منها"),
timeout: int = Query(10, ge=1, le=60, description="مهلة الطلب بالثواني")
):
try:
raw_texts = await extract_from_url(str(url), timeout)
return raw_texts
except Exception as e:
raise HTTPException(status_code=500, detail=f"خطأ في معالجة المحتوى: {str(e)}")
@app.get("/extract_tables")
async def extract_tables_get(
url: HttpUrl = Query(..., description="رابط الصفحة المراد استخراج الجداول منها"),
timeout: int = Query(10, ge=1, le=60, description="مهلة الطلب بالثواني")
):
"""
استخراج جميع الجداول المرتبطة بالمواد من صفحة الويب وإرجاعها كهيكل JSON مرتب.
"""
try:
# استخدام الوظيفة المستقلة الجديدة
result = await extract_tables_from_url(str(url), timeout)
return result
except Exception as e:
raise HTTPException(status_code=500, detail=f"خطأ في معالجة الجداول: {str(e)}")
|