Вывод капчи (не могу понять ошибку)
05.10.2013, 23:13. Показов 2009. Ответов 3
Здравствуйте, уважаемые пользователи.
Начал сам писать авторегистратор для 9gag.com
Нашел в инете исходники, пытаюсь переделать. Вроде вникся, но что-то не получается.
Пишу на PHP, т.е. скрипт (сам в программировании практически ноль)
Собственно, вот код:
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
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
| <?php
header('Content-Type: text/html; charset=UTF-8');
function register1()
{
// Особая, curl-ная магия
$ch = curl_init(); // Инициализируем сессию
curl_setopt($ch, CURLOPT_URL,"https://9gag.com/member/email-signup"); // задаем адрес формы
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="recaptcha_challenge_field" value="([a-f0-9]+)">#i', $result, $key);
curl_setopt($ch, CURLOPT_URL,"http://www.google.com/recaptcha/api/image?c=$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(
'recaptcha_challenge_field' => $key, // Передаем сессионный ключ
'signup-email-name' => $login, // Логин
'signup-email-email' => $email, // Емейл
'signup-email-password' => $password, // Пароль
'recaptcha_response_field' => $captcha, // А это наш код с картинки
'do_reg' => 'Sign Up', // "Нажимаем" кнопку отправить ;-)
);
// Особая, curl-ная магия
$ch = curl_init(); // Инициализируем сессию
curl_setopt($ch, CURLOPT_URL,"https://9gag.com/member/email-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); // Переходить по редиректам
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // Указываем файл для хранения кукисов. При чем он должен быть тот же, что и в прошлый раз, чтобы кукисы подхватились.
// Запускаем запрос!
$result = curl_exec($ch);
curl_close ($ch); // Закрываем сессию
// Проверяем на успешность регистрации
if(strstr($result, 'Me Gusta! Welcome to 9GAG, go have fun now!'))
{
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;
}
?> |
|
Форма регистрации: https://9gag.com/member/email-signup
анализировал с помощью плагина для Firefox Web Developer.
Проблема: Не понял что с капчей делать. Как получить сессионный ключ ? (в коде он с исходника, я просто не понял как и на что его менять)
вот конкретно он: PHP | 1
2
| // При помощи простейшего регулярного выражения добываем сессионный ключ
preg_match('#<input type=hidden name="recaptcha_challenge_field" value="([a-f0-9]+)">#i', $result, $key); |
|
И при выполнении скрипта он просто не выводит капчу (картинка пустая).
И еще, сразу задам вопрос (я еще не искал это): как сделать, чтобы он брал email: pass с загруженного файла txt (по очереди) т.е. браз с базы, регистрировал, я ввожу капчу и далее со следующими.
Кому не сложно, помогите, пожалуйста!
Добавлено через 23 часа 34 минуты
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
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
| <?php
class Memori extends Module
{
// Параметры модуля
var $name = '9GAG'; // Имя сервиса, отображаемое пользователю
var $id = '9GAG'; // Все тот же Module_ID
var $url = 'http://9gag.com/'; // URL сервиса. Настоятельно рекомендую указывать правильный :-)
var $icon = '9gag.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('https://9gag.com/member/email-signup');
// Извлекаем токен
preg_match('#<input type="hidden" name="token" value="([0-9a-z]+)" />#is', $page, $matches);
// Ноу-хау: допываем картинку из рекапчи
$js = $this->Get('http://www.google.com/recaptcha/api/image?c=6Lf0iMkSAAAAALGZpEfzpO13sqJNiEgr6znqfm9r');
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(
'signup-email-name' => $account['login'], // Логин
'signup-email-email' => $account['email'], // Емейл
'signup-email-password' => $account['password'], // Пароль
'recaptcha_response_field' => $captcha, // Текст с картинки
'recaptcha_challenge_field' => $data['recaptcha'], // Токен рекапчи
'csrftoken' => $data['key'], // Токен формы
);
// Загружаем сохраненные кукисы с прошлого раза
$this->LoadCookies($data['cookies_file']);
// Отправляем запрос. Первый параметр - куда, второй - параметры запроса,
// третий (опциональный, по умолчанию - false) - надо ли преобразовывать страницу из кодировки сайта в родную для RS (utf-8)
// Очевидно, что для веб-страниц его надо ставить true, а дял картинок - false. Аналогичный параметр есть и у метода $this->Get()
$html_data = $this->Post("https://9gag.com/member/email-signup", $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@9gag.com');
// Загружаем тело сообщения
$text = $this->getMailBody($mail['msg_id']);
// Извлекаем ссылку подгверждения
preg_match('#[url]https://9gag.com/member/got-verifier?token=[/url][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 :-)
?> |
|
и вот снова.... немного другой код.
но он намного ближе к тому, что мне нужно. Опять же уже все(!) изменил под себя.
На сайт положил, запускаю и выдает ошибку Fatal error: Class 'Module' not found in /home/content/54/11502654/html/Memori.php on line 3
При чем на оригинальном такая же ошибка.
Что это? 3-я строка - это скобка =\ (закрывается вконце)
0
|