105 lines
2.9 KiB
PHP
Executable File
105 lines
2.9 KiB
PHP
Executable File
<?php
|
|
header('Content-Type: application/json');
|
|
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
$query = $input['query'] ?? $_GET['q'] ?? '';
|
|
$engine = $input['engine'] ?? 'duckduckgo';
|
|
|
|
if (empty($query)) {
|
|
echo json_encode(['error' => 'Query requis']);
|
|
exit;
|
|
}
|
|
|
|
// DuckDuckGo Instant Answer API (gratuit, sans clé)
|
|
function searchDuckDuckGo($query) {
|
|
$url = "https://api.duckduckgo.com/?q=" . urlencode($query) . "&format=json&no_html=1";
|
|
$ch = curl_init();
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $url,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_TIMEOUT => 10,
|
|
CURLOPT_USERAGENT => 'WEVAL MIND-IA/2.0'
|
|
]);
|
|
$response = curl_exec($ch);
|
|
curl_close($ch);
|
|
return json_decode($response, true);
|
|
}
|
|
|
|
// SearXNG (self-hosted search, si disponible)
|
|
function searchSearXNG($query) {
|
|
$url = "http://localhost:8888/search?q=" . urlencode($query) . "&format=json";
|
|
$ch = curl_init();
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $url,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_TIMEOUT => 10
|
|
]);
|
|
$response = curl_exec($ch);
|
|
curl_close($ch);
|
|
return json_decode($response, true);
|
|
}
|
|
|
|
// Scraping simple pour résultats web
|
|
function scrapeWebResults($query) {
|
|
$results = [];
|
|
|
|
// Utiliser DuckDuckGo HTML (fallback)
|
|
$url = "https://html.duckduckgo.com/html/?q=" . urlencode($query);
|
|
$ch = curl_init();
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $url,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_TIMEOUT => 15,
|
|
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
CURLOPT_FOLLOWLOCATION => true
|
|
]);
|
|
$html = curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
// Parser les résultats
|
|
if (preg_match_all('/<a class="result__a" href="([^"]+)"[^>]*>([^<]+)<\/a>/', $html, $matches, PREG_SET_ORDER)) {
|
|
foreach (array_slice($matches, 0, 5) as $m) {
|
|
$results[] = [
|
|
'title' => html_entity_decode($m[2]),
|
|
'url' => $m[1],
|
|
'snippet' => ''
|
|
];
|
|
}
|
|
}
|
|
|
|
// Extraire snippets
|
|
if (preg_match_all('/<a class="result__snippet"[^>]*>([^<]+)<\/a>/', $html, $snippets)) {
|
|
foreach ($snippets[1] as $i => $s) {
|
|
if (isset($results[$i])) {
|
|
$results[$i]['snippet'] = html_entity_decode(strip_tags($s));
|
|
}
|
|
}
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
$results = [];
|
|
$instant = null;
|
|
|
|
// Essayer DuckDuckGo Instant Answer d'abord
|
|
$ddg = searchDuckDuckGo($query);
|
|
if (!empty($ddg['AbstractText'])) {
|
|
$instant = [
|
|
'answer' => $ddg['AbstractText'],
|
|
'source' => $ddg['AbstractSource'] ?? 'DuckDuckGo',
|
|
'url' => $ddg['AbstractURL'] ?? ''
|
|
];
|
|
}
|
|
|
|
// Résultats web
|
|
$results = scrapeWebResults($query);
|
|
|
|
echo json_encode([
|
|
'query' => $query,
|
|
'instant_answer' => $instant,
|
|
'results' => $results,
|
|
'count' => count($results)
|
|
]);
|
|
|