64 lines
2.0 KiB
PHP
64 lines
2.0 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.145: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
|
|
{
|
|
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 (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;
|
|
}
|
|
}
|