Ne v kontakte Asocial programmer's blog

RegSubmitter-у один год!

Один год и два дня назад я опубликовал пост о начале набора бета-тестеров для RegSubmitter’a. Страшно подумать, как быстро время летит. С тех пор он обзавелся множеством новых возможностей, получил два новых набора модулей в дополнение к исходному и сменил версию с 0.9 до 1.3.6 и сейчас готовится в релизу 1.4.

Что можно вспомнить об этом годе? Были и ожидания, и разочарования, и проблемы, и порывы бросить все к черту. Но был и позитив, и добрые пожелания, и успехи. Помню, какое счастье я испытал, когда после нескольких недель борьбы я таки заставил работать модуль для links.i.ua. Море спиртного никогда не даст такого офигенного эффекта :) Именно этому событию, кстати, был посвящен мой первый твит. В общем, всякое бывало, но хорошего, пожалуй, больше. Как качественно, так и количественно.

И чтобы хорошего было еще больше, я решил, что в течение ближайшей недели цена на все наборы для RS будет ровно $5. Так что пользуйтесь моментом :)

PS. А у вас есть о чем вспомнить за этот год?

Пишем простой авторегистратор. Часть 3 - боремся с капчей.

Содержание

  1. Инструментарий
  2. Основы
  3. Боремся с капчей
  4. Подключаем антикапчу
  5. Подтверждение по email
  6. Пишем модуль для RegSubmitter

В предыдущей статье мы рассмотрели самый простой пример авторегистратора, которому надо всего лишь отправить форму. Но таких сервисов очень мало, поэтому гораздо чаще приходится во время регистрации видеть перед собой капчу. Сегодня “ляжет под нож” сервис Мое Место.

Шаг 1. Анализ защиты.

В первую очередь, следует убедиться, что капча вообще есть :) То, что есть картинка, еще не значит, что есть капча. Как это ни удивительно, но бывают сайты, на которых капча создает сложности только для людей, но не для роботов. Кстати, завтра будет ровно год статье, в которой я писал как раз про такие случаи. Советую прочесть ее, прежде чем читать дальше.

Если вы убедились, что капча действительно не обходится простыми методами, то придется смириться и перейти к изучению защиты. Я встречал два метода проверки валидности капчи:

  1. Капча привязывалась к сессии и сессионный идентификатор передавался через cookies
  2. Сессионный ключ передается в скрытом поле формы.
  3. Комбинация первых двух

В общем случае, самый простой подход - предполагать, что первый тип защиты всегда есть, а второй легко определить по наличию скрытых полей с непонятными хеш-подобными значениями, которые меняются при перезагрузке страницы.

screen29.jpg screen30.jpg

В особо тяжелых случаях таких полей бывает несколько, поэтому надо отследить их все.

Шаг 2. Пишем код.

Для того, чтобы извлекать сессионные ключи из формы, мы будем пользоваться регулярными выражениями. Очень хорошо про них написано здесь. Нет, можно, конечно, обойтись и обычными строковыми функциями, но это будет выглядеть коряво и работать ненадежно.

Капчу мы будем вводить ручками, но это только до следующей статьи :)

При написании кода надо обратить внимание на две вещи:

  • HTML-код скрытого поля с сессионным ключом. Основываясь на нем надо будет составлять регулярное выражение.
  • Адрес картинки. При использовании сессионного ключа часто добавляют его к адресу картинки. На это тоже следует обратить внимание.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?php
header('Content-Type: text/html; charset=UTF-8');
function register1()
{
    // Особая, curl-ная магия
    $ch = curl_init(); // Инициализируем сессию
    curl_setopt($ch, CURLOPT_URL,"http://moemesto.ru/register/"); // задаем адрес формы
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Результат нам нужно вернуть в переменную, а не на экран
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Переходить по редиректам
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // Указываем файл для хранения кукисов

    // Выполняем запрос
    $result = curl_exec($ch);

    // При помощи простейшего регулярного выражения добываем сессионный ключ
    preg_match('#<input type=hidden name="captchaid" value="([a-f0-9]+)">#i', $result, $key);

    curl_setopt($ch, CURLOPT_URL,"http://moemesto.ru/captcha/$key[1]"); // задаем адрес картинки
    $result = curl_exec($ch); // Скачиваем картинку
    curl_close ($ch); // Закрываем сессию

    file_put_contents('captcha.jpg', $result); // Сохраняем

    return $key[1]; // Возвращаем добытый ключ
}

// Функция, производящая регистрацию
function register2($login, $email, $password, $captcha, $key)
{
    // Все POST-параметры, которые надо отправить
    $post = array(
        'captchaid' => $key, // Передаем сессионный ключ
        'login'     => $login // Логин
        'email'     => $email, // Емейл
        'password'  => $password, // Пароль
        'captcha'   => $captcha, // А это наш код с картинки
        'do_reg'    => 'Зарегистрироваться', // "Нажимаем" кнопку отправить ;-)
    );

    // Особая, curl-ная магия
    $ch = curl_init(); // Инициализируем сессию
    curl_setopt($ch, CURLOPT_URL,"http://moemesto.ru/register/"); // задаем адрес обработчика формы
    curl_setopt($ch, CURLOPT_POST, 1); // Указываем, что нам нужно отправить POST-запрос
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // Передаем POST-параметры
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Результат нам нужно вернуть в переменную, а не на экран
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Переходить по редиректам
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // Указываем файл для хранения кукисов. При чем он должен быть тот же, что и в прошлый раз, чтобы кукисы подхватились.

    // Запускаем запрос!
    $result = curl_exec($ch);
    curl_close ($ch); // Закрываем сессию

    // Проверяем на успешность регистрации
    if(strstr($result, 'Поздравляем! Вы успешно зарегистрировались!'))
    {
        return true;
    }
    else
    {
        return false;
    }
}

// Параметры регистрации. Их можно задавать руками, или считывать из файла - на ваше усмотрение.
$login = 'antifrager223';
$email = 'antifrag223@yopmail.com';
$password = 'qwerty';

// Выводим, что мы будем регать
echo "Логин: $login, пароль: $password, email: $email<br/>";

// Если мы уже ввели капчу, то заканчиваем регистрацию
if(!empty($_GET['captcha']))
{
    // Регаем
    if(register2($login, $email, $password, $_GET['captcha'], $_GET['key']))
    {
        echo 'Успешно зарегистрирован';
    else
    {
        echo '<b>Ошибка регистрации</b>';
    }
    echo '<br><a href="'.basename(__FILE__).'">Еще раз</a>';
}
else
{
    // Если капчу еще не ввели - отображаем ее и просим ввести :)
    $key = register1();
    $form = '<h2>Введите код с картинки</h2>
   <img src="captcha.jpg">
   <form>
   <input type="hidden" name="key" value="'.$key.'">
   <input type="text" name="captcha">
   <input type="submit" name="Go!"></form>';
    echo $form;
}
// Все!  ;-)
?>

Вот и все дела. Как и в прошлый раз, в коде есть пара синтаксических ошибок “от дурака”, а в остальном он полностью рабочий, он же есть и во вложении. И, как в прошлый раз, файл должен быть в кодировке UTF-8. Скачать целиком: moemesto.php_.txt

Через неделю…

…нам надоест уже надоело вбивать капчу руками и мы воспользуемся антикапчей.

Пишем простой авторегистратор. Часть 2 - основы.

Содержание

  1. Инструментарий
  2. Основы
  3. Боремся с капчей
  4. Подключаем антикапчу
  5. Подтверждение по email
  6. Пишем модуль для RegSubmitter

Сначала рекомендую прочитать часть 1 - инструментарий.

В этой части я расскажу основные методы анализа форм регистрации и приведу пример написания простого регистратора для сервиса без капчи. Подопытным будет сервис закладок toodoo.ru :)

Анализ формы. Способ первый.

В прошлый раз я говорил, что нам понадобится Firefox и расширение Web Developer. Говорил я это не от скуки, а потому что это действительно облегчит жизнь. Этот способ анализа самый простой и наглядный, и его обычно более, чем достаточно.

Теперь действует просто: заходим на страницу регистрации, в панели Web Developer выбираем Формы → Информация о формах. В открывшейся вкладке мы получим детальное описание всех имеющихся форм на странице.

screen26.jpg

Определить нужную довольно легко по адресу скрипта-обработчика (поле “Действие” в таблице), по id или по именам полей.

Из этой таблицы нам понадобится список полей формы и их значения по умолчанию. Так же стоит сразу запомнить поля логина, емейла и пароля, они нам понадобятся при написании регистратора :)

Кроме того, если и более визуальный способ - Формы → Показать параметры форм:

screen27.jpg

Анализ формы. Способ второй.

На этот раз мы прибегнем к помощи еще более мощного инструмента - FireBug. Это инструмент воистину убийственной мощи и нужен он в основном для отлова всяких JavaScript’овых защит, добавляющих дополнительные поля, меняющих значения или посылающих дополнительные запросы. Из личного опыта скажу, что такое встречается очень не часто. По-настоящему необходим он был всего один раз, зато оправдал себя на все 100%.

Действуем так:

  1. Заходим на страницу регистрации, заполняем форму так, чтобы было понятно, что и куда вы ввели (то есть, писать одинаковый текст типа qwe" не стоит - запутаетесь, какое поле за что отвечает)
  2. Активируем панель FireBug, выбираем вкладку “Сеть” (Net) активируем ее.
  3. Отправляем форму.
  4. Смотрим на панель FireBug. Первый из перечисленный запросов - наш. Наведение курсора на его заголовок покажет полный адрес с GET-параметрами. Чтобы посмотреть POST-параметры, надо развернуть запрос и открыть вкладку “Post”.

screen28.jpg

Анализ формы. Способ третий, для настоящих мужчин.

Вид → Исходный код страницы. И вкуриваем до просветления :) На самом деле, способ тоже ничего так себе, но два предыдущих удобнее. Зато это можно делать хоть в IE.

Пишем регистратор.

Ниже я привожу подробно откомментированный код авторегистратора для toodoo.ru. В нем умышленно допущена пара простых синтаксических ошибок, чтобы кто попало не злоупотреблял им ;) Для того, чтобы их исправить, достаточно базовых знаний PHP.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
// Функция, производящая регистрацию
function register($login, $email, $password)
{
  // Все POST-параметры, которые надо отправить
  $post = array(
    'agree' => 1, // Да, мы согласны с правилами ;-)
    'profile_is_female' => 0, // Укажем пол
    'profile_nick_name' => $login, // Наш логин
    'user_email' => $email, // email
    'user_password' => $password // пароль
    'user_password_repeat' => $password,// повторим пароль
  );

  // Особая, curl-ная магия
  $ch = curl_init(); // Инициализируем сессию
  curl_setopt($ch, CURLOPT_URL,"http://toodoo.ru/account/signup"); // задаем адрес обработчика формы
  curl_setopt($ch, CURLOPT_POST, 1); // Указываем, что нам нужно отправить POST-запрос
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // Передаем POST-параметры
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Результат нам нужно вернуть в переменную, а не на экран
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Переходить по редиректам
  // Генерируем временный файл для cookies, чтобы они не терялись между запросами-редиректами
  $temp = tempnam('.', '__');
  curl_setopt($ch, CURLOPT_COOKIEJAR, $temp);
  unlink($temp);

  // Запускаем запрос!
  $result = curl_exec($ch);

  curl_close ($ch); // Закрываем сессию

  // Проверяем на успешность регистрации
  if(strstr($result, 'Поздравляем, ты успешно зарегистрировался в toodoo!'))
  {
    return true;
  }
  else
  {
    return false;
  }
}

// Параметры регистрации. Их можно задавать руками, или считывать из файла - на ваше усмотрение.
$login = 'Dummy';
$email = 'dummy@yopmail.com';
$password = 'qwerty';

// Выводим, что мы будем регать
echo "Логин: $login, пароль: $password, email: $email<br/>";

// Регаем
if(register($login, $email, $password))
{
  echo 'Успешно зарегистрирован';
}
else
{
  echo '<b>Ошибка регистрации</b>';

// Все!  ;-)
?>

Весь код одним скриптом: toodoo.php_.txt

Кроме того, есть один тонкий момент: файл должен быть сохранен в той же кодировке, что и подопытный сайт, поскольку мы проверяем успешность регистрации, ища кириллическую подстроку. Если сохранить в неправильной кодировке, то она никогда не найдется и все время будет выводиться ошибка. В случае с toodoo.ru - это UTF-8.

В следующей статье…

будем учитьсяучимся бороться с капчей.

PS. Sonata Arctica - World In My Eyes (Depeche Mode cover)

Пишем простой авторегистратор. Часть 1 - инструментарий.

Содержание

  1. Инструментарий
  2. Основы
  3. Боремся с капчей
  4. Подключаем антикапчу
  5. Подтверждение по email
  6. Пишем модуль для RegSubmitter

Прошло чуть меньше года с момента, когда я начал работать над RegSubmitter. За этот год было сделано очень многое, еще больше можно было бы сделать, но пока не хватило времени. Но самое главное, было получено огромное количество опыта, как в программировании, так и во впаривании результатов программирования :) В этой серии статей я хочу поделиться частью накопленного опыта и рассказать, как можно самому написать простой авторегистратор.

Введение в предмет.

Авторегистраторы нужны в тех случаях, когда требуется регулярно и в больших количествах получать аккаунты на том или ином сервисе и при этом объемы/лень не позволяют регистрировать их вручную. Например, белым/серым сеошникам нужны аккаунты в сервисах соцзакладок (для чего и предназначен RegSubmitter), дорвейщикам нужны акки на фрихостах, им всем нужны почтовые ящики для этих аккаунтов и т.д.

В свою очередь, администраторы различных сервисов, вызывающих подобный интерес, не рады такой эксплуатации их детищ, поскольку зачастую пользы им от этого никакой, и всячески ставят палки в колеса при помощи капч, подтверждений на почту и т. д. В этом цикле я по очереди коснусь наиболее частых защит и методов их преодоления.

Инструментарий.

PHP5 - в принципе, нет никакой разницы, на чем писать. Можно, к примеру, с точностью до синтаксических конструкций повторить этот учебник на python или C++. PHP5 выбран потому, что этот язык мне ближе всего и скрипты на нем можно много где запустить ;)

Расширение curl для PHP5 - самый удобный и гибкий способ работы с HTTP. В частности, отправки POST-запросов. В принципе, можно писать и на чистых сокетах, но это муторно, и те, кто в состоянии это сделать, в данном руководстве не нуждаются :)

Firefox с расширениями Firebug и Web Developer - в принципе, это не обязательно, но сильно упрощает анализ формы регистрации и поиск засад от вебмастеров сервисов.

Мозг, руки и текстовый редактор - последний совершенно необходим для комфортного написания кода (поверьте моему опыту ;) ) и без первых двух вы сможете повторить этот учебник, но вряд ли сможете написать что-нибудь свое.

UPD.

Продолжение: Пишем простой авторегистратор. Часть 2 - основы.

PS. А если вы по-прежнему не понимаете, зачем разноцветным сеошникам нужны авторегистраторы, то советую почитать FAQ по SEO от Бездомного Бродяги. Способствует просветлению мозгов, проверено на мне :)

blacksn0w: считанные секунды до анлока iPhone 3G с модемом 5.11.07

До релиза долгожданного анлока осталось чуть больше часа. Этого момента ждали многие владельцы “серых” йафонов. Ходили слухи, что анлока вообще не будет. Но Geohot все-таки сделал свое дело, за что ему всеобщее уважение и почет.

Чуть раньше, сегодня утром анлок уже стал доступен тем, кто использовал blackra1n для джеилбрейка, а теперь он станет доступен и все остальным. Еще чуть-чуть и все страждущие смогут скачать таблетку от жадности unlock для своего телефона :)

PS. А то, каким вообще боком я к этому отношусь, я расскажу чуть позже. Сейчас слишком многое надо успеть.

Копейка рубль бережет.

Летом, во время эпичного прикрытия хостера 3fn.ru я буквально на коленке сваял скрипт для скачивания кеша гугля для определенного сайта и выставил на продажу по символической цене в $2. В первую очередь он предназначался тем, кто остался без бекапа и хочет спасти хоть что-то из своего сайта. На тетрапак кефира он мне принес денежку буквально сразу и затея была сочтена в целом удавшейся, хоть и не принесшей золотых гор. И была отложена на полку.

Однако в последние пару недель почти каждый день продается по одной-две копии скрипта (при полном отсутствии пиара с моей стороны). Всего с момента публикации скрипт был куплен 32 раза. 32*$2 = $64. Неплохая отдача за пару часов работы летним вечерком? На мой взгляд, вполне. Вот, кстати, пассивный доход в чистом виде: за последние два месяца я только пару раз исправил найденные ошибки в скрипте, что заняло от силы минут двадцать на оба раза вместе.

Тот же Regsubmitter, в который было вложено гораздо больше сил, пока имеет меньшую отдачу, хотя и составляет неплохую прибавку к кошельку.

Какова мораль всего этого? Пишите маленькие утилитки, продавайте за копейку и пейте на вырученные деньги кефир. Это совсем несложно, но очень приятно.

PS. Кефир - хорошая штука, кроме шуток.

Халява, сэр! ZoneAlarm Firewall.

Ахтунг, вендузятнеги, халявщики и соучвствующие.

Только сегодня, 24 часа раздаются халявные ключи на фаервол ZoneAlarm, весьма популярный за бугром. Один ключ можно юзать на трех машинах, арифметика простая ;-)

Я уже затарился ключиком, чего и вам советую. Карман не тянет.

В ожидании релиза: KDE или GNOME?

В ближайшем будущем ожидается целых два интересующих меня релиза: openSUSE 11.2 и Ubuntu 9.10. Первый дистрибудетив я уже не первый год использую как основную систему на настольном компьютере, а второй - на нетбуке.

Честно говоря, я возлагаю большие надежды на эти апдейты и на то есть причины.

В случае с openSUSE, предыдущий релиз 11.1 был откровенно сырым и напичканым нестабильным софтом. KDE 4.1, включенный в него изнаально вообще ни на то не годился по потреблению памяти (моим отношениям с KDE4 вообще можно посвятить целую книгу), KDE 3.5 всем поддерживать уже не охота и поэтому он начал ощутимо подглючивать и вдобавок половина софта, связанная с KDE, резко перелезла на QT4, что удобства и стабильности ему не добавило.

В новой версии Ubuntu обещано было существенное ускорение работы, что меня, как пользователя нетбука, крайне волнует.

Но речь не об этом. Как я сказал, KDE4 еще пока не вполне стабилен и меня не устраивает. Поддержку KDE3 в сусе уже успели слегка поломать в 11.1, а в 11.2 его кажется и вовсе не будет, из той же убунты его вообще давно выпилили нафиг. А меня, старого любителя кедов и стабильности, такой расклад не радует. Между тем, на нетбуке я уже три месяца пользуюсь гномом и он вполне отвечает моим минималистическим вкусам, в то же время обеспечивая достойный внешний вид. Но с другой стороны, там нету некоторых очень нужных мне вещей, в частности Krusader’a, который умеет и ftp, и fish, и smb, и вкладки, и вообще много гитик. MC хорош всем, кроме того, что в нем нельзя одновременно редактировать больше одного файла и нельзя создавать много вкладок.

Вот я и думаю: то ли с новым релизом попробовать пересесть на гном, то ли попытать снова счастья с KDE4, то ли пытаться поставить KDE3 и терпеть глюки, которые никто и никогда не исправит?..

Заметки на манжетах.

Времени мало, поэтому вместо полудюжины постов, которые по-хорошему надо написать, будут только отрывки.

АГС-17: а нам все равно.

Последнюю неделю только и шуму про “новый” фильтр Яндекса: СДЛы покосил, половину сателлитов - выкинул к черту, хрен снимешь, неадекватный фильтр и т.п.

А вот меня он почти не задел. Из индекса почти вылетел только один сат по группе Pain, сделанный больше для души, а мои фирменные сателлиты (те самые, про которые я уже не раз упоминал) все в индексе без потерь, тьфу-тьфу. Поэтому сегодня за часик слепил еще один и оставил индексироваться :)

Сапа.

Последний месяц не делал ровным счетом ничего, но доход вырос с 10 до 20 р/сут. Немного, но все равно неплохо. Единственное разумное объяснение, которое могу придумать - это то, что пресловутый АГС-17 выкосил шлак и большая доля ссылок пришлась на прочие сайты.

Фриланс.

На этой неделе передал одного хорошего, но несколько хлопотного заказчика другому коллеге-фрилансеру. Расстались, что называется друзьями. Удачи им, а я смогу больше времени посвятить своим проектам.

Блог.

Жив, не заброшен :) Просто учеба и работа оставляют совсем немного времени на него.

Позитив!

У нас в универе стоит вот такая трибунка МТСа:

Photo-0001.jpg

Передовые технологии связи, нечего сказать.

PS. Посоветуйте, кстати, какой-нибудь нормальный тариф у МТСа без абонентки. Желательно посекундный. Ибо Джинс-007 уже совсем невыгодный.

PPS. Песню к посту добавлять не буду, вместо него сегодня картинка выше ;)

Ссылочный позитив!

И так, я продолжаю нести позитив себе любимому через позитив кому попало.

И под конец особенно позитивная ссылка на Информационно развлекательный портал 0t4. Вы спросите, что же в ней позитивного? Отвечу: она досталась почти победителю почти конкурса, что безусловно означает заметный вклад в средний позитив по больнице.

Несмотря на выход из Nightwish, она продолжает радовать хорошими песнями.