0

我正在尝试向需要登录但服务器不支持 https 协议的网站发出请求,因此我无法使用 curl。

我拥有的原始代码如下所示:

    $ch = curl_init();

    $options = array(
        CURLOPT_URL => $url,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0',
        CURLOPT_COOKIEJAR => dirname(__FILE__) . '\cookies.txt',
        CURLOPT_COOKIEFILE => dirname(__FILE__) . '\cookies.txt',
        CURLOPT_RETURNTRANSFER => 1
    )

    curl_setopt_array($ch, $options);

    $page = curl_exec ($ch);

我在使用 file_get_contents 时想到了以下内容:

    $cookies = file_get_contents(dirname(__FILE__) . '\cookies.txt');

    $primary_context_options = array(
        "http" => array(
            "method" => "GET",
            "follow_location" => true,
            "header" => "Cookie: " . $cookies .  "\r\n" . 
            "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0\r\n"
        ),
        "ssl" => array(
            "verify_peer" => false,
        )
    );

    $primary_context = stream_context_create($primary_context_options);
    $page = file_get_contents($url, false, $primary_context);

第一个请求返回正常,但我不确定我是否正确设置了 cookie。唯一的问题是我使用凭据登录的第二个请求:

        $login_context_options = array(
            "http" => array(
                "method" => "POST",
                "header" => "Content-type: application/x-www-form-urlencoded\r\n"
                    . "Content-Length: " . strlen($post) . "\r\n"
                    . "Referer: " . $url  . "\r\n", 
                "content: " . $post
            )
        );



        $login_context = stream_context_create($login_context_options);
        $login = file_get_contents($login_url, false, $login_context);

它总是返回:

"file_get_contents($url_encoded_login_url_of_website) failed to open stream: HTTP request failed!"

我可以使用 curl 使用给定的 url 登录,所以我不知道我在这里缺少什么。

如果有帮助,这里是使用 curl 登录的原始代码:

        $additional_options = array(
            CURLOPT_URL => $login_url, 
            CURLOPT_REFERER => $url,
            CURLOPT_POST => 1,
            CURLOPT_POSTFIELDS => $post
        );

        curl_setopt_array($ch, $additional_options);
        curl_exec($ch); 

任何想法我可以用 file_get_contents 版本犯什么错误?提前致谢!

4

0 回答 0