Я хочу создать многопользовательскую форму регистрации, которая будет публиковать сообщения на нескольких сайтах, и пользователю не нужно будет вводить одни и те же данные снова и снова, но он будет публиковать их в этой форме. Проблема в том, что на некоторых сайтах может быть прописной код, поэтому мне нужен способ чтобы получить изображение капчи в моей форме, используя куки, сессии, curl, я не знаю, какой метод мне может помочь.
Проблема стала сложной, потому что мне нужно сохранить идентификатор сеанса и куки, потому что, если я отправлю форму, другие сайты должны знать, что это тот же пользователь, который запросил капчу. PHP-скрипт, который я использовал для получения catpcha:
$ch = curl_init($url);//Site url
curl_setopt($ch, CURLOPT_COOKIEJAR, $file); //Save the cookie to a temporary file on the server
curl_setopt($ch, CURLOPT_COOKIEFILE, $file);
curl_setopt($ch, CURLOPT_HEADER ,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER ,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$content = curl_exec($ch);
preg_match("'<div class=\"captchaimage\">(.*?)<a class=\"captcha-refresh-link hide\"'si", $content, $matches ); // getting the captcha image
echo $matches[1]; //Displaying the image
В первый раз, когда я использую этот код, он показывает разбитое изображение:
Когда я обновляю страницу или открываю в другой вкладке сайт, на котором я запрашиваю капчу, он показывает требуемую капчу:
Поэтому мне нужна помощь, потому что я мало работал с curl и cookie, но я знаю, что у проблемы есть решение, подобное этому сайту https://www.betall.ie/register.html. Буду признателен за помощь :).
PHP-код здесь: http://codepad.viper-7.com/FMKrGR
curl_setopt($ch, CURLOPT_COOKIEJAR, $file);
Можете ли вы использовать разные файлы cookie для разных $ url? Я думаю, что это может помочь. Элементы cookie с разных URL не будут смешиваться.
Нашел решение для получения капчи с другого примера сайта:
function getCaptcha($file){
header ('Content-Type: image/png');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2');
curl_setopt($ch, CURLOPT_COOKIEJAR, $file);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HEADER, 1);
$out['result'] = curl_exec($ch); //getting the html of the page
$out['error'] = curl_error($ch);
$out['info'] = curl_getinfo($ch);
curl_close($ch);
$matches = array();
preg_match("'<div class=\"captchaimage\">(.*?)<a class=\"captcha-refresh-link hide\"'si", $out['result'], $matches );
if(!isset($matches[1])){
getCaptcha($file);
return;
}
$img = $matches[1];
$src = strpos($img, 'src="') + 5;
$srcend = strpos($img, '"', $src);
$img_src ='https://www.example.com' . substr($img, $src, $srcend - $src);
$img = substr($img, 0, $src) . 'https://www.example.com' . substr($img, $src); //Getting the image captcha via regex
$ch = curl_init($img_src);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $file);
$out2['result'] = curl_exec($ch);
$out2['error'] = curl_error($ch);
$out2['info'] = curl_getinfo($ch);
curl_close($ch); //requesting the image via curl
return $out2['result']; //returning the image
}