Files
nuhodds_fi4/app/Services/CloudflareSolverService.php
T
2026-10-03 10:40:43 +02:00

73 lines
2.4 KiB
PHP

<?php
namespace App\Services;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class CloudflareSolverService
{
protected string $solverUrl = 'http://192.168.178.187:8191/v1';
/**
* Holt die Daten und gibt das extrahierte JSON als PHP-Array zurück.
* Wenn etwas schiefgeht, wird null zurückgegeben.
*/
public function getJsonFromUrl(string $targetUrl): ?array
{
/**
* set in .env
* FLARESOLVERR_IP_DOCKER="http://192.168.178.199:8191/v1"
*/
$this->solverUrl = env('FLARESOLVERR_IP_DOCKER', 'http://192.168.178.187:8191/v1');
try {
$response = Http::withHeaders([
'Content-Type' => 'application/json',
])->timeout(120)->post($this->solverUrl, [
'cmd' => 'request.get',
'url' => $targetUrl,
'maxTimeout' => 90000,
]);
if ($response->failed()) {
Log::error('FlareSolverr Verbindungsfehler. Status: ' . $response->status());
return null;
}
$data = $response->json();
if (strpos($data['solution']['response'], '"code": 403, "reason": "challenge"') !== false) {
dd($data);
}
if (isset($data['status']) && $data['status'] === 'ok') {
$htmlContent = $data['solution']['response'];
// JSON aus dem HTML isolieren
if (preg_match('/\{.*\}/s', $htmlContent, $matches)) {
$rawJson = $matches[0];
$decoded = json_decode($rawJson, true);
if (json_last_error() === JSON_ERROR_NONE) {
// HIER: Erfolgreiche Rückgabe des Arrays!
return $decoded;
}
Log::error('Extrahiertes Textfragment ist kein gültiges JSON.');
} else {
Log::error('Kein JSON-Muster { ... } im HTML gefunden.');
}
} else {
Log::error('FlareSolverr konnte die Seite nicht umgehen: ' . json_encode($data));
}
} catch (\Exception $e) {
Log::error('PHP Exception im CloudflareSolverService: ' . $e->getMessage());
}
// Falls irgendwo ein Fehler auftrat, geben wir null zurück
return null;
}
}