自动化 MaxMind 登录和数据库下载

Automate MaxMind login and DB download

我正在尝试使用 PHP CURL 登录 MaxMind 帐户并下载特定文件,我什至无法让登录部分正常工作,以下 returns "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 并复制 link URL 以获取您需要的数据库格式。如果您希望始终下载最新的数据库,请从 URL 中删除日期参数。如果您使用 shell 脚本中的 wget 或 curl,请务必将 URL 放在引号内。

如果您下载的是 dat 或 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);

因为我没有帐户,所以我无法进一步测试,但使用虚拟 username/password 响应是一个 401 错误,对于错误的用户名和密码似乎是正确的。