Пишем простой авторегистратор. Часть 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 статьи:


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 части я пока придержу в секрете. Пусть это будет небольшим сюрпризом ;)

PS. Vivaldi - Summer Storm (by Children of Bodom)

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



Trackback URL for this post:

/trackback/373

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

Пятая статья из цикла "Пишем простой авторегистратор". В этой части рассматривается вопрос автоматического подтверждения по почте.

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

Прикрепленный файл Размер
toodoo.zip 13.9 кб
Дмитрий пн, 21/12/2019 - 02:26

Я опять первый! Спасибо.
Пошел пробовать...
Какие книжки посоветуешь чтобы изучить именно для развития своей автореги. Например не только регистрации в закладках но и добавление в них. То есть посоветуй что нибудь для изучения.

Alek$ пн, 21/12/2019 - 12:05

Честно говоря, единственная книжка на эту тему, которую я прочитал, это самоучитель по PHP4 не помню какого автора. Было это лет пять назад. С тех пор мне хватало гугля, родной документации по PHP и собственной головы :)

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

Max пн, 21/12/2019 - 20:01

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

Alek$ пн, 21/12/2019 - 22:53

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

Гость вт, 29/12/2019 - 00:12

Причем писать даже ничего не нужно, их уже написано миллион. Гуглите авторегер mail.ru

Илья ср, 27/01/2020 - 21:11

Во-первых хотелось бы выразить автору мою признательность за статью. Спасибо. Во-вторых хочется задать вопрос компетентному человеку. Начну с пары слов о своей задаче. Состоит она в подтверждении по е-маил регистрации на формуе пхпбб (знаю что автора интересует этот движ), на всякий случай упомяну что моя регулярка имеет вид '#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=" вот такой красотой. так понимаю что мне возможно потребуется определять какое письмо как раскодировать и затем уже выпарсивать линки на подтверждение. Буду признателен за потраченное на ответ время.

Alek$ ср, 27/01/2020 - 22:09

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

Илья ср, 27/01/2020 - 22:14

P.S.: линки выпарсиваются. еще раз большое спасибо автору статьи.

Alek$ чт, 28/01/2020 - 01:06

Пожалуйста.

Krusher пн, 01/02/2020 - 19:58

Здравствуйте! Очень благодарен вам за ваши статьи!
Пробую сейчас сделать подтверждение по e-mail и столкнулся с такой проблемой.
При помощи curl'a успешно захожу к себе на ящик и вытягиваю нужную ссылку для перехода. Потом перехожу curl'ом по этой ссылке, но подтверждение не проходит, так как должен произойти редирект (пишет "Возможно ваш почтовый клиент не поддерживает переход по гиперссылкам"). Followlocation установлен. Заголовки ручной регистрации совпадают со скриптовыми, кроме того, что в первом случает я получаю 302 ответ с дополнительным заголовком Location, а со скриптом просто ответ 200. Куки тоже сохраняються.
Может ли это быть какой нибудь вариант защиты против такого метода подверждения?

Alek$ пн, 01/02/2020 - 20:08

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

Krusher пн, 01/02/2020 - 20:17

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

Alek$ пн, 01/02/2020 - 20:22

Под "вручную" я имел ввиду тем же скриптом разбирать заголовок ответа и переходить curl-ом по добытой ссылке.

vitako сб, 24/07/2020 - 02:33

Здравствуйте! Мне очень интересны ваши статьи. У меня большая просьба можете ли вы написать статью о борьбе с помощью curla с капчей от гугла http://google.com/recaptcha

Alek$ сб, 24/07/2020 - 20:57

Да там все как с любой другой капчей. Вот кусок кода из 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 - уникальный для каждого сайта, но постоянный, так что его легко добыть из кода страницы. А дальше - как с обычной капчей.

Alek$ сб, 24/07/2020 - 20:58

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

Voodoo пт, 20/08/2020 - 19:08

Здравствуйте! У меня PEAR/POP3 не все письма скачивает с mail_ru не подскажите в чем может быть проблема?

Alek$ сб, 21/08/2020 - 12:03

Наверное потому что они попадают в спам.

vitako пн, 20/09/2020 - 23:55

Помогите разобраться с капчей, не могу понять где у нее постоянный адрес.
http://24.co.nl/register

Alek$ вт, 21/09/2020 - 00:09

http://24.co.nl/captcha

Эдуард Говнов пт, 05/04/2023 - 00:33

Есть текстовый файл с сылками htpp, как их оттуда проще всего вытащить?

Alek$ пт, 05/04/2023 - 11:28

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



Отправить комментарий

CAPTCHA
Вы точно не бот?
12 + 3 =
Without JavaScript you won't pass captcha test, sorry. Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.