Я пытаюсь использовать PHP CURL для входа в учетную запись MaxMind и загрузки определенного файла, я даже не могу заставить работать часть входа в систему, следующее возвращает «false»:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.maxmind.com/en/account');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
var_dump($result);
Гораздо проще автоматизировать загрузку файла: https://www.maxmind.com/en/download_files и скопируйте URL ссылки для нужного вам формата базы данных. Если вы хотите всегда загружать самую последнюю базу данных, удалите параметр даты из URL. Если вы используете wget или curl из сценария оболочки, обязательно укажите URL в кавычках.
Если вы загружаете форматы dat или mmdb, есть также программа для автоматического обновления, http://dev.maxmind.com/geoip/geoipupdate/
В соответствии с вашим утверждением выше, я добавлю свой комментарий в перефразированном формате с некоторым дополнительным кодом — однако кажется, что вы уже нашли решение и уже приняли ответ, но не обращайте внимания.
Обычно запрос скручивания к конечной точке SSL требует настройки большего количества параметров, особенно во многих случаях использование действительного cacert.pem
файл и явные опции для проверки хоста SSL. Метод аутентификации, выбранный в исходном коде, больше подходит для входа в ограниченную область, защищенную .htaccess
файл, а не стандартная веб-форма входа в систему, где поля, используемые в запросе на публикацию, должны следовать именам, указанным в элементах формы. Как правило, при попытке эмулировать веб-логин я скопирую соответствующую форму, а затем найду все input
элементы и использовать их в данных POST, которые я предоставляю в запрос curl.
/* A simple curl function */
function mmcurl( $url=NULL, $data=array(), $options=NULL ){
/* Download cacert.pem and change path here to suit */
$cacert='c:/wwwroot/cacert.pem';
$cookiejar=tempnam( sys_get_temp_dir(), '_cookiejar_' );$curl=curl_init();
if( parse_url( $url,PHP_URL_SCHEME )=='https' ){
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $curl, CURLOPT_CAINFO, realpath( $cacert ) );
}
curl_setopt( $curl, CURLOPT_URL,trim( $url ) );
curl_setopt( $curl, CURLOPT_AUTOREFERER, TRUE );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, TRUE );
curl_setopt( $curl, CURLOPT_FRESH_CONNECT, TRUE );
curl_setopt( $curl, CURLOPT_HEADER, FALSE );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0' );
curl_setopt( $curl, CURLOPT_ENCODING, '' );
if( $options->cookie ){
curl_setopt( $curl, CURLOPT_COOKIEFILE, $cookiejar );
curl_setopt( $curl, CURLOPT_COOKIEJAR, $cookiejar );
curl_setopt( $curl, CURLOPT_COOKIE, $cookiejar );
}
if( $options->post ){
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, http_build_query( $data ) );
}
$res=(object)array(
'response' => curl_exec( $curl ),
'info' => curl_getinfo( $curl ),
'errors' => curl_error( $curl ),
'cookie' => $cookiejar
);
curl_close( $curl );
return $res;
}/* configure and call the function - used the suggestion from @Thomas for the endpoint url */
$url='https://www.maxmind.com/en/download_files';
$data=array(
'login' => $username, /* where $username & $password are YOUR variables */
'password' => $password,
'pkit_login' => 1,
'pkit_done' => '/en/download_files',
'Login' => 'Login'
);
$options=(object)array(
'post' =>true,
'cookie'=>true
);
$res=mmcurl( $url, $data, $options );
pre($res->info);
Поскольку у меня нет учетной записи, я не смог протестировать дальше этого, но используя фиктивное имя пользователя / пароль, ответ был 401
ошибка, которая кажется правильной для неправильного имени пользователя и пароля.