Fuf.com.ua
SEO, бизнес, программирование, личное развитие.
10
Сен
Автоматическая регистрация на чужом сайте при помощи PHP.
Posted by rebbort under Программирование
Как-то раз один мой знакомый попросил написать для него спамилку форумов и досок объявлений. Составили ТЗ, оговорили цену, сошлись на том, что спамилка должна уметь самостоятельно регистрироваться на форумах, при необходимости парсить CAPTCHA, заходить на почтовый ящик и переходить по ссылке активации аккаунта. После формирования аккаунта программа должна была уметь рассылать сообщения в разные ветки форума.
Я и сам давно уже хотел было писать подобную программу, но не было стимула и вот он появился, да еще и в денежном эквиваленте. Но как только я начал писать программу возникло куча проблем: не понятно было, как отсылать на PHP данные POST методом, как парсить CAPTCHA и вытаскивать оттуда разные буковки и циферки, как заходить на почтовый ящик и т. д.
Первая проблема решилась использованием сокетов. Вторая решалась долго – распарсить картинку на PHP дело не из легких. Немножко понапрягав серое вещество, было решено использовать нейронные сети. Но PHP очень медленный язык, чтоб писать подобные программы, поэтому из нейронных сетей была выдрана основная идея, а весь метод заключался в следующем:
- скачиваем картинку,
- устанавливаем для картинки порог, например, черные буквы на сером фоне, дальше все, что темнее порога – это буквы, все остальное – мусор,
- обрезаем все лишнее пространство, оставляем только буквы,
- заносим картинку в двумерный массив: если пиксель белый – 0, если не белый – 1,
- выделяем буквы, находим в массиве по Y ряд, где все элементы равны 0, все, что левее какая-то буква,
- создаем массив-эталон, заносим в него все цифры и буквы алфавита в двоичном представлении; шрифт букв должен совпадать с тем, что и на CAPTCHA, например:
,
на картинке зашифровано слово ПРИВЕТ.
- распознаем буквы.
Последний пункт нужно расписать подробней. Выбираем из массива первый символ и по очереди сравниваем его с символами из массива-эталона при помощи XOR (1×1=0, 1×0=1, 0×1=1, 0×0=0). После получения нового массива, складываем все его элементы и все элементы используемого символа из массива-эталона. Делим первое число на второе. Если получилось больше 1, то символ-эталон явно ошибочный, если меньше 0.4, то символ определен, иначе запоминаем число и символ из эталона. После того, как в массиве-эталоне не останется больше символов, выбираем наиболее меньшее число и символ из эталона, которому оно соответствует. В итоге получаем строку символов из CAPTCHA.
Весь процесс распознавания занимал около 2 секунд на AMD Duron 700Мгц и 192 Мб ОП. Не так уж и много, если учесть, что картинку нужно отпарсить только раз, а посты слать уже можно будет сколько угодно. Кстати, забыл упомянуть, что данный метод работает исключительно для CAPTCHA типа

Хотя можно распознавать и другие CAPTCHA, главное, чтобы буквы не располагались под наклоном, не наезжали друг на друга и не были искажены.
Но на этом прекрасном моменте все и обломилось. Картинку распарсить я распарсил, а вот данные отослать на сервер я так и не смог. После отсылки данных генерировалась новая сессия и соответственно генерировалась новая CAPTCHA. Долго шарясь по Google, я так ничего внятного для себя не нашел, позвонил заказчику, и мы порешили на этом закончить. Тогда я так и не понял, как можно отсылать и данные и Cookie вместе на сервер, так чтобы он не генерировал новую сессию. А ведь на самом деле все очень и очень просто.
<?php
//Получение Хоста
function GetHost($address){
$host = (substr($address, 0, 7) == "http://") ? substr($address, 7) : $address;
$host = (strpos($host, "/")) ? substr($host, 0, strpos($host, "/")) : $host;
return $host;
}
//Отсылка данных POST-методом при помощи сокета
//@cookie – массив вида array(0=>’SID=sad34d56f5sdfserf6f5s4d5f45sd46f’,1=>’uid=3431’,…)
//
function HTTPPost($hostname, $postdata, &$errno, &$errstr, $cookie="", $timeout=20){
$service_port = getservbyname ('www', 'tcp');
$host = GetHost($hostname);
$address = gethostbyname ($hostname);
$out = "";
$fp = @fsockopen ($host, $service_port, $errno, $errstr, $timeout);
if($fp){
$request = "POST $hostname HTTP/1.0\\r\\n";
$request .= "Host: $host\\r\\n";
$request .= "Referer: $hostname\\r\\n";
if($cookie != "")
if(count($cookie)>0)
foreach($cookie as $v)
$request .= "Cookie: $v\\r\\n";
$request .= "Content-Type: application/x-www-form-urlencoded\\r\\n";
$pdlen = strlen($postdata);
$request .= "Content-Length: $pdlen\\r\\n\\r\\n";
$request .= $postdata;
fputs ($fp, $request);
$out = "";
while(!feof($fp)) $out .= fgets($fp,128); fclose ($fp);
}
return $out;
}
//Парсинг заголовка ответа сервера, извлечение куков
function DecodeHeader($str){
$part = preg_split ( "/\\r?\\n/", $str, -1, PREG_SPLIT_NO_EMPTY );
$out = array ();
for ($h=0;$h<sizeof($part);$h++){
if ($h!=0){
$pos = strpos ( $part[$h], ‘:’ );
$k = strtolower ( str_replace ( ‘ ‘, ”, substr ( $part[$h], 0, $pos ) ) );
$v = trim ( substr ( $part[$h], ( $pos + 1 ) ) );
}else{
$k = ’status’;
$v = explode ( ‘ ‘, $part[$h] );
$v = $v[1];
}
if( $k == ’set-cookie’ ){
$out['cookies'][] = substr($v,0,strpos($v,’;'));
}else if($k==’content-type’ ){
if (($cs=strpos($v,’;'))!==false){
$out[$k] = substr ( $v, 0, $cs );
}else{
$out[$k] = $v;
}
}
}
return $out;
}
?>
Теперь, как пользоваться.
<?php
$login="pupkin";
$password="qwerty";
$url = "http://www.example.com.ua/login.php";
//Формируем данные для формы авторизации
$postdata="login=$login&password=$password";
//Авторизируемся на сайте
$out = HTTPPost($url, $postdata, $errno, $errstr);
//Получаем cookies
$out = DecodeHeader($out);
$url = "http://www.example.com.ua/addlink.php";
//Формируем данные для формы добавления ссылки на сайт
$postdata="url=http://mysite.com/&title=Мой сайт&description=Мой сайт круче всех";
//Добаляем на данный сайт какую-то информацию.
$out = HTTPPost($url, $postdata, $errno, $errstr, $out['cookies']);
?>
В этом примере, все ссылки взяты из головы. Если решите попробовать, используйте реальные сайты.
На этом все. В следующей статье, наверно, приведу исходник скрипта для распознавания CAPTCHA.
Понравилась статья?
Случайные посты
- Создание тематических ссылок на сайт
- Темы для Wordpress
- Яндекс Sitemap
- Австрийская IT компания H.U.I.
- Пост комментариев в блоги без nofollow при помощи Comment Kahuna
Reader's Comments
Leave a Reply
Подписка на блог
Рубрики
- Cоциальные сети
- Firefox
- SEO
- SEO инcтрументы
- Без рубрики
- Личное развитие
- Новости
- Партнерки
- Программирование
- Продажа ссылок
- Продвижение сайтов
- Темы Wordpress
- Управление проектами
- Юмор
Архивы
Последние записи
- Получение трафика с сайтов знакомств
- Sape.ru аннонсировала генератор Sitemaps для Вебмастеров
- Firefox 3 от Yandex’a
- Законы управления проектами
- Помните ли вы свои первые деньги?!
- В Контакте vs Одноклссники.ру
- Русский трафик. Что с ним делать?
- Спам в социалки через импорт ссылок
- Пост комментариев в блоги без nofollow при помощи Comment Kahuna
- Генератор sitemap для mp3fiesta
Последние загрузки
- Генератор sitemap для партнерского сайта от mp3fiesta (5.3 KiB, 122 hits)
А стоило ли публиковать код? Всё-таки, это неэтично. Хоть сколько знающий программист сам бы, несомненно, написал подобный скрипт. Что делать с социально ненадёжными людьми?
2 Павел ВОронин
А чем, собственно, знающий программист отличается от социально ненадежного человека? Люди бывают разные, пусть все, что они делают, остается на их совести.
Have fun: http://blog.d-fens.org.ua/2007/02/captcha.html
Извечная борьба снаряда и брони?
Если цифры на капче почерканы чем-то, типа как тут: , то можно использовать побитовое сравнение, но искать не точное совпадение, а частичное, смотреть, какой символ больше всего совпал, его и ставить.. А местоположение букв тут можно определить, найдя самый черный прямоугольник заданных размеров (перебирая все по очереди и складывая количество черных пикселей в каждом).
Такие капчи ломаются очень просто, но беда в том, что практически везде, где появляются спамеры и хотят от них избавиться, используются капчи намного сложнее.. Так что толку от такой распознавалки будет немного. Хотя конечно опыт, даже базовый, в реализации ocr пригодится;)
Почему бы просто не использовать автосабмиттер типа XRumer?
Потому что он денег стоит. 450$ на дороге не валяются. Все равно дело было пару лет назад, вряд ли прога была уже написана.
Извращенцы абсолютные … все вещи по распознаванию пишуться на чем-нить быстром типа C++ и лучше без ереси в духе нейронных сетей, тогда с временем проблем будет раз … э в 200-400 как минимум лучше и с наклоном что-нить порешить можно будет
Само собой, Мастер, Cи рулят. Может напишешь чего-нибудь такого?
Такая ситуация всегда обиднее всего, когда самая сложная часть алгоритма реализована и работает, а затык на относительно простой, но в итоге все вместе не работает. Жаль, что не довели начатое доконца.
что касается темы, то мне кажется актуальность будет известна только через некоторое время