init: Search Hub - 统一多搜索引擎聚合服务
This commit is contained in:
61
providers/searxng_provider.py
Normal file
61
providers/searxng_provider.py
Normal file
@@ -0,0 +1,61 @@
|
||||
"""SearXNG 搜索源 — 自托管元搜索引擎"""
|
||||
|
||||
import time
|
||||
import requests
|
||||
from providers.base import BaseProvider, SearchResult
|
||||
|
||||
|
||||
class SearXNGProvider(BaseProvider):
|
||||
name = 'searxng'
|
||||
display_name = 'SearXNG'
|
||||
needs_api_key = False
|
||||
enabled = True
|
||||
priority = 30
|
||||
|
||||
def __init__(self, config: dict):
|
||||
super().__init__(config)
|
||||
sc = config.get('searxng', {})
|
||||
self.base_url = (sc.get('base_url') or 'http://localhost:8888').rstrip('/')
|
||||
|
||||
def is_available(self) -> bool:
|
||||
return True
|
||||
|
||||
def search(self, query: str, max_results: int = 10) -> list:
|
||||
url = f'{self.base_url}/search'
|
||||
params = {
|
||||
'q': query,
|
||||
'format': 'json',
|
||||
'language': 'zh-CN',
|
||||
'categories': 'general',
|
||||
'pageno': 1,
|
||||
}
|
||||
|
||||
try:
|
||||
resp = requests.get(url, params=params, timeout=15,
|
||||
headers={'User-Agent': 'SearchHub/1.0',
|
||||
'Accept': 'application/json'})
|
||||
if resp.status_code != 200:
|
||||
return []
|
||||
|
||||
data = resp.json()
|
||||
results = []
|
||||
for item in data.get('results', []):
|
||||
published = item.get('publishedDate', '')
|
||||
if published:
|
||||
try:
|
||||
published = published.replace('T', ' ').split('+')[0].split('Z')[0]
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
results.append(SearchResult(
|
||||
title=item.get('title', ''),
|
||||
url=item.get('url', ''),
|
||||
content=item.get('content', ''),
|
||||
score=item.get('score', 0.5),
|
||||
source=self.name,
|
||||
published_date=published,
|
||||
))
|
||||
return results[:max_results]
|
||||
|
||||
except requests.exceptions.RequestException:
|
||||
return []
|
||||
Reference in New Issue
Block a user