如何在curl请求后设置会话

时间:2016-02-16 08:49:38

标签: php session curl header

我正在尝试从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电话中做所有事情吗?

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

1 个答案:

答案 0 :(得分:1)

PHPSESSID是一个cookie,因此您可以存储此cookie以及第一个curl GET请求中的所有其他cookie,并将其用于第二个请求。

在第一次请求之前为cookie信息定义一个temorary storeage文件

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

在第一个请求中捕获并保存cookie

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';
?>