53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
import httpx
|
|
from fastapi import FastAPI, HTTPException
|
|
|
|
app = FastAPI(title="GISP Scraper API (API-Direct)")
|
|
|
|
# The API endpoint identified from network inspection
|
|
API_URL = "https://gisp.gov.ru/pp719v2/pub/prod/b/"
|
|
|
|
async def fetch_gisp_data(registry_number: str):
|
|
# Constructing the filter payload based on what we saw in the Network tab
|
|
# We will remove the restrictive date filters (res_valid_till, etc.)
|
|
payload = {
|
|
"opt": {
|
|
"sort": None,
|
|
"requireTotalCount": True,
|
|
"searchOperation": "contains",
|
|
"searchValue": None,
|
|
"skip": 0,
|
|
"take": 10,
|
|
"userData": {},
|
|
"filter": ["product_reg_number_2023", "contains", registry_number]
|
|
}
|
|
}
|
|
|
|
async with httpx.AsyncClient() as client:
|
|
try:
|
|
response = await client.post(API_URL, json=payload, timeout=30.0)
|
|
response.raise_for_status()
|
|
data = response.json()
|
|
|
|
# GISP usually returns { "data": [ ... ], "totalCount": N }
|
|
if "data" in data and len(data["data"]) > 0:
|
|
# Return the URL or specific entry found
|
|
# Based on the DevExtreme schema, we might need a specific ID to form the URL
|
|
return data["data"]
|
|
return None
|
|
except Exception as e:
|
|
print(f"API scraping error: {e}")
|
|
return None
|
|
|
|
@app.get("/scrape/{registry_number:path}")
|
|
async def get_product_link(registry_number: str):
|
|
results = await fetch_gisp_data(registry_number)
|
|
if not results:
|
|
raise HTTPException(status_code=404, detail="Product not found or scraping failed")
|
|
|
|
# We can refine this to return the specific URL or the whole result object
|
|
return {"registry_number": registry_number, "results": results}
|
|
|
|
@app.get("/health")
|
|
def health():
|
|
return {"status": "ok"}
|