48 lines
1.9 KiB
Python
Executable File
48 lines
1.9 KiB
Python
Executable File
# /opt/docker/dev/service_finder/backend/app/services/harvester_cars.py
|
|
import httpx
|
|
import asyncio
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from .harvester_base import BaseHarvester
|
|
|
|
class VehicleHarvester(BaseHarvester):
|
|
def __init__(self):
|
|
super().__init__(category="car")
|
|
self.base_url = "https://www.carqueryapi.com/api/0.3/"
|
|
|
|
async def _get_api_data(self, params: dict):
|
|
async with httpx.AsyncClient() as client:
|
|
try:
|
|
response = await client.get(self.base_url, params=params, headers=self.headers, timeout=15.0)
|
|
if response.status_code == 200:
|
|
text = response.text
|
|
if text.startswith("?("): text = text[2:-2]
|
|
return response.json()
|
|
return None
|
|
except Exception as e:
|
|
print(f"CarQuery Robot Hiba: {e}")
|
|
return None
|
|
|
|
async def harvest_all(self, db: AsyncSession):
|
|
""" Automatikus CarQuery szinkronizáció MDM alapon. """
|
|
print("🚗 Személyautó Robot: Indul az adatgyűjtés...")
|
|
|
|
makes_data = await self._get_api_data({"cmd": "getMakes", "sold_in_us": 0})
|
|
if not makes_data: return
|
|
|
|
for make in makes_data.get("Makes", [])[:50]: # Teszt limit
|
|
make_id = make['make_id']
|
|
make_name = make['make_display']
|
|
|
|
models_data = await self._get_api_data({"cmd": "getModels", "make": make_id})
|
|
if not models_data: continue
|
|
|
|
for model in models_data.get("Models", []):
|
|
specs = {
|
|
"factory_data": {"api_source": "carquery", "api_make_id": make_id}
|
|
}
|
|
await self.log_entry(db, make_name, model['model_name'], specs)
|
|
|
|
await db.commit()
|
|
await asyncio.sleep(1) # Rate limiting
|
|
|
|
print("🏁 Személyautó Robot: Adatok szinkronizálva.") |