Давайте заглянем в наш актив. Сейчас мы уже умеем писать простые регистраторы, умеющие бороться с капчей при помощи антикапчи. От окончательного захвата мирового господства полной автоматизации процесса регистрации нас отделяет единственный барьер - подтверждение по почте. Его преодолением мы сегодня и займемся. Под нож снова пойдет toodoo.ru, который мы уже препарировали в самом начале.
Прежде всего, надо проверить, требуется ли подтверждение вообще :) Если нет, то можно идти за пивом кефиром и наслаждаться воскресным отдыхом. Кроме того, бывает так, что подтверждение почты не является необходимым, но приносит какие-то бонусы. В таком случае вы вольны выбирать, надо вам подтверждать, или слишком лень. Я обычно подтверждаю, поскольку это придает профилю более человекоподобный вид.
Далее требуется выяснить, достаточно для подтверждения просто перейти по ссылке из письма, или надо совершить какие-то дополнительные действия. В случае с toodoo.ru после перехода на страницу нужно нажать на кнопку "Согласен" для завершения подтверждения. Поэтому нужно провести анализ этой формы, точно так же как мы анализировали на предмет защиты саму форму регистрации.
Для работы с почтой мы будем использовать PEAR модуль (не путать с модулями движка php) Net/POP3. На многих хостингах он уже установлен, а если нет - во вложении архив со скриптом и модулем.
Алгоритм действия таков:
В случае с toodoo.ru, нам придется из страницы подтверждения добыть уникальный ключ (опять регулярки) и отправить один POST-запрос.
Собственно, вот код, он основан на коде из 2 статьи:
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 = '[email protected]'; $password = '*****'; // Данные для авторизации на почтовом сервере $pop3_server = 'pop.yandex.ru'; $pop3_login = 'autoreg-test'; $pop3_password = '**********'; $step = $_GET['step']; // Текущая стадия // Выводим, что мы будем регать echo "Логин: $login, пароль: $password, email: $email
"; // Начало регистрации if($step == 'reg') { // Регаем if(register($login, $email, $password)) { echo 'Успешно зарегистрирован'; echo '
basename(__FILE__).'?step=confirm">подтверждение по email'; } else { echo 'Ошибка регистрации'; echo '
basename(__FILE__).'">Еще раз'; } } // Завершение регистрации (подтверждение) else if($step == 'confirm') { // Подключаем библиотеку для работы с POP3 require('PEAR/POP3.php'); // Создаем POP3-клиент $api = new Net_POP3(); // Подключаемся к почтовому серверу if($api=>connect($pop3_server , 110 ) !== true) { echo 'Не удалось подключиться к серверу'; echo '
basename(__FILE__).'?step=confirm">Еще раз'; die(); } // Авторизуемся if($api->login($pop3_login , $pop3_password ) !== true) { echo 'Не удалось авторизоваться'; echo '
basename(__FILE__).'?step=confirm">Еще раз'; 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 '
basename(__FILE__).'?step=confirm">Еще раз'; break; } // У toodoo.ru требуется отправить дополнительную форму о том, что мы действительно подтверждаем регистрацию // Добываем уникальный ключ preg_match('##', $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 '
basename(__FILE__).'?step=reg">Начать регистрацию'; } // Все! ;-) ?>
В коде опять есть пара синтаксических ошибок, но я думаю, для вас они проблемы не представляют :)
Теперь вы знаете все, что нужно для успешного написания авторегистратора практически к любому сервису. Поздравляю :)
Но если вы думаете, что это конец - то вы жестоко заблуждаетесь, я те позволю так просто от меня отделаться ;) В рамках цикла будет еще целых 2 статьи. Заключительной частью будет разумно сделать ответы на ваши вопросы по авторегистраторам, так что не стесняйтесь их задавать, а вот содержимое 6 части я пока придержу в секрете. Пусть это будет небольшим сюрпризом ;)
Вам удачного программирования, а я пойду разучивать это произведение :)
Пятая статья из цикла "Пишем простой авторегистратор". В этой части рассматривается вопрос автоматического подтверждения по почте.
В предыдущих частях уже рассмотрены вопросы создания простых авторегистраторов, регистраторов, позволяющих в...
Прикрепленный файл | Размер |
---|---|
toodoo.zip | 13.9 кб |
Я опять первый! Спасибо.
Пошел пробовать...
Какие книжки посоветуешь чтобы изучить именно для развития своей автореги. Например не только регистрации в закладках но и добавление в них. То есть посоветуй что нибудь для изучения.
Честно говоря, единственная книжка на эту тему, которую я прочитал, это самоучитель по PHP4 не помню какого автора. Было это лет пять назад. С тех пор мне хватало гугля, родной документации по PHP и собственной головы :)
Постинг в закладки ничем принципиально не отличается от регистрации, ибо не все ли равно, какую форму слать. Единственное, что надо перед этим авторизоваться, но это тоже делается элементарно.
не совсем понятно, если я хочу завести на toodoo.ru сразу 100 подтвержденных аккаунтов, это мне нужно иметь 100 ящиков? или для совершения такой авторегистрации нужно заводить свой почтовый сервер - чтобы плодить на нем подставные адреса для регистрации. Возможно я не правильно понял, подскажите пожалуйста.
Да, вам понадобится дофига ящиков, ничего не поделаешь. Держать их все на своем домене я бы не посоветовал - в какой-то момент их все перебанят по адресу и все.
С другой стороны, вым никто не мешает написать авторегистратор для любого бесплатного сервиса почты типа мейлру.
Причем писать даже ничего не нужно, их уже написано миллион. Гуглите авторегер mail.ru
Во-первых хотелось бы выразить автору мою признательность за статью. Спасибо. Во-вторых хочется задать вопрос компетентному человеку. Начну с пары слов о своей задаче. Состоит она в подтверждении по е-маил регистрации на формуе пхпбб (знаю что автора интересует этот движ), на всякий случай упомяну что моя регулярка имеет вид '#http://\S+/ucp\.php\?mode=activate&u=[0-9]+&k=\w+#i'
Большинство получаемых писем: Content-Transfer-Encoding: quoted-printable, тело письма заполнено "C =D1=87=D0=B5=D0=B3=D0=BE =D0=BD=D0=B0=D1=87=D0=BD=D0=B5= =D1=82=" вот такой красотой. так понимаю что мне возможно потребуется определять какое письмо как раскодировать и затем уже выпарсивать линки на подтверждение. Буду признателен за потраченное на ответ время.
Вы знаете, я уже без малого пять лет занимаюсь технической поддержкой phpBB, так что интересует - это слабо сказано. И это, пожалуй, единственный случай, когда я не буду говоить, как написать авторегистратор, простите.
В качестве компенсации могу сказать, что способ кодирования символов лежит на поверхности и не обязательно даже смотреть спецификацию, чтобы догадатьсяю
P.S.: линки выпарсиваются. еще раз большое спасибо автору статьи.
Пожалуйста.
Здравствуйте! Очень благодарен вам за ваши статьи!
Пробую сейчас сделать подтверждение по e-mail и столкнулся с такой проблемой.
При помощи curl'a успешно захожу к себе на ящик и вытягиваю нужную ссылку для перехода. Потом перехожу curl'ом по этой ссылке, но подтверждение не проходит, так как должен произойти редирект (пишет "Возможно ваш почтовый клиент не поддерживает переход по гиперссылкам"). Followlocation установлен. Заголовки ручной регистрации совпадают со скриптовыми, кроме того, что в первом случает я получаю 302 ответ с дополнительным заголовком Location, а со скриптом просто ответ 200. Куки тоже сохраняються.
Может ли это быть какой нибудь вариант защиты против такого метода подверждения?
На некоторых хостингах из соображений безопасности запрежают включать FOLLOWLOCATION. В любом слуаче, можно руками доставать содержимое заголовка location и переходить по нему.
Если вы имеете ввиду расположение скрипта, то работает на денвере.
Насчет ручного перехода по вытянутой ссылке небольшая проблемка) Куки в таком случае ставятся браузеровские и при следующей работе с проблемным ресурсом со скрипта происходит logout с вылетом сообщения что замечено двойное использование сайта.
Вобщем, это наверное обсуждение сферического коня в вакууме)
Просто думал может сталкивались с таким.
Под "вручную" я имел ввиду тем же скриптом разбирать заголовок ответа и переходить curl-ом по добытой ссылке.
Здравствуйте! Мне очень интересны ваши статьи. У меня большая просьба можете ли вы написать статью о борьбе с помощью curla с капчей от гугла http://google.com/recaptcha
Да там все как с любой другой капчей. Вот кусок кода из RegSubmitter'a, который добывает картинку.
// Ноу-хау: допываем картинку из рекапчи
$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]");
Этот код 6LfV6wgAAAAAAF327mU7j7lzG6s-p1SolxPA2Wx2 - уникальный для каждого сайта, но постоянный, так что его легко добыть из кода страницы. А дальше - как с обычной капчей.
Вообще, в третьей статье из цикла я описал алгоритм, по которому легко разобраться с любой капчей.
Здравствуйте! У меня PEAR/POP3 не все письма скачивает с mail_ru не подскажите в чем может быть проблема?
Наверное потому что они попадают в спам.
Помогите разобраться с капчей, не могу понять где у нее постоянный адрес.
http://24.co.nl/register
http://24.co.nl/captcha
Есть текстовый файл с сылками htpp, как их оттуда проще всего вытащить?
Смотря что за файл. Если файл один, то проще всего сделать это текстовым редактором и регулярными выражениями.
Отправить комментарий