首页 文章

来自url的file_get_contents只有在登录网站后才能访问

提问于
浏览
9

我想制作一个可以从网站捕获页面的PHP脚本 . 想想file_get_contents($ url) .

但是,本网站要求您在访问任何页面之前填写用户名/密码登录表单 . 我想,一旦登录,网站会向您的浏览器发送一个身份验证cookie,并且随后的每个浏览器请求都会将会话信息传递回网站以验证访问权限 .

我想知道我如何使用PHP脚本模拟浏览器的这种行为,以获得访问权限并从该网站捕获页面 .

更具体地说,我的问题是:

  • 如何发送包含我的登录详细信息的请求,以便网站回复会话信息/ cookie

  • 如何阅读会话信息/ cookie

  • 如何将此会话信息与每个后续请求(file_get_contents,curl)一起传回网站 .

谢谢 .

2 回答

  • 15

    Curl非常适合这样做 . 除了设置 CURLOPT_COOKIEJARCURLOPT_COOKIEFILE 选项之外,您不需要执行任何特殊操作 . 一旦您通过从站点传递表单字段登录,cookie将被保存,Curl将自动使用相同的cookie用于后续请求,如下例所示 .

    请注意,下面的函数将cookie保存到 cookies/cookie.txt ,因此请确保目录/文件存在且可以写入 .

    $loginUrl = 'http://example.com/login'; //action from the login form
    $loginFields = array('username'=>'user', 'password'=>'pass'); //login form field names and values
    $remotePageUrl = 'http://example.com/remotepage.html'; //url of the page you want to save  
    
    $login = getUrl($loginUrl, 'post', $loginFields); //login to the site
    
    $remotePage = getUrl($remotePageUrl); //get the remote page
    
    function getUrl($url, $method='', $vars='') {
        $ch = curl_init();
        if ($method == 'post') {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies/cookies.txt');
        curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies/cookies.txt');
        $buffer = curl_exec($ch);
        curl_close($ch);
        return $buffer;
    }
    
  • 0

    http pecl extension可以做到,也可以PEAR::HTTP_ClientSnoopy以及许多其他库/类 . 如果您(无论出于何种原因)想要使用 file_get_contents 实现此目的,您可以使用stream context options for the http wrapper设置POST和cookie参数,使用stream_get_meta_data来读取包含cookie的响应头 .

相关问题