我试图使用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中删除date参数。如果你在shell脚本中使用using wget或curl,请务必将URL放在引号内。
如果您正在下载数据或mmdb格式,也有一个程序来处理自动更新,http://dev.maxmind.com/geoip/geoipupdate/
根据你上面的陈述,我将用一些额外的代码以重新散列的格式添加我的评论-然而,似乎你已经找到了解决方案并接受了答案,但没关系。
通常,对SSL端点的curl请求需要配置更多选项,特别是在许多情况下使用有效的cacert.pem
文件和用于验证SSL主机的显式选项。原始代码中选择的验证方法更适合登录到受.htaccess
文件保护的受限区域,而不是标准的基于web的登录表单,其中post请求中使用的字段应遵循表单元素中给定的名称。一般来说,当尝试模拟web登录时,我会复制有问题的表单,然后找到所有input
元素,并在我提供给curl请求的POST数据中使用它们。
/* 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
错误,这似乎是正确的错误的用户名和密码。