Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 6
1

Вывод капчи (не могу понять ошибку)

05.10.2013, 23:13. Показов 2009. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые пользователи.

Начал сам писать авторегистратор для 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2013, 23:13
Ответы с готовыми решениями:

Структура: Не могу понять, почему выдает ошибку и как собственно эту ошибку можно исправить?
Привет,не могу понять почему ошибку выдает и как сбстно эту ошибку можно исправить? #include...

Не могу понять ошибку
begin s:=ExtractFilePath(Application.ExeName); case TreeView1.Selected.AbsoluteIndex of...

не могу понять ошибку
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

Не могу понять ошибку
Вот код. Выводит что const char* несовместим с параметром типа LPCWSTR(в выделенных словах)...

3
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
06.10.2013, 10:46 2
Цитата Сообщение от Roman0612 Посмотреть сообщение
class Memori extends Module
вы пишете, что этот класс наследуется от класса Module. Вполне логично, что он ищет этот класс, не может найти, и выдает ошибку
0
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 6
06.10.2013, 10:54  [ТС] 3
а как это исправить то? =\

Удалил этот extends.

Теперь вообще ничего не выводит на страницу (пустой экран)

Переименновал в название класса -все равно ошибка

P.S. я не программист...
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
06.10.2013, 10:56 4
Ну, значит, как раз повод немного изучить FAQ: Объектно-ориентированное программирование на PHP
0
06.10.2013, 10:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2013, 10:56
Помогаю со студенческими работами здесь

Не могу понять ошибку
#include&lt;iostream.h&gt; #include&lt;math.h&gt; #include&lt;conio.h&gt; #include&lt;stdio.h&gt; int main() { double...

Не могу понять ошибку
В этом коде при компиляции пишет в строке Seek(ft, sc);: Implicit string cast with potential data...

не могу понять ошибку...
Здравствуйте! Нашёл в интернете код по сжатию страниц на асп.нет, (вот) но не могу корректно его...

не могу понять ошибку
здравствуйте. есть такой запрос: $result3 = mysql_query (&quot;INSERT INTO users (land)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru