我正在尝试从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电话中做所有事情吗?
我不断收到我未登录的消息。
答案 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';
?>