Как CURL Войти с помощью капчи и сессии - PullRequest
13 голосов
/ 27 апреля 2011
define('COOKIE', './cookie.txt');
define('MYURL', 'https://register.pandi.or.id/main');

function getUrl($url, $method='', $vars='', $open=false) {
    $agents = 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16';
    $header_array = array(
        "Via: 1.1 register.pandi.or.id",
        "Keep-Alive: timeout=15,max=100",
    );
    static $cookie = false;
    if (!$cookie) {
        $cookie = session_name() . '=' . time();
    }
    $referer = 'https://register.pandi.or.id/main';
    $ch = curl_init();
    if ($method == 'post') {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "$vars");
    }
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header_array);
    curl_setopt($ch, CURLOPT_USERAGENT, $agents);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 5);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

    $buffer = curl_exec($ch);
    if (curl_errno($ch)) {
        echo "error " . curl_error($ch);
        die;
    }
    curl_close($ch);
    return $buffer;
}

function save_captcha($ch) {
    $agents = 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16';
    $url = "https://register.pandi.or.id/jcaptcha";
    static $cookie = false;
    if (!$cookie) {
        $cookie = session_name() . '=' . time();
    }
    $ch = curl_init();    // Initialize a CURL session.
    curl_setopt($ch, CURLOPT_URL, $url);  // Pass URL as parameter.
    curl_setopt($ch, CURLOPT_USERAGENT, $agents);
    curl_setopt($ch, CURLOPT_COOKIESESSION, true);
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  // Return stream contents.
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // We'll be returning this
    $data = curl_exec($ch);  // // Grab the jpg and save the contents in the
    curl_close($ch);  // close curl resource, and free up system resources.
    $captcha_tmpfile = './captcha/captcha-' . rand(1000, 10000) . '.jpg';
    $fp = fopen($tmpdir . $captcha_tmpfile, 'w');
    fwrite($fp, $data);
    fclose($fp);
    return $captcha_tmpfile;
}

if (isset($_POST['captcha'])) {
    $id = "yudohartono";
    $pw = "mypassword";
    $postfields = "navigation=authenticate&login-type=registrant&username=" . $id . "&password=" . $pw . "&captcha_response=" . $_POST['captcha'] . "press=login";
    $url = "https://register.pandi.or.id/main";
    $result = getUrl($url, 'post', $postfields);
    echo $result;
} else {

    $open = getUrl('https://register.pandi.or.id/main', '', '', true);
    $captcha = save_captcha($ch);
    $fp = fopen($tmpdir . "/cookie12.txt", 'r');
    $a = fread($fp, filesize($tmpdir . "/cookie12.txt"));
    fclose($fp);
 <form action='' method='POST'>
        <img src='<?php echo $captcha ?>' />
        <input type='text' name='captcha' value=''>
        <input type='submit' value='proses'>
    </form>";
    if (!is_readable('cookie.txt') && !is_writable('cookie.txt')) {
        echo "cookie fail to read";
        chmod('../pandi/', '777');
    }
}

этот cookie.txt

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

register.pandi.or.id    FALSE   /   FALSE   0   JSESSIONID  05CA8241C5B76F70F364CA244E4D1DF4

после того, как я отправляю форму, просто отображается

HTTP/1.1 200 OK Date: Wed, 27 Apr 2011 07:38:08 GMT Server: Apache-Coyote/1.1 X-Powered-By: Servlet 2.4; Tomcat-5.0.28/JBoss-4.0.0 (build: CVSTag=JBoss_4_0_0 date=200409200418) Content-Length: 0 Via: 1.1 register.pandi.or.id Content-Type: text/plain X-Pad: avoid browser bug

, если не ошибка «Неверный код» всегда не удается войтиpandi, что не так в моем скрипте?
Я не хочу разрывать капчу, но я хочу отображать капчу и вводить капчу с моей веб-страницы, чтобы пользователь мог автоматически регистрировать домен dotID из моей сети

Ответы [ 6 ]

20 голосов
/ 27 апреля 2011

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

Я не вижу законного пути.

2 голосов
/ 07 июня 2012

Это происходит потому, что
Вы взяли свое изображение с первого getURL (ie first curl_exec) и обработали его, но для отправки вашего кода вам необходимо getURL (ie again curl_exec), что означает новую страницу с новым кодом.

Итак, вы помещаете старую капчу и помещаете ее в новую капчу. У меня та же проблема, и я решил ее.

0 голосов
/ 25 декабря 2016

Да, Андро Сельва прав.По второму запросу выдает новую капчу.Как только он загружает капчу с помощью функции getUrl, а вторая загрузка происходит из функции save_captcha, так что это 2 разных изображения.

Он должен сделать что-то вроде этого: Загрузите изображение капчи перед закрытием скручивания и перед публикацией и сообщитесценарий ожидания, пока вы не предоставите ответ на код с картинки - я буду использовать preg_match.Также потребуется некоторый javascript.

Если изображение captcha генерируется из javascript, вам необходимо выполнить этот javascript с тем же файлом cookie или токеном.В этой ситуации более простым решением является запись заголовков с помощью, например, addhttpheaders addon для mozila ffox.

0 голосов
/ 07 октября 2015

Использование решения для навигации без головы возможно.то есть: zombie.js coffee.js на узле. Также может быть возможно извлечь «изображение» из капчи и, используя распознавание изображений, «прочитать» изображение и преобразовать его в текст, который затем публикуется с формой.

На сегодняшний день единственный надежный способ «обмануть» капчу - это использовать просмотр без головы.

0 голосов
/ 27 апреля 2011

С PHP я не знаю, как это сделать, вам нужно получить капчу и найти способ ее решить.У него много алгоритмов, чтобы сделать это за вас, но если вы хотите использовать Java, я уже взломал исходный код по этой ссылке , чтобы получить код для решения капчи, и он очень хорошо работает длямного каптч-систем.

Итак, вы можете попытаться реализовать свой собственный капч-решатель, который займет много времени, попытаться найти существующую реализацию для PHP или, IMHO, лучший вариант для использованиякодовая база JDownloader.

0 голосов
/ 27 апреля 2011

Captcha - это динамическое изображение, создаваемое сервером при нажатии на страницу.Он будет постоянно меняться, вы должны извлечь капчу со страницы, затем проанализировать ее и затем отправить свою страницу для входа в систему.Капча будет продолжать меняться по мере загрузки страницы!

...