Ne v kontakte Asocial programmer's blog

Coffiem lilsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec metus at arcu commodo aliquam a vitae sapien. Donec ipsum massa, pellentesque et pharetra a, commodo non turpis? Quisque ultricies pellentesque augue, at mollis arcu vestibulum ac. Integer hendrerit rhoncus lectus. Aenean mauris dui, faucibus suscipit semper nec, eleifend ac lacus. In blandit eros ut libero dignissim vulputate tempus enim lobortis? Curabitur lorem urna, gravida quis pretium ac; porttitor vitae ante. Donec tincidunt purus non libero scelerisque consectetur. Donec lobortis sapien eget tellus vulputate facilisis ut eget justo? Nunc gravida porttitor quam ac pellentesque. Donec at turpis sit amet ante lobortis mollis eget quis dolor? Pellentesque quis mi sit amet libero suscipit accumsan quis a sem. Sed bibendum risus et sapien pretium in mollis tellus posuere? Nulla mi massa, tristique sodales tincidunt quis, posuere in nulla.

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec porttitor semper iaculis. Vivamus facilisis dignissim venenatis. Aliquam varius auctor vestibulum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam tempor semper felis, eget bibendum magna faucibus eget. Vestibulum malesuada odio ut nunc mattis vel viverra urna mollis. Nam sed lorem et orci convallis sollicitudin id ut nibh. Donec sed est ac lacus ullamcorper vulputate auctor a mi. Pellentesque feugiat, dolor sed tincidunt ultrices, enim felis semper tellus, non ultricies neque felis at mi. Quisque posuere tortor ac nisl molestie et volutpat lectus gravida. Phasellus eu erat in nunc consectetur lacinia eu sed erat. Integer laoreet viverra velit, non placerat dolor pellentesque ac. In eu risus nulla, ut pharetra lorem. Cras nec nisl ut urna cursus viverra nec sit amet felis. Sed id quam quis mi tincidunt lobortis suscipit luctus diam! Nulla ac leo sed felis dapibus porta quis ut ante! Proin sit amet velit nec neque facilisis adipiscing non at metus.

In porttitor, nisi ac pulvinar lacinia, nisl risus rutrum elit, eu dapibus enim lorem ac justo. In ac tortor quis nunc imperdiet sagittis. Integer id risus leo. Mauris ac est enim! Etiam velit justo, vehicula in commodo nec; aliquam quis sem. Donec porttitor, tortor ac luctus ornare, eros quam adipiscing lacus, sit amet cursus dolor elit at metus! Proin sit amet ligula arcu, sed lobortis enim. Suspendisse potenti. Sed ac neque quam, non egestas turpis. Donec vel porttitor nulla. Sed aliquam rutrum iaculis. Nunc quis lacinia justo. Cras felis nibh; tempor ac luctus sed, faucibus eu est. Quisque porttitor tempus felis vel venenatis.

Pellentesque at tellus dui, ut mattis tellus? Donec in auctor nibh! Suspendisse dignissim commodo enim sit amet fermentum. Fusce quis magna non mauris aliquam varius. Curabitur laoreet ligula et lacus hendrerit ut dapibus velit rutrum? Aenean quam metus, tincidunt sed posuere at, posuere ut neque. А внимательным - подарок. Первым трем, кто напишет мне на я подарю Google Cache Dumper. Просто ради позитива. Fusce bibendum sem sit amet ante euismod eleifend placerat elit imperdiet. Proin ornare faucibus varius. Donec non cursus eros. Aenean facilisis, massa vel consequat pharetra, nulla libero hendrerit nibh, id mollis massa diam vitae sem.

Aenean fringilla dui sit amet tellus tincidunt ullamcorper ultricies urna dapibus. Vivamus id lorem augue? Morbi dolor urna, porttitor vel mattis vitae, condimentum eu nisi. Nullam dignissim sollicitudin accumsan. Duis vitae neque sed velit dictum fermentum sit amet non justo. Suspendisse non fermentum risus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed ut arcu turpis. Ut suscipit libero eros. Fusce luctus euismod ante, at ultricies sapien rhoncus ut! Sed a urna sed libero posuere varius sed id orci. Quisque vel bibendum libero. Quisque auctor volutpat libero eu laoreet.

UPD. 25 февраля 2010. Внимательных на данный момент оказалось всего двое :)

UPD. 22 июня 2011. Нашелся третий и последний внимательный желающий :)

Заметки на манжетах #2

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

  • Меня ужасает монструозность Wordpress. Если версии 2.9 в стандартной конфигурации не всегда хватает 32 мб памяти, то подумать только, сколько оно жрет с приличным набором плагинов. И, честно говоря, я абсолютно не понимаю, какие такие фитчи в нем есть, что они требуют столько памяти. Далеко не всякий PHP хостинг позволяет такое безобразие у себя запускать и я с ними согласен. Вы все еще хотите скачать wordpress?

    Если вспомнить историю, то увидим,  что пару лет назад нормой было 8 мб памяти на поток. Потом вышел WP 2.4 (если не вру) и phpBB3. Нормой стало 16 мб. Потом вышел WP 2.8 и народ стал кидаться дерьмом в тех хостеров, у кого был лимит ниже 32 мб. С WP 2.9 придется, видимо, всем поднимать лимит еще до 48. Более того, очевидно, что чем дальше, тем быстрее растет потребление памяти в WP, но значимых фитч не добавляется.

    Ей, разработчики, вы совсем офигели? Ну не пишите же говно, побойтесь бога! Для БЛОГА не нужно 48 мб памяти!

    Боюсь себе представить WP 3.0…

  • Бездомный Бродяга предлагает устроить флешмоб по накрутке фидбернера френдфидом, чтобы дискредитировать последний. Будет весело. Присоединяйтесь!

  • Челябинские Липетские автобусы настолько суровы, что посылают пассажиров на хуй.

  • UPD. Обнаружил, что на антикапче случился апдейт системы и автоматическая выдача инвайтов сломалась. Починил.

Удачной пятницы!

Пишем простой авторегистратор. Часть 6 - пишем для RegSubmitter.

Содержание

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

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

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

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

Сразу скажу, что в этой статье я буду пользоваться версией RegSubmitter 1.4.0, которая пока официально не зарелизена, но уже скоро будет :) Впрочем, все нижеизложенное будет работать и в 1.3.6, за исключением подтверждения по email.

Структура модуля

Прежде всего, отмечу, что в RS есть два типа модулей: простые и “универсальные”. Простые работают только с одним конкретным сервисом, и “универсальные” могут работать со многими сайтами на одинаковых движках. В рамках этой статьи мы каснемся только простых модулей и будем рассматривать все на примере memori.ru.

Модули в RegSubmitter разбиваются по категориям, и располагаются в папке modules/Category_Name/Module_ID/module_ID.php. Здесь module_ID - это буквенно-цифровой идентификатор модуля, который должен быть уникален для каждого модуля (впрочем, это не означает, что он должен быть нечитаем ;) ). Например, модуль, работающий с сервисом Memori.ru находится по адресу /modules/Rus/Memori/Memori.php.

В этом файле должен находиться класс с именем, совпадающим с Module_ID, и при этом унаследованным от класса Module.

Код модуля

Ниже я приведу полный код модуля с комментариями, но перед этим сделаю несколько заметок.

Первая состоит в том, что в начале класса идут параметры, задающие свойства модуля и то, как он будет обрабатываться RegSubmitter-ом. Во-вторых, я не буду отдельно описывать API RegSubmitter’a, но по ходу дела буду пояснять назначение тех или иных функций и их параметров.

  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
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
class Memori extends Module
{
  // Параметры модуля
  var $name = 'Memori'; // Имя сервиса, отображаемое пользователю
  var $id = 'Memori'; // Все тот же Module_ID
  var $url = 'http://memori.ru/'; // URL сервиса. Настоятельно рекомендую указывать правильный :-)
  var $icon = 'memori.png'; // Имя иконки. Должна лежать в одной папке с файлом модуля.
  var $notice = ''; // Дополнительная информация, которую мы желаем сообщить пользователям
  var $email_confirm = true; // Требуется ли подтверждение по email
  var $core_version = 3; // Версия ядра, на которую рассчитан модуль, необходимо для проверки совместимости. Нынешняя, как не трудно догадаться - 3
  var $encoding = 'cp1251'; // Кодировка сайта.

  /**
   * Функция, ответственная за загрузку капчи.
   * Если ввод капчи не требуется, возвращает null. В противном случае возвращает массив данных,
   * которые понадобятся при отправке формы, в т. ч. имя временного файла с кукисами, различные токены и т. п.
   * Обязательно в массиве должен быть элемент image_file, чтобы RegSubmitter мог отобразить капчу пользователю для ввода.
   */
  function GetForm()
  {
    // Запрашиваем страницу регистрации.
    $page = $this->Get('http://memori.ru/registration/');
    // Извлекаем токен
    preg_match('#<input type="hidden" name="token" value="([0-9a-z]+)" />#is', $page, $matches);

    // Ноу-хау: допываем картинку из рекапчи
    $js = $this->Get('http://api.recaptcha.net/challenge?k=6LfV6wgAAAAAAF327mU7j7lzG6s-p1SolxPA2Wx2');
    preg_match("#challenge : '([^']+)'#", $js, $key);
    // Собственно скачиваем картинку
    $image = $this->Get("http://api.recaptcha.net/image?c=$key[1]");

    // Генерируем имена временных файлов для хранения кукисов и картинки. Параметр - префикс имени файла.
    $cookies_file = $this->TempFile('cookie');
    $image_file = $this->TempFile('image');

    $this->SaveCookies($cookies_file); // Сохраняем кукисы
    file_put_contents($image_file, $image); // Сохраняем картинку

    // Возвращаем данные, которые нам понадобятся потом.
    return array(
      'image_file'	=> $image_file, // Картинку капчи. ОБЯЗАТЕЛЬНО!
      'cookies_file'	=> $cookies_file, // Файл с кукисами
      'key'			=> $matches[1], // Токен формы, добытый в начале
      'recaptcha'		=> $key[1], // Токен рекапчи
    );
  }

  /**
   * Эта функция занимается собственно произведением регистрации.
   * Параметры:
   * - $account массив из элеменитов login, password, email. Назначение, думаю, очевидно :)
   * - $data тот самый массив, который мы вернули из функции GetForm()
   * - $captcha текст, написанный по мнению пользователя на капче.
   * Функция возвращает null в случае успеха или массив сообщений об ошибках, если они возникли.
   */
  function SubmitReg($account, $data, $captcha)
  {
    // Собираем запрос
    $post_data = array(
      'login'			=> $account['login'], // Логин
      'email'			=> $account['email'], // Емейл
      'password'		=> $account['password'], // Пароль
      'password_confirm'	=> $account['password'], // И снова пароль
      'recaptcha_response_field'	=> $captcha, // Текст с картинки
      'recaptcha_challenge_field'	=> $data['recaptcha'], // Токен рекапчи
      'token'			=> $data['key'], // Токен формы
      'inviter'		=> '', // Просто пустое поле. Видимо, для какой-то реферральной системы
    );

    // Загружаем сохраненные кукисы с прошлого раза
    $this->LoadCookies($data['cookies_file']);
    // Отправляем запрос. Первый параметр - куда, второй - параметры запроса,
    // третий (опциональный, по умолчанию - false) - надо ли преобразовывать страницу из кодировки сайта в родную для RS (utf-8)
    // Очевидно, что для веб-страниц его надо ставить true, а дял картинок - false. Аналогичный параметр есть и у метода $this->Get()
    $html_data = $this->Post("http://memori.ru/register/", $post_data, true);

    // Проверяем успешность регистрации
    if(strstr($html_data, 'На указанный Вами электронный адрес'))
    {
      return null;
    }
    else
    {
      // Если не прошло, добываем ошибки.
      preg_match_all('#<p class="error">([^<]+)</p>#mu', $html_data, $matches);
      return $matches[1];
    }
  }

  /**
   * Функция подтверждения по почте.
   * Параметр $account содержит те же данные о логине, пароле и email-e, что и в случае с методом SubmitReg.
   * возвращает null в случае успеха или массив с сообщениями об ошибках в ином случае.
   */
  function Confirm($account)
  {
    // Ищем письмо по отправителю. Кроме того, в теле письма должен упоминаться домен из поля $this->url
    $mail = $this->findMail('no-reply@memori.ru');

    // Загружаем тело сообщения
    $text = $this->getMailBody($mail['msg_id']);

    // Извлекаем ссылку подгверждения
    preg_match('#http://memori.ru/regconfirm/[0-9]+/[0-9a-z]+/#i', $text, $url);

    // Отправляем запрос
    $html_data = $this->Get($url[0], true);

    // Проверяем успешность
    if(strstr($html_data, '/logout/'))
    {
      return null;
    }
    else
    {
      // Если что не так - ругаемся.
      return array('Произошла ошибка активации или аккаунт уже был ранее подтвержден');
    }
  }
}
// Alles :-)
?>

Напоследок замечу, что в RS имеется очень удобная для отладки функция dbg($var). Будучи вызванная в любом месте кода она выведет дамп переменной var внизу страницы. Она особенно хороша тем, что работает в том числе и тогда, когда скрипт вызывается через AJAX.

Полный архив модуля Memori: Memori.zip. И, кстати, на этот раз в нем нет никаких ошибок ;)

Короткой строкой.

  • В процессе поиска хостинга для нового своего проекта нашел один недорогой хостинг. Между прочим, они являются спонсорами такого крупного ресурса, как phpbbguru.net, что есть хороший показатель.
  • Сегодня беседовал с хорошим товарищем на тему телефонов и брендов. Он утверждал, что яблочные телефоны - рабство Стива Джобса, хоть с джейлбрейком, хоть без него. И говорил что у нормальных производителей вроде нокии и тупых ограничений нет, и отзывы о nokia хорошие, не то что у яблофона, который с очередным обновлением прошивки грозит превратиться в кирпич. После долгих споров пришли к выводу, что пиво хорошее, но его мало. Вот так :).

Свободная цена на RegSubmitter: итоги

С 26 декабря по 1 января я раздавал новогодние подарки - все желающие имели возможность приобрести одну из версий RegSubmitter по свободной цене. Только что я ответил на последние письма и начинаю подводить итоги.

Для начала немного чисел:

  • Общая выручка: 18,39 (WMZ) + 458,1 (WMR) + 549,50 (руб, ЯД) ≈ 1552.98 (руб) ≈ $51.4231
  • Минимальная сумма: 1 коп.
  • Максимальная сумма: 350 руб.
  • Самая популярная сумма: $1.
  • Переводов ≤$1 было 15 штук — примерно 60%.
  • Популярность версий: RSB - 15 шт, ESB - 8 шт, UMSB - 1 шт.
  • Свой ключ уже активировали 16 пользователей из 24 поучаствовавших в акции.
  • Лишь трое запросили доступ в скрытый раздел форума поддержки.
  • В период акции посещаемость сайта regsubmitter.ru выросла более, чем в 4 раза. При этом, основной вклад был у серча, за ним с небольшим отрывом шел маулнет.

Теперь я поделюсь некоторыми общими соображениями о свободной цене и рунете. Главное соображение таково: в целом рунет еще морально не готов. Однако, возможны варианты, в которых этот подход применим. Необходимым для условием является яркий бренд, под которым продается товар. Пользователи должны любить этот бренд, и тогда они будут платить.

Другими важными на мой взгляд аспектами являются с одной стороны достаточно широкая целевая аудитория и с другой - высокий уровень культуры в ней. То есть, вряд ли получится успешно продавать по свободной цене артефакты для WoW, но вполне можно попробовать продавать классическую музыку (насколько мне известно, первопроходцами свободной цены стали именно музыканты в лице группы Radiohead).

Другое соображение, которое у меня возникло в ходе проведения акции и аналогичными экспериментами Тормоза, это “эффект личного общения”. В случае, если процесс автоматизирован, как это было сделано, например, с μTodo, то у покапателя возникает ощущение анонимности и ему гораздо легче заплатить мало, чем в случае личного общения по email,  как было сделано с Regsubmitter-ом. Хотя находятся личности, на которых это не распространяется ;) Иными словами, если человек платит роботу, он не чувствует себя обязанным платить по совести (ведь у робота нет совести, он не оценит). А вот когда человек платит человеку, то тогда включается совесть и требует заплатить справедливую цену.

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

Итоги-2009 и Планы-2010

10 часов до конца года. Работать лень, да и времени до начала празднования осталось не так уж много, чтобы что-то начинать. Поэтому попытаюсь подвести итоги года.

Год был очень противоречивым. С одной стороны, это был очень тяжелый год, с другой - было сделано немало добрых и полезных дел. Но для начала вернемся в прошлое и взглянем на планы:

  1. Успешно сдать две сессии и быть готовым к третьей. Цель более-менее достигнута. Более-менее - это потому что я таки схлопотал одну тройку и в этом семестре жил без стипендии.
  2. Собрать свою группу и выйти на сцену. Нихрена не достигнута. Нет времени, нет сил, нет людей.
  3. Захватить мировое господство. Опять фейл. Всему виной моя лень и добродушие.
  4. Узнать то, чего не узнал за этот год. О, да. Много узнал. Порою кажется, что даже слишком много. Но в будущем все равно наверное пригодится.
  5. Написать много-много интересных статей в этот блог. Тут уже судить вам. После НГ завершу серию про авторегистраторы, после чего буду придумывать еще чего-нибудь :)
  6. Придумать и реализовать еще больше идей, чем в этом году. По первому пункту план перевыполнен. По второму - не ахти, хотя есть и немало результатов. Большую часть из них я собрал здесь.
  7. ??????!!!!!!
  8. PROFIT Миллионов не заработал. Но это еще впереди :)

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

Что же я успел за год?

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

Летом я в третий раз съездил в ЛШЮП. Снова масса позитива и полуночных сидений за отладкой наколбашенного детьми кода (писали, кстати, не абы что, а распознавалку текста. Вышло не бог весть что, но все ре работоспособное). Опять же, один из самых счастливых периодов жизни в этом году.

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

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

Что будет в Новом году?

На этот раз у меня цели гораздо более конкретные и прагматичные.

  1. Учеба. На мой взгляд, самая важная инвестиция в будущее и поэтому она снова не первом месте.
  2. Выйти на месячный доход не менее 20 000 руб./мес. Примерно такая сумма мне необходима для более-менее свободного маневра и удовлетворения бытовых потребностей.
  3. Написать и запустить два сервиса, которые я вынашиваю в уме уже больше месяца. Один из них будет бесплатный и немонетизируемый - на правах хобби. Второй скорее всего платный, но дешевый и полезный в том числе и мне. Думаю, свою долю в достижение пункта №2 он внесет.
  4. Довести до совершенства движок RegSubmitter и подтянуть на нужный уровень модули. На самом деле, до этого не так уж и далеко, но хлопотно. После этого выпустить набор для реги на фрихостах.
  5. Выпустить еще несколько полезных софтин для вебмастеров-манимейкеров. Зарисовки на эту тему опять же уже имеются, надо лишь довести до ума.
  6. Купить синтезатор. Идея-фикс. Хочу, и все тут. И музыку на нем писать проще, чем на гитаре.

Все это вполне реально при условии некоторого напряжения сил, так что через год я получу возможность посмотреть, насколько я на самом деле распиздяй ;)

С Новым Годом!

И идите уже праздновать, нефиг пялиться в монитор ;)

RegSubmitter по свободной цене и обновления блога.

Зачетная сессия позади, на носу новый год и хочется делать подарки :)

Поэтому я объявляю о новогодней акции RegSubmitter по свободной цене!

Что такое свободная цена? Это когда покупатель платит продавцу ровно столько, сколько ему велит совесть. Это утопия денежных отношений, которая, на мой взгляд, непременно придет к людям, но далеко не при нашей жизни - сейчас люди слишком глупые и жадные, чтобы такая модель жила и была взаимовыгодна. Тем не менее, под Новый Год случаются и не такие чудеса, поэтому я вслед за Тормозом объявляю, что RegSubmitter до 1 января 2010 года будет продаваться по свободной цене!

Как это будет работать? А вот так:

  1. Переведите нужную сумму на кошелек WebMoney Z177534671497, указав в примечании ваш email
  2. Напишите мне на  с того же адреса, который вы указали в примечании к платежу, какую именно версию RegSubmitter вы хотите получить
  3. В течение суток (а скорее всего гораздо быстрее) вы получите ответ, в котором будет указан ваш серийный номер и дальнейшие инструкции

С наступающим Новым Годом ;)

Изменения в блоге

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

Как заставить саппорт говорить.

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

Вчера вечером, однако мне было относительно нечего делать и я решил предпринять еще одну попытку:

(20:54:08) Alek$: Добрый день.

(20:54:14) Alek$: У меня есть к вам предложение.

(20:54:50) support: Добрый день. Слушаю.

(20:55:12) Alek$: Вы мне наконец сообщите как дела с доменами. Такое вот предложение._

…и случилось чудо! Несмотря на инвиз и неурочное время, мне ответ пришел немедля! Это при том, что раньше как вежливые, так и резкие просьбы наглухо игнорировались. Берите на заметку, коллеги :)

Пишем простой авторегистратор. Часть 5 - подтверждение по email.

Содержание

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

Давайте заглянем в наш актив. Сейчас мы уже умеем писать простые регистраторы, умеющие бороться с капчей при помощи антикапчи. От окончательного захвата мирового господства полной автоматизации процесса регистрации нас отделяет единственный барьер - подтверждение по почте. Его преодолением мы сегодня и займемся. Под нож снова пойдет toodoo.ru, который мы уже препарировали в самом начале.

Шаг 1 - анализ.

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

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

screen33.jpg

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

Для работы с почтой мы будем использовать PEAR модуль (не путать с модулями движка php) Net/POP3. На многих хостингах он уже установлен, а если нет - во вложении архив со скриптом и модулем.

Алгоритм действия таков:

  1. Подключаемся к серверу, авторизуемся.
  2. Получаем список всех писем.
  3. Начинаем перебирать их, запрашивая заголовки каждого письма.
  4. Если в поле отправителя письма указан адрес сервиса, в котором мы регистрируемся - это нужное нам письмо. Если нет - ищем дальше.
  5. Из письма извлекаем ссылку на страницу подтверждения. (Тут нам снова понадобятся регулярные выражения).
  6. Если сервис того требует, совершаем дополнительные действия для завершения подтверждения.
  7. ???
  8. PROF1T!

В случае с toodoo.ru, нам придется из страницы подтверждения добыть уникальный ключ (опять регулярки) и отправить один POST-запрос.

Собственно, вот код, он основан на коде из 2 статьи:

  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
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<?php
header('Content-Type: text/html; charset=UTF-8');
// Функция, производящая регистрацию
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 = 'autoreg-test';
$email = 'autoreg-test@yandex.ru';
$password = '*';
// Данные для авторизации на почтовом сервере
$pop3_server = 'pop.yandex.ru';
$pop3_login = 'autoreg-test';
$pop3_password = '';

$step = $_GET['step']; // Текущая стадия

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

// Начало регистрации
if($step == 'reg')
{
	// Регаем
	if(register($login, $email, $password))
	{
		echo 'Успешно зарегистрирован';
		echo '<br><a href="'.basename(__FILE__).'?step=confirm">подтверждение по email</a>';
	}
	else
	{
		echo '<b>Ошибка регистрации</b>';
		echo '<br><a href="'.basename(__FILE__).'">Еще раз</a>';
	}
}
// Завершение регистрации (подтверждение)
else if($step == 'confirm')
{
	// Подключаем библиотеку для работы с POP3
	require('PEAR/POP3.php');

	// Создаем POP3-клиент
	$api = new Net_POP3();

	// Подключаемся к почтовому серверу
	if($api=>connect($pop3_server , 110 ) !== true)
	{
		echo 'Не удалось подключиться к серверу';
		echo '<br><a href="'.basename(__FILE__).'?step=confirm">Еще раз</a>';
		die();
	}

	// Авторизуемся
	if($api->login($pop3_login , $pop3_password ) !== true)
	{
		echo 'Не удалось авторизоваться';
		echo '<br><a href="'.basename(__FILE__).'?step=confirm">Еще раз</a>';
		die();
	}

	$list = $api->getListing(); // Получаем список писем в ящике

	// Ищем нужное письмо - скачиваем заголовки поочередно для всех писем и проверяем адрес отправителя
	foreach($list as $item)
	{
		$headers = $api->getParsedHeaders($item['msg_id']); // Скачиваем заголовки

		// Если отправитель совпадает с нужним нам, то приступаем к обработке
		if(strstr($headers['From'], 'toodoo.ru'))
		{
			$body = $api->getBody($item['msg_id']); // Скачиваем все письмо

			// Вытаскиваем уникальную ссылку
			preg_match('#http://toodoo.ru/confirm/contact\?code=\S+#i', $body, $matches);

			// Особая, curl-ная магия
			$ch = curl_init(); // Инициализируем сессию
			curl_setopt($ch, CURLOPT_URL,$matches[0]); // задаем адрес страницы подтверждения
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Результат нам нужно вернуть в переменную, а не на экран
			curl_setopt($ch. CURLOPT_FOLLOWLOCATION, 1); // Переходить по редиректам
			$result = curl_exec($ch); // Выполняем запрос

			// Мы, часом, еще не подтвердили?
			if(strstr($result, 'Видимо адрес по этой ссылке был уже подтвержден.'))
			{
				echo 'Что-то пошло не так, либо аккаунт уже подтвержден.';
				echo '<br><a href="'.basename(__FILE__).'?step=confirm">Еще раз</a>';
				break;
			}

			// У toodoo.ru требуется отправить дополнительную форму о том, что мы действительно подтверждаем регистрацию

			// Добываем уникальный ключ
			preg_match('#<input type="hidden" name="code" value="([^"]+)">#', $result, $matches);

			// Формируем поля запроса
			$post = array(
				'code'	=> $matches[1],
				'agree'	=> 'Добавить',
			);

			// Отправляем форму
			curl_setopt($ch, CURLOPT_URL,"http://toodoo.ru/confirm/contact"); // задаем адрес обработчика формы
			curl_setopt($ch, CURLOPT_POST, 1); // Указываем, что нам нужно отправить POST-запрос
			curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // Передаем POST-параметры
			$result = curl_exec($ch); // Выполняем запрос

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

			// Мавр сделал свое дело, мавр может уходить.
			echo 'Аккаунт успешно подтвержден!';
			break;
		}
	}
}
else
{
	echo '<br><a href="'.basename(__FILE__).'?step=reg">Начать регистрацию</a>';
}

// Все!  ;-)
?>

В коде опять есть пара синтаксических ошибок, но я думаю, для вас они проблемы не представляют :) Скачать весь скрипт: toodoo.zip

Итоги.

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

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

Вам удачного программирования, а я пойду разучивать это произведение :)

Пишем простой авторегистратор. Часть 4 - подключаем антикапчу.

Содержание

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

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

Что из себя представляет антикапча?

Антикапча - это сервис по ручному распознаванию капчи. Иными словами, сотни китайцев школьников сидят и за копейки распознают капчу, которые им подсовывают. Я не представляю, где они находят столько дураков, готовых за $1 распознавать 1000 капч, но меня это и не волнует.

Механизм работы сервиса простой:

  1. Вы отправляете картинку на сервис и она встает в очередь на прием к обезьянкам.
  2. Раз в 5 секунд вы запрашиваете статус картинки.
  3. Если картинка не распозналась, ждете еще 5 секунд. Если ожидание затянулось - значит не судьба, спустя некоторое время картинка выпадает.
  4. Если картинка распозналась, то вы получаете текст, который по мнению обезьянки на ней написан.

На счет мнения обезьянки надо сказать отдельно. Среди них попадаются откровенные халтурщики, которые вводят заведомую херню. Поэтому чтобы минимизировать шанс нарваться на такую сволочь, надо в запросе на добавление картинки максимально точно описать параметры текста.

Техническая сторона.

Антикапча предоставляет несложный API для взаимодействия с ней, однако уже написаны функции для PHP, Python, C++, Perl, C#, Delphi и даже VB и Asm, чем мы и будем пользоваться. В нашем случае, я воспользуюсь PHP-версией с curl. В архив я включил слегка измененную для более удобного вывода процесса версию этого скрипта, но с тем же успехом можно работать и с оригинальным.

Инвайты на антикапчу.

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

Пишем код.

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

 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
<?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); // Закрываем сессию

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

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

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

// Получаем капчу и сессионный ключ
$key = register1();

// Подключаем апи антикапчи
require('ac_curl.php');
// Распознаем капчу. Список и значение параметров функции можно узнать в начале файла.
// Чем точнее параметры будут описывать капчу, тем больше точность распознавания
$captcha=recognize("captcha.jpg","ваш_api_key",true, 5, 120, 0, 0, 1, 4, 6);
// На всякий случай показываем картинку и распознанный текст
echo '<img src="captcha.jpg"><br>Text:'.$captcha.'<br>';

// Регаем
if(register2($login, $email, $password, $captcha, $key))
{
	echo 'Успешно зарегистрирован';
}
else
{
	echo '<b>Ошибка регистрации</b>';
}
echo '<br><a href="'.basename(__FILE__).'">Еще раз</a>';
// Все!  ;-)
?>

Обратите внимание, что “ваш_api_key” надо заменить на нормальный api key, который есть в панели антикапчи, в разделе настройки. напомню, что в скрипте умышленно допущена пара синтаксических ошибок, чтобы отсеять все тех же обезьянок.

moemesto_ac.zip - архив с самом скриптом и модифицированной библиотекой работы с антикапчей.

UPD1. Завтра сделаю автоматическую выдачу инвайтов, дабы не тормозить очередь :)

UPD2.Сделал.

В следующем выпуске…

… вы узнаете, как подтвердить регистрацию по почте.

Новогодний картиночный позитив!

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

С удовольствием отмечу, что в этом деле у меня есть соратник в лице Бездомного Бродяги. А задумал он поправлять настроение нации с помощью конкурса новогодних картинок.

Чтобы привнести свой вклад в общий позитив надо немного:

  1. Нарисовать новогоднюю картинку на тему заработка в интернете
  2. Прислать картинку Бездомному на почту или опубликовать на своем блоге и кинуть ссылку ему в комменты.
  3. В очередном посте поставить ссылку на конкурс с анкором “новогодние картинки”, а так же на http://www.postquickly.com/sss/ с анкором “Полностью автоматическая регистрация в социальных закладках”

Призовой фонд пока $50 и еще увеличится, как только Бездомный растрясет спонсоров пока писал, он стал уже $110 :) Впрочем, что я говорю? Читайте все из первых рук и участвуйте :)