wolgast
Профессор
- Регистрация
- 8 Дек 2006
- Сообщения
- 297
- Реакции
- 35
- Автор темы
- #1
Я уже как-то писал о том, как "разгадывать капчи"
Цель: автоматизировать добавление страниц в addurl Яндекса (webmaster.yandex.ru)
Скрипт конечно же на PHP и для определения значений капчи я все также использую сервис anti-captcha.com.
Вперед…
Форма с данными отправляется на Для просмотра ссылки Войдиили Зарегистрируйся
Принимаемые данные:
Основная задача для нас - получить идентификатор операции. Это своего рода идентификатор сессии, только он не прячется в куках. Можно написать регулярное выражение, но я решил использовать одну известную мне полезную функцию
К примеру чтобы из вот этого
вытащить идентификатор, использует функцию следующим образом
Дальше идем за качпей. Ее получаем по адресу
Следующим шагом нужно определить значение этой капчи. Об этом я подробно писал раньше. Если значение капчи нам известно, то остается только отправить форму скрипту яндекса.
Вот и все. Кстате для этого метода нет необходимости использовать прокси т.к. капчи вводятся безошибочно, а значит и банить незачто!
Полный листинг:
Архив со скриптом
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.
а сейчас решил развить этот пример в что-то более практичное.Цель: автоматизировать добавление страниц в addurl Яндекса (webmaster.yandex.ru)
Скрипт конечно же на PHP и для определения значений капчи я все также использую сервис anti-captcha.com.
Вперед…
Форма с данными отправляется на Для просмотра ссылки Войди
Принимаемые данные:
url => добавляемый url
key => идентификатор операции
rep => значение капчи
key => идентификатор операции
rep => значение капчи
Основная задача для нас - получить идентификатор операции. Это своего рода идентификатор сессии, только он не прячется в куках. Можно написать регулярное выражение, но я решил использовать одну известную мне полезную функцию
PHP:
//возвращает то, что между $left и $right в $str
function cut_str($str, $left, $right)
{
$str = substr(stristr($str, $left), strlen($left));
$leftLen = strlen(stristr($str, $right));
$leftLen = $leftLen ? -($leftLen) : strlen($str);
$str = substr($str, 0, $leftLen);
return $str;
}
Код:
<input type=“hidden” name=“key” value=“41b8227dcc2c765d90386921797db4ca”>
вытащить идентификатор, использует функцию следующим образом
PHP:
$key = cut_str($data, ‘name=”key” value=”‘,’”‘);
Дальше идем за качпей. Ее получаем по адресу
http://captcha.yandex.net/image?key={идентификатор операции}
Следующим шагом нужно определить значение этой капчи. Об этом я подробно писал раньше. Если значение капчи нам известно, то остается только отправить форму скрипту яндекса.
PHP:
$postdata = array(
‘url’ => $link,
‘key’ => $key,
‘rep’ => $captcha_value
);
PHP:
$cap = geturl(”http://webmaster.yandex.ru/add.xml”,$postdata);
Вот и все. Кстате для этого метода нет необходимости использовать прокси т.к. капчи вводятся безошибочно, а значит и банить незачто!
Полный листинг:
PHP:
<?php
/*
* Автор: koder
* 13.02.09
*
* Дополнительная информация
* http://myseoincome.ru/2009/02/php_yandex_addurl/
*
*/
set_time_limit(0);
//ключь anti-captcha
$anti_captcha_key = '......';
//файлик с URLами
$urls = file('url.txt');
$i=1;
foreach ($urls as $link){ //получили адрес
$data = geturl('http://webmaster.yandex.ru/');
$key = cut_str($data, 'name="key" value="','"'); //получили идентификатор сеанса
$captcha = geturl('http://captcha.yandex.net/image?key='.$key); //слили капчу
$postdata = array(
'method' => 'base64',
'key' => $anti_captcha_key,
'body' => base64_encode($captcha),
'ext' => 'jpg',
'phrase' => 0,
'regsense' => 0,
'numeric' => 0,
'min_len' => 0,
'max_len' => 0
);
$rev = geturl("http://anti-captcha.com/in.php",$postdata); //отдали капчу антикапче
if (substr($rev,0,2)=='OK'){
$anti_captcha_id = substr($rev,3);
}else{
echo "Upload ERROR";
exit;
}
sleep(20); //подождем 20сек. пока ее разгадают
$postdata = array(
'key' => $anti_captcha_key,
'action' => 'get',
'id' => $anti_captcha_id
);
$cap = geturl("http://anti-captcha.com/res.php",$postdata); //ответ от антикапчи
if (substr($cap,0,2)=='OK'){
$captcha_value = substr($cap,3);
}else{
echo $cap;
exit;
}
$postdata = array(
'url' => $link,
'key' => $key,
'rep' => $captcha_value
);
$cap = geturl("http://webmaster.yandex.ru/add.xml",$postdata); //спамим в яндекс
echo $i.": ".$link.' - ';
if (strpos($cap, 'успешно добавлен')){
echo 'ok<br>';
}elseif (strpos($cap, 'уже проиндексирован')){
echo 'в индексе<br>';
}elseif (strpos($cap, 'является зеркалом')){
echo 'зеркало<br>';
}elseif (strpos($cap, 'неверно указали цифровой код')){
echo 'Captcha error<br>';
$postdata = array(
'key' => $anti_captcha_key,
'action' => 'reportbad',
'id' => $anti_captcha_id
);
$cap = geturl("http://anti-captcha.com/res.php",$postdata);
}elseif (strpos($cap, 'robots.txt')){
echo 'запрещен в файле robots.txt<br>';
}elseif (strpos($cap, 'отличный от 200')){
echo '404<br>';
}elseif (strpos($cap, 'запрещен к индексированию')){
echo 'ban<br>';
}else{
echo 'error<br>';
//echo $cap;
//exit;
}
$i++;
}
//возвращает то, что между $left и $right в $str
function cut_str($str, $left, $right)
{
$str = substr(stristr($str, $left), strlen($left));
$leftLen = strlen(stristr($str, $right));
$leftLen = $leftLen ? -($leftLen) : strlen($str);
$str = substr($str, 0, $leftLen);
return $str;
}
function geturl($url,$postdata=0)
{
$poststr="";
if ($postdata)
while (list($name,$value)=each($postdata)){
if (strlen($poststr)>0)
$poststr.="&";
$poststr.=$name."=".urlencode($value);
}
// инициализация сеанса
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
if ($postdata){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $poststr);
}
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
?>
Архив со скриптом
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.