ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|
Работа с Капчей и Антикапчей на примере mts.com.ua [в виде урока] |

15.07.2009, 14:53
|
|
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме: 1698585
Репутация:
818
|
|
Работа с Капчей и Антикапчей на примере mts.com.ua [в виде урока]
Статья расчитана на новичков, желающих понять как работать с капчей и сервисом Антикапча. И так делать было нечего, решил посмотреть на сервис Антикапчи, заодно подкину Инвайт: fb9ac24a58. Цель выбрал сайт Украинского Мобильного Оператора MTC, скрипт отправки СМС - http://www.mts.com.ua/ukr/sendsms.php
Вообщем дальше исходники и коментарии к ним:
Файл mts.php
PHP код:
<?php
$ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4';
$ch = curl_init('http://www.mts.com.ua/ukr/sendsms.php');
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_REFERER, 'http://www.mts.com.ua/ukr/sendsms.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
### Func ###
function get_session($var)
{
preg_match('#PHPSESSID=(.*);#',$var,$matches);
$session = $matches[1];
return $session;
}
############
$session = get_session($res);
if(preg_match('#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#',$res,$matches))
{
$rnd = $matches[2];
$ch = curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd");
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session);
curl_setopt($ch, CURLOPT_REFERER, 'http://www.mts.com.ua/ukr/sendsms.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
file_put_contents('cap.jpg',$res);
}
#######################################
function recognize($filename, $apikey, $is_verbose = true, $rtimeout = 3, $mtimeout = 200, $is_phrase = 0, $is_regsense = 0, $is_numeric = 0, $min_len = 0, $max_len = 0)
{
if (!file_exists($filename))
{
if ($is_verbose) echo "file $filename not found\n";
return false;
}
$postdata = array(
'method' => 'post',
'key' => $apikey,
'file' => '@'.$filename, //полный путь к файлу
'phrase' => $is_phrase,
'regsense' => $is_regsense,
'numeric' => $is_numeric,
'min_len' => $min_len,
'max_len' => $max_len,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://ac-service.info/in.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
$result = curl_exec($ch);
if (curl_errno($ch))
{
if ($is_verbose) echo "CURL returned error: ".curl_error($ch)."\n";
return false;
}
curl_close($ch);
if (strpos($result, "ERROR")!==false)
{
if ($is_verbose) echo "server returned error: $result\n";
return false;
}
else
{
$ex = explode("|", $result);
$captcha_id = $ex[1];
if ($is_verbose) echo "ID $captcha_id \n";
$waittime = 0;
if ($is_verbose) echo "<br>sleep $rtimeout \n";
sleep($rtimeout);
while(true)
{
$result = file_get_contents('http://ac-service.info/res.php?key='.$apikey.'&action=get&id='.$captcha_id);
if (strpos($result, 'ERROR')!==false)
{
if ($is_verbose) echo "server returned error: $result\n";
return false;
}
if ($result=="CAPCHA_NOT_READY")
{
if ($is_verbose) echo "<br>captcha is not ready yet\n";
$waittime += $rtimeout;
if ($waittime>$mtimeout)
{
if ($is_verbose) echo "<br>timelimit ($mtimeout) hit\n";
break;
}
if ($is_verbose) echo "<br>waiting for $rtimeout seconds\n";
sleep($rtimeout);
}
else
{
$ex = explode('|', $result);
if (trim($ex[0])=='OK') return trim($ex[1]);
echo '<br>'.$ex[1];
}
}
return false;
}
}
#######################################
$captcha=recognize($_SERVER['DOCUMENT_ROOT'].'cap.jpg','e49c7453ae....ca85ec7661',true);
$nocache = rand(1,9999999);
echo '<br>
<img src="cap.jpg?'.$nocache.'"><br>
<form method="post" enctype="application/x-www-form-urlencoded" action="go.php">
<input type="text" name="txt" value="'.$captcha.'">
<input type="hidden" name="session" value="'.$session.'">
<input type="hidden" name="captcha" value="'.$captcha.'">
<input type="submit">
</form>';
exit;
?>
Файл go.php
PHP код:
<?php
$operator = '38050';
$mobile = '1234567';
$ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4';
$captcha = $_POST['captcha'];
$session = $_POST['session'];
$txt = $_POST['txt'];
###
$ch = curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php');
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_REFERER, "http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat");
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session.';');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
$res = curl_exec($ch);
curl_close($ch);
?>
Коменты к файлу mts.php:
PHP код:
$ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4';
$ch = curl_init('http://www.mts.com.ua/ukr/sendsms.php');
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_REFERER, 'http://www.mts.com.ua/ukr/sendsms.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
Данную часть кода думаю не стоит коментировать, обыкновенный cURL посредством которого мы заходим на страничку http://www.mts.com.ua/ukr/sendsms.php
PHP код:
### Func ###
function get_session($var)
{
preg_match('#PHPSESSID=(.*);#',$var,$matches);
$session = $matches[1];
return $session;
}
############
$session = get_session($res);
Функция получения PHPSESSID при помощи регулярного выражения: '#PHPSESSID=(.*);#' Данная сессия будет использована в процессе всего скрипта, важная чать(!).
Далее как вы видите в свойстве капчи :
http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=b0fe7e38a0436635ec616b83cd93 cdbe&rnd=1998968323
мы имеем еще помимо PHPSESSID переменную rnd=1998968323, видимо какойто рандомчик, неважно, сейчас мы его отпарсим на всякий случай:
PHP код:
if(preg_match('#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#',$res,$matches))
{
$rnd = $matches[2];
$ch = curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd");
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session);
curl_setopt($ch, CURLOPT_REFERER, 'http://www.mts.com.ua/ukr/sendsms.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
file_put_contents('cap.jpg',$res);
}
Как видите парсим при помощи регулярного выражения:
#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#
И важно парсить страничку уже с нашей сессией которую мы получили при помощи функции get_session($var) :
PHP код:
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session);
Теперь составляем URL к капче уже с внесенной сессией в ссылку и отпарсеной переменной rnd:
PHP код:
$ch = curl_init("http://www.mts.com.ua/back/modules/golden/captcha.php?PHPSESSID=$session&rnd=$rnd");
Результат (т.е. капчу) сохраняем в отдельный файл:
PHP код:
$res = curl_exec($ch);
curl_close($ch);
file_put_contents('cap.jpg',$res);
Теперь может открыть папку и увидеть саму капчу в файле cap.jpg
Дальше идет функция от самого сервиса Антикапчи по получению текста с картинки, тут без коментариев:
PHP код:
function recognize($filename, $apikey, $is_verbose = true, $rtimeout = 3, $mtimeout = 200, $is_phrase = 0, $is_regsense = 0, $is_numeric = 0, $min_len = 0, $max_len = 0)
{
if (!file_exists($filename))
{
if ($is_verbose) echo "file $filename not found\n";
return false;
}
$postdata = array(
'method' => 'post',
'key' => $apikey,
'file' => '@'.$filename, //полный путь к файлу
'phrase' => $is_phrase,
'regsense' => $is_regsense,
'numeric' => $is_numeric,
'min_len' => $min_len,
'max_len' => $max_len,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://ac-service.info/in.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
$result = curl_exec($ch);
if (curl_errno($ch))
{
if ($is_verbose) echo "CURL returned error: ".curl_error($ch)."\n";
return false;
}
curl_close($ch);
if (strpos($result, "ERROR")!==false)
{
if ($is_verbose) echo "server returned error: $result\n";
return false;
}
else
{
$ex = explode("|", $result);
$captcha_id = $ex[1];
if ($is_verbose) echo "ID $captcha_id \n";
$waittime = 0;
if ($is_verbose) echo "<br>sleep $rtimeout \n";
sleep($rtimeout);
while(true)
{
$result = file_get_contents('http://ac-service.info/res.php?key='.$apikey.'&action=get&id='.$captcha_id);
if (strpos($result, 'ERROR')!==false)
{
if ($is_verbose) echo "server returned error: $result\n";
return false;
}
if ($result=="CAPCHA_NOT_READY")
{
if ($is_verbose) echo "<br>captcha is not ready yet\n";
$waittime += $rtimeout;
if ($waittime>$mtimeout)
{
if ($is_verbose) echo "<br>timelimit ($mtimeout) hit\n";
break;
}
if ($is_verbose) echo "<br>waiting for $rtimeout seconds\n";
sleep($rtimeout);
}
else
{
$ex = explode('|', $result);
if (trim($ex[0])=='OK') return trim($ex[1]);
echo '<br>'.$ex[1];
}
}
return false;
}
}
Функция на офф сайте: http://ac-service.info/curl.txt
Теперь вызываем саму функцию:
PHP код:
$captcha=recognize($_SERVER['DOCUMENT_ROOT'].'cap.jpg','e49c74........661',true);
У нас она принимает параметры - Полный путь к картинке, ключь пользователя Антикапчи, Коментарии(включить/выключить)
Полное описание параметров принимаемых функцией читайте тут - http://ac-service.info/curl.txt или же ниже =)
/*
$filename - полный путь к файлу
$apikey - ключ для работы
$rtimeout - задержка между опросами статуса капчи
$mtimeout - время ожидания ввода капчи
включить/выключить verbose mode (комментирование происходящего):
$is_verbose - false(выключить), true(включить)
дополнительно (дефолтные параметры править не нужно без необходимости):
$is_phrase - 0 либо 1 - флаг "в капче 2 и более слов"
$is_regsense - 0 либо 1 - флаг "регистр букв в капче имеет значение"
$is_numeric - 0 либо 1 - флаг "капча состоит только из цифр"
$min_len - 0 (без ограничений), любая другая цифра указывает минимальную длину текста капчи
$max_len - 0 (без ограничений), любая другая цифра указывает максимальную длину текста капчи
пример:
$text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки" ,true);
$text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки" ,false); //отключено комментирование
$text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки" ,false,1,0,0,5); //отключено комментирование, капча состоит из двух слов, общая минимальная длина равна 5 символам
*/
Дальше выводим саму капчу:
PHP код:
$nocache = rand(1,9999999);
echo '<br>
<img src="cap.jpg?'.$nocache.'"><br>
Переменная $nocache генерирует случайное число в дипозоне, для того чтоб мы добавили его в путь картинки, ето предотвратит кэширование изображения выводимого в браузер. Теперь при просмотре капчи в браузере ссылка будет примерно такого вида:
_http://localhost/cap.jpg?5957336
Финальная часть етого файла - это вывод формы отправки СМС:
PHP код:
<form method="post" enctype="application/x-www-form-urlencoded" action="go.php">
<input type="text" name="txt" value="'.$captcha.'">
<input type="hidden" name="session" value="'.$session.'">
<input type="hidden" name="captcha" value="'.$captcha.'">
<input type="submit">
</form>';
exit;
?>
В поле ввода сообщения будет введет код капчи, тоесть скрипт будет слать на указаный номер код капчи которую он сам распознает при помощи сервиса Антикапча.
Коменты к файлу go.php:
PHP код:
$operator = '38050';
$mobile = '1234567';
$ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4';
$captcha = $_POST['captcha'];
$session = $_POST['session'];
$txt = $_POST['txt'];
Коментарии излишни, единственное ето две перменные:
$operator - код оператора 38050, 38066, 38095, 38099
$mobile - номер мобильного телефона без кода оператора.
Забыл добавить что данный файл ето обработчик формы предыдущего файла.
Следующая часть кода ето отправка Пост пакета с заполненой формой - оператор, мобильный номер, текст, капча:
PHP код:
$ch = curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php');
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_REFERER, "http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat");
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session.';');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
$res = curl_exec($ch);
curl_close($ch);
Скрипт принимающий заполненую форму:
PHP код:
$ch = curl_init('http://www.mts.com.ua/back/modules/sms/db_sms.php');
Как видите специфический Реферер, с параметрами:
PHP код:
curl_setopt($ch, CURLOPT_REFERER, "http://www.mts.com.ua/ukr/sendsms.php?sms_message=1&sms_network1=$operator&sms_network2=&sms_network3=&sms_phone1=$mobile&sms_phone2=&sms_phone3=&sms_mess=$txt&sms_translit=&sms_lang=lat");
Сессия, полученая с предыдущего файла в HIDDEN поле:
PHP код:
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session.';');
А вот и скрытые поля из формы:
PHP код:
<input type="hidden" name="session" value="'.$session.'">
<input type="hidden" name="captcha" value="'.$captcha.'">
В них как видите передается распознаный текст капчи и сессия.
Далее сам POST пакет:
PHP код:
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha");
Вот и все. Надеюсь кому-то поможет в начинаниях при работе с капчей.
Последний раз редактировалось b3; 15.07.2009 в 15:00..
|
|
|

15.07.2009, 15:06
|
|
[bald man]
Регистрация: 13.07.2009
Сообщений: 623
Провел на форуме: 4490909
Репутация:
1167
|
|
клево расписано , надо будет попробовать)
там разве ограничений по айпи нету?
|
|
|

15.07.2009, 15:16
|
|
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме: 1698585
Репутация:
818
|
|
Помоему нет, я себе штук 15 СМСок точно отправил.
|
|
|

15.07.2009, 15:20
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме: 6075534
Репутация:
2731
|
|
Вообще то есть класс для работы с антикапчей.
http://pastebin.com/m77e9cf7
|
|
|

15.07.2009, 15:25
|
|
Members of Antichat - Level 5
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
регулярку
Код:
'#captcha\.php\?PHPSESSID=(.*)&rnd=(.*)" alt="Код"#'
можна немного оптимизировать
Код:
'#PHPSESSID=([a-f0-9]+)&rnd=(\d+)#'
з.ы.:
АК на перле от Каими: http://kaimi.ru/2009/05/anticaptcha-perl/
|
|
|

15.07.2009, 15:53
|
|
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме: 1698585
Репутация:
818
|
|
Можно было много чего оптимизировать, но т.к. с расчетом на новичка нестал заморачиваться, а так можно было все сделать на функциях, классе.
|
|
|

17.07.2009, 14:44
|
|
Участник форума
Регистрация: 08.02.2009
Сообщений: 196
Провел на форуме: 1420275
Репутация:
127
|
|
Писал спаммер\флудер давно, тоже через mts.com.ua ток на перле 
З.Ы. Там ограничений вроде нет, пару сотен смс отправил с одного ИП, вроде норм все
Последний раз редактировалось Gaus; 17.07.2009 в 14:46..
|
|
|

17.07.2009, 17:18
|
|
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме: 1747641
Репутация:
175
|
|
Спасибо, мне будет очень полезно прочитать.
|
|
|

18.07.2009, 17:57
|
|
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме: 1747641
Репутация:
175
|
|
Сообщение от b3
А вот и скрытые поля из формы:
PHP код:
<input type="hidden" name="session" value="'.$session.'">
<input type="hidden" name="captcha" value="'.$captcha.'">
В них как видите передается распознаный текст капчи и сессия.
Далее сам POST пакет:
PHP код:
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "script=%2Fukr%2Fsendsms.php&sms_tag_id=3&network1=$operator&phone1=$mobile&message=$txt&lang=lat&captcha=$captcha");
Ты забыл дописать параметр session в POST запросе. Или нет?
|
|
|

18.07.2009, 19:23
|
|
Постоянный
Регистрация: 05.12.2004
Сообщений: 647
Провел на форуме: 1698585
Репутация:
818
|
|
Нет =) Он передается в куках, смотри полностью листинг файла go.php
PHP код:
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID='.$session.';');
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|