【问题标题】:PHP curl, preserve sessionPHP curl,保留会话
【发布时间】:2012-02-08 04:47:33
【问题描述】:

我正在制作一个应用程序,它可以从网站上抓取数据,根据需要对其进行格式化,然后将其显示给用户。现在,站点不允许跨站点脚本请求,所以我使用 PHP 的 curl 来检索页面。

  • 使用浏览器时,网站会在您第一次访问时为您提供一个 cookie,要求您登录,并且在后续请求时会为您提供您请求的实际页面。

  • 使用 PHP 的 curl,网站只会给我要求我登录的页面。而且,我想,给我的 PHP 服务器一个 cookie。

如何保存此 cookie 并在后续请求中显示它?

【问题讨论】:

  • 在身份验证之前和之后的所有请求中添加curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookiefile.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookiefile.txt');

标签: php session curl


【解决方案1】:

使用一些 setopts 来设置 cookie。

例子:

$ch=curl_init();
curl_setopt($ch, CURLOPT_COOKIEFILE, "c:/cookies/cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "-");

【讨论】:

    【解决方案2】:

    我修改了 nabab 的代码,试了一下,效果很好:

        $loginData = array('username'=>'myuser', 'password'=>'mypassword');
    $postData = array('url'=>'http://stackoverflow.com');
    $loginURL = "http://stackoverflow.com/login.php";
     $addURL = "http://stackoverflow.com/addUrl.php";
    
    $curl_options = array(
        CURLOPT_RETURNTRANSFER => true,     /* return web page */
        CURLOPT_HEADER         => false,    /* don't return headers */
        CURLOPT_FOLLOWLOCATION => true,     /* follow redirects */
        CURLOPT_ENCODING       => "",       /* handle all encodings */
        CURLOPT_AUTOREFERER    => true,     /* set referer on redirect */
        CURLOPT_CONNECTTIMEOUT => 120,      /* timeout on connect */
        CURLOPT_TIMEOUT        => 120,      /* timeout on response */
        CURLOPT_MAXREDIRS      => 10,       /* stop after 10 redirects */
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_SSL_VERIFYPEER => 0
    );
    
    $cookie = "cookie.txt";
    if ( $ch = curl_init() )
    {
        curl_setopt_array($ch,$curl_options);
        if ( $cookie )
        {
            curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_URL, $loginURL);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($loginData) );
            $r = curl_exec($ch);
            curl_setopt($ch, CURLOPT_URL, $addURL);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData) );
            $r = curl_exec($ch);
    
        }
         curl_close($ch);
    }
    

    【讨论】:

      【解决方案3】:

      您必须使用 cookie。我就是这样做的(我返回一个包含 html 内容和编码的数组,这对抓取很有用):

      $curl_options = array(
          CURLOPT_RETURNTRANSFER => true,     /* return web page */
          CURLOPT_HEADER         => false,    /* don't return headers */
          CURLOPT_FOLLOWLOCATION => true,     /* follow redirects */
          CURLOPT_ENCODING       => "",       /* handle all encodings */
          CURLOPT_AUTOREFERER    => true,     /* set referer on redirect */
          CURLOPT_CONNECTTIMEOUT => 120,      /* timeout on connect */
          CURLOPT_TIMEOUT        => 120,      /* timeout on response */
          CURLOPT_MAXREDIRS      => 10,       /* stop after 10 redirects */
          CURLOPT_SSL_VERIFYHOST => 0,
          CURLOPT_SSL_VERIFYPEER => 0
      );
      if ( $ch = curl_init($url) )
      {
          curl_setopt_array($ch,self::$curl_options);
          if ( $cookie )
              curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie);
              $r = curl_exec($ch);
              curl_close($ch);
          }
      }
      

      【讨论】:

      • 你能从这个例子中删去多余的部分,只保留相关部分吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      相关资源
      最近更新 更多