Как получить медиа-контент в base64 с помощью пользовательского клиента для BotDetectCaptcha

#php #web-scraping #base64 #goutte #botdetect

#php #веб-очистка #base64 #goutte #botdetect

Вопрос:

Я пишу скребок для офисных задач: мой клиентский код Goutte выглядит так:

 $cokie = "JSESSIONID=0000H_WHw_eFPKVUDGxUei7v3PH:1db7cfi4s";
$client = new Client(HttpClient::create(array(
    'headers' => array(
        'Accept' => 'text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language' => 'en-US,en;q=0.5',
        'Connection' => 'keep-alive',
        'Host' => 'verification.nadra.gov.pk',
        "Cookie" => $cokie,
        'User-Agent' => 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'
    ),
)));
$cookie = new Cookie("JSESSIONID", $cokie, null, "/service", "https://example.com/", true, true);
$client->getCookieJar()->set($cookie);
$client->setServerParameter('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0');
$client->followRedirects(true);
$crawler = $client->request('GET', 'https://example.com/service/botdetectcaptcha?get=imageamp;amp;c=exampleCaptchaamp;amp;t=508c5eaf74fd4858b0c9debafc319d67');
    
 

Я должен отправить запрос с cookie, чтобы получить правильный контент.

 https://example.com/service/botdetectcaptcha?get=imageamp;amp;c=exampleCaptchaamp;amp;t=508c5eaf74fd4858b0c9debafc319d67
 

Результат снова тот же url:

 <html>
<head>
    <title>botdetectcaptcha (JPEG Image, 250amp;nbsp;×amp;nbsp;40 pixels)</title></head>
<body><img
        src="https://example.com/service/botdetectcaptcha?get=imageamp;amp;c=exampleCaptchaamp;amp;t=508c5eaf74fd4858b0c9debafc319d67"
        alt="https://example.com/service/botdetectcaptcha?get=imageamp;amp;c=exampleCaptchaamp;amp;t=508c5eaf74fd4858b0c9debafc319d67">
</body>
</html>
 

в браузере он работает нормально, но проблема в том, что когда я получаю изображение с этого URL, оно снова генерирует новое изображение без cookie, то есть оно не работает.

Я пробовал следующее:

 base64_encode(file_get_contents("https://example.com/service/botdetectcaptcha?get=imageamp;amp;c=exampleCaptchaamp;amp;t=508c5eaf74fd4858b0c9debafc319d67"));
 

выше отправить запрос GET без cookie, то есть способ получения изображения не работает для меня.

Ответ №1:

Я выполнил использование file_get_contents, отправив ту же информацию о клиенте, которую я отправляю в Goutte Client

 $url = "https://example.com/service/botdetectcaptcha?get=imageamp;c=exampleCaptchaamp;t=9d15db63ddc449f1850aad6e3183ce2e";

$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: enrn" .
"Cookie: " . $cookie_value ."rn" .  // check function.stream-context-create on php.net
"Host: https://example.com/rn" .
"User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0rn" // i.e. An iPad
)
);

$context = stream_context_create($options);
$img_base64 = base64_encode(file_get_contents($url, false, $context));
file_put_contents('img/img_9d15db63ddc449f1850aad6e3183ce2e.png', base64_decode($img_base64));
 

Ответ №2:

Поскольку HTML и изображение отправляются с одного и того же URL, вам необходимо определить Accept заголовок, и в вашем первом примере вы ожидаете text/html’, if you want to get an image you need to send , что image / png` смотрите здесь https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation/List_of_default_Accept_values

Комментарии:

1. Спасибо! Я пытался, но проблема не разрешилась. итак, я попытался, как я отвечу ниже. ваше решение работает, когда url имеет изображение. в моем случае это было что-то другое.