【问题标题】:How to set a session after curl requestcurl请求后如何设置会话
【发布时间】:2016-02-16 17:44:52
【问题描述】:

我正在尝试根据 curl 标头的响应设置会话。然后使用先前的会话集执行新的 curl。但是我好像还是没有登录。

firl cURL 执行如下所示:

$url = "https://www.tyre24.com//nl/nl/user/login/userid/MYUSERID/password/MYPASSWORD/page/L2V4cG9ydC9kb3dubG9hZC90L01nPT0vYy9NVFE9Lw==";


$ch = curl_init(str_replace(" ","%20",$url));
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

$response = curl_exec($ch); 

// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$redirect_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

curl_close($ch);

然后,我使用以下代码从标头响应中检索 PHPSESSID:

$arrResult = explode("PHPSESSID=", $header);
$arrResult = explode(";", $arrResult[1]);

session_id("$arrResult[0]");
session_start();

到目前为止一切正常,当我执行代码时,我得到了变量中 PHPSESSID 的值。

但是当我用底部的 2 行设置会话时,似乎有注释集之类的。至少在会话开始后,我尝试打印所有会话。但它会打印一个空数组。

所以可能是我在这里做错了。

但是在第一个请求之后需要有第二个请求,因为第一个请求的 url 会将我链接到一个新的 URL 以下载文件。

所以第二个请求看起来像这样:

$second_url = "https://www.tyre24.com/nl/nl/export/download/t/Mg==/c/MTQ=/";

$fp = fopen ('result.zip', 'w+');

$ch = curl_init(str_replace(" ","%20",$second_url));
curl_setopt($ch, CURLOPT_TIMEOUT, 50);

curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

$response = curl_exec($ch); 

// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$redirect_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

curl_close($ch);
fclose($fp);

谁能看到我做错了什么? 或者我可以在一个 cURL 调用中完成所有事情吗?

我不断收到我未登录的消息。

【问题讨论】:

    标签: php session curl header


    【解决方案1】:

    PHPSESSID 是一个 cookie,因此您可以存储该 cookie 以及来自第一个 curl GET 请求的所有其他 cookie,并在第二个请求中使用它们。

    在第一次请求之前为 cookie 信息定义一个临时存储文件

    $cookiestore=tempnam( sys_get_temp_dir(), '_cookiejar_' );
    

    在第一次请求中捕获并保存cookies

    curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookiestore );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookiestore );
    

    在随后的 curl 请求中,将 cookie 与请求的其他部分一起发送。

    curl_setopt( $ch, CURLOPT_COOKIE, $cookiestore );
    

    希望这可能会有所帮助

    尝试编写一个可以实现 cookie 捕获以及后续登录和文件下载的脚本。它没有经过测试,因为我没有凭据 - 也许它会有用?

    <?php
        $baseurl='https://www.tyre24.com/nl/nl/user/login/page/L25sL25sL3VzZXIv';
        /* download cacert from curl.haxx.se and edit path */
        $cacert=realpath( 'c:/wwwroot/cacert.pem' );
        /* temporary cookie file */
        $cookiestore=tempnam( sys_get_temp_dir(), '_cookiejar_' );
    
        $zipfile='result.zip';
    
        /* login details */
        $params=array(
            'userid'    =>  '123abc',
            'password'  =>  'xyz999'
        );
    
        $headers=array();
    
    
        /* stage 1: get the page, store cookies - mmm-cookies */
        $curl=curl_init( $baseurl );
        /* set some base options used for all requests */
        $baseoptions=array(
            CURLOPT_SSL_VERIFYPEER  =>  false,
            CURLOPT_SSL_VERIFYHOST  =>  2,
            CURLOPT_CAINFO          =>  $cacert,
            CURLOPT_AUTOREFERER     =>  true,
            CURLOPT_FOLLOWLOCATION  =>  true,
            CURLOPT_FORBID_REUSE    =>  false,
            CURLOPT_FAILONERROR     =>  false,
            CURLOPT_HEADER          =>  false,
            CURLOPT_RETURNTRANSFER  =>  true,
            CURLOPT_CONNECTTIMEOUT  =>  15,
            CURLOPT_TIMEOUT         =>  90,
            CURLOPT_USERAGENT       =>  $_SERVER['HTTP_USER_AGENT'],
            CURLINFO_HEADER_OUT     =>  false,
            CURLOPT_VERBOSE         =>  true
        );
    
        /* specific options for initial request where you need to capture cookies */
        $options=array_merge( $baseoptions, array(
            CURLOPT_COOKIEFILE      =>  $cookiestore,
            CURLOPT_COOKIEJAR       =>  $cookiestore    
        ));
    
        /* set the options */
        curl_setopt_array( $curl, $options );
            $result=curl_exec( $curl );
            $info=(object)curl_getinfo( $curl );
    
    
    
        if( $info->http_status==200 ){
            /* stage 2: send login parameters via POST */
            $params=http_build_query( $params );
    
            $fp = fopen( $zipfile, 'w+');
    
            $headers[]='Content-Length: '.strlen( $params );
    
            $options=array_merge( $baseoptions, array(
                CURLOPT_FILE            =>  $fp,
                CURLOPT_COOKIE          =>  $cookiestore,
                CURLOPT_FRESH_CONNECT   =>  false,
                CURLOPT_POST            =>  true,
                CURLOPT_POSTFIELDS      =>  $params,
                CURLOPT_HTTPHEADER      =>  $headers
            ));
    
            curl_setopt_array( $curl, $options );
                $result=curl_exec( $curl );
                $info=(object)curl_getinfo( $curl );
    
                if( $info->http_status==200 ){
                    /* do other stuff */
                }
    
    
    
            @fclose( $fp );
        } else {
            print_r( $info );
        }
    
    
        curl_close( $curl );
        $curl = $result = $info =$baseurl = $params = null;
    
        echo 'done';
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-17
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2013-04-13
      相关资源
      最近更新 更多