Задача:
1. Зайти на
https://example/ при помощи логина и пароля
2. Сграбить данные
Решение:
Название файла: parser.php
Кодировка файла: UTF-8
Содержимое файла:
// ШАГ 1
/*********************************************************
* ЗАЛОГИНИЛИСЬ И ПОЛУЧИЛИ ОТВЕТ ОТ QueryProcess : LOGIN
********************************************************/
$ch = curl_init();
$LOGIN = 'ЗАКРЫТО ИБО ОЧЕНЬ КОНФЕДЕНЦИАЛЬНО';
$PASSWD = 'ЗАКРЫТО ИБО ОЧЕНЬ КОНФЕДЕНЦИАЛЬНО';
$USER = 'ЗАКРЫТО ИБО ОЧЕНЬ КОНФЕДЕНЦИАЛЬНО';
$curl_data = "qid=CHECKACCOUNT&login_id=$LOGIN&password=$PASSWD&user_id=$USER&lang=1";
$options = array(
CURLOPT_URL => 'https://СЕРВЛЕТ ДЛЯ ОБРАБОТКИ ЗАПРОСОВ', // тоже закрыт. тоже конфеденциально
CURLOPT_RETURNTRANSFER => true, // DONT OUTPUT INTO BROWSER
CURLOPT_HEADER => false, // DONT RETURN HEADERS
CURLOPT_FOLLOWLOCATION => true, // FOLLOWING REDIRECTS
CURLOPT_ENCODING => "", // ALL ENCODINGS
CURLOPT_USERAGENT => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)", // I AM MOZILLKO 4.0
CURLOPT_AUTOREFERER => true, // REFERER ON REDIRECTS
CURLOPT_CONNECTTIMEOUT => 120, // TIMEOUT FOR CONNECTION
CURLOPT_TIMEOUT => 120, // RESPONSE TIMEOUT
CURLOPT_MAXREDIRS => 10, // MAX REDIRECTS 10
CURLOPT_POST => 1, // IM SENDING POST DATA
CURLOPT_REFERER => 'http://ВАЛИЖНЫЙ РЕФЕРЕР',
CURLOPT_POSTFIELDS => $curl_data, // POST DATA STRING
CURLOPT_SSL_VERIFYHOST => 0, // DONT VERIFY SSL HOST
CURLOPT_SSL_VERIFYPEER => false, // DONT VERIFY SSL PEER
CURLOPT_VERBOSE => 1, //
CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded')
);
curl_setopt_array($ch, $options);
$res = curl_exec($ch); // То, что отдает нам сервлет
$info = curl_getinfo($ch); // информация (сколько длился запрос, какой http код отдал сервлет и т.д.)
if (curl_errno($ch)>0)
print curl_error($ch); // ВЫВОДИМ ОШИБКУ, ЕСЛИ ЕСТь
curl_close($ch);
$res = trim($res);
SSL версия 3 (сервер)
Дело в том, что у меня это работает прекрасно на моем виртуальном хосте и данные прилетают.
phpinfo мой:
PHP Version 5.2.4
cURL support enabled
cURL Information libcurl/7.16.0 OpenSSL/0.9.8d zlib/1.2.3
После переноса на хостинг получил ошибку
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Закинул этот же скрипт еще на один хостинг. Получил ту же ошибку.
phpinfo хостинг 1:
PHP Version 5.2.8
cURL support enabled
cURL Information libcurl/7.19.2 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
phpinfo хостинг 2: (то же самое, что и на первом как оказалось)
PHP Version 5.2.8
cURL support enabled
cURL Information libcurl/7.19.2 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
6 часов (а может больше) "гуглинга" интернета не дали ровно ничего. Сертификат по всей видимости не требуется, т.к. на локалке у меня все работает, но я все таки пытался подсунуть "какой то" (я в этом плане не очень хорошо разбираюсь — информацию по SLL/OpenSSL читал, но глубинных знаний нет). Пытался указывать CURLOPT_COOKIEJAR, Пытался указывать CURLOPT_SSLAUTH, убирать автореферрер, указывать другой юзер-агент/не указывать юзер-агент... в общем, всего описать сейчас не смогу, но буквально уже выбился из сил. Не дает покоя то, что на локалке работает всё замечательно.
На локалке: Windows XP SP2, Denwer (Apache)
На хостингах: Unix, Apache
При том почти любой сайт (даже тот, который требует сертификат) удавалось считать как на локалке, так и на хостинге.
Кто сталкивался? Возможные пути решения? В чем (может быть) проблема?... Буду благодарен откликнувшимся.