Остановить скрипт для ввода капчи, затем - продолжить...

  • Заблокирован
  • #11
1. В начале каждого цикла парсинга проверям флаг
2. Если все ок, то парсим дальше
3. Если неок, то выводим любым способом формочку, куда надо вбить капчу
4. Возвращаемся к пункту 1
Дергаешь курлом, парсишь регуляркой. Только не забудь подхватывать сессию.
Надеюсь алгоритм понятен

А зацикленный на бесконечность выполнения php скрипт (пока не введут капчу) не будет жрать ресурсы процессора?
 
А зацикленный на бесконечность выполнения php скрипт (пока не введут капчу) не будет жрать ресурсы процессора?
Если проверять каждую секунду, к примеру, то не будет.
PHP:
sleep(1);
 
Моя ф-ция с парсера гугла если нарвались на капчу
PHP:
function CheckCaptchaError($data){
# Your client has issued a malformed or illegal request.
if(preg_match('/To protect our users/s',$data)) die("\nOOOOOps... To protect our users, we can't process your request right now.");

preg_match('/<img src="(\/sorry\/image\?id=\d+)/s',$data,$err);
        if($captcha=$err[1]){
        $cimg=$this->curl->fetch_url($this->init_url.$captcha);
        if(!$cimg) die('Cant get captcha');
        $capf=fopen($this->capFile,'w');
        flock($capf,LOCK_EX);
        fwrite($capf,$cimg);
        fclose($capf);

        $capanswer=fopen($this->capAnswerFile,'w');
        fclose($capanswer);

                while(!$answer=file_get_contents($this->capAnswerFile)){
                echo "Waiting for captcha answer... Sleeping 5 sec.\n";flush();ob_flush();
                sleep(5);
                }

        //got answer, so post it
        preg_match('/name="continue" value="(.*?)">/s',$data,$cont); $cont=$cont[1];
        preg_match('/name="id" value="(.*?)">/s',$data,$id); $id=$id[1];
        $result=$this->curl->fetch_url($this->init_url.'/sorry/Captcha?id='.$id."&continue=$cont&captcha=$answer");
        if(!$result) die('Cant send captcha');
        $this->CheckCaptchaError($result);
        preg_match('/content="1; url=(.*?)"/s',$result,$urlto);$urlto=$urlto[1];
        if(file_exists($this->capAnswerFile))unlink($this->capAnswerFile);
        if(file_exists($this->capFile))unlink($this->capFile);
        return $this->curl->fetch_url($urlto);
        }
return $data;
}

Вкратце - если нарвались на капчу, сохраняем ее в файл и говорим что нарвались на капчу и каждые 5 секунд смотрим есть ли текстовичок с ответом на капчу
 
Сегодня понадобилось ручное распознавание. Пришлось написать небольшой класс. Пример использования:
PHP:
require_once("ManualCaptchaClass.php");
set_time_limit(0);
echo '<a href="" onClick=\'window.open("index.html","Captcha","width=600,height=200,toolbar=no")\'>Открыть окно распознавания</a><br><br>'; flush();
$obj = new ManualCaptchaClass;
for($i=1; $i<=5; ++$i) {
	$obj->setcaptcha(file_get_contents("урл_каптчи"),"png");
	echo $i." ".$obj->recognize()."<br>";
	flush();
}
Код открыт. Легко модифицируется под собственные нужды. Протестировал в Firefox 3, Chrome, IE 8
 
Интересный класс. А привязать его к автоматической распознавалке возможно?
 
Назад
Сверху