File size: 1,261 Bytes
9e93b10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

import logging

from rexpro_ai.retrieval.web.main import SearchResult, get_filtered_results
from rexpro_ai.utils.session_pool import get_session

log = logging.getLogger(__name__)


async def search_serpstack(
    api_key: str,
    query: str,
    count: int,
    filter_list: list[str | None] | None = None,
    https_enabled: bool = True,
) -> list[SearchResult]:
    """Query the serpstack.com API and return normalised results.

    Uses HTTPS by default; set ``https_enabled=False`` for free-tier HTTP access.
    """
    scheme = 'https' if https_enabled else 'http'
    url = f'{scheme}://api.serpstack.com/search'
    params = {'access_key': api_key, 'query': query}

    session = await get_session()
    async with session.get(url, params=params) as response:
        response.raise_for_status()
        payload = await response.json()

    organic = sorted(payload.get('organic_results', []), key=lambda x: x.get('position', 0))
    if filter_list:
        organic = get_filtered_results(organic, filter_list)

    return [
        SearchResult(
            link=item.get('url', ''),
            title=item.get('title'),
            snippet=item.get('snippet'),
        )
        for item in organic[:count]
    ]