使用curl在ext.jsp网页上登录php

使用curl在ext.jsp网页上登录php,php,jsp,curl,Php,Jsp,Curl,L.S 我有一些开发技能,但我对php curl还不熟悉。 我正在尝试创建一个php脚本,在没有任何用户交互的情况下登录intraship页面 我使用fiddler来确定发布的值,并在登录表单中搜索隐藏的值 加载登录页面时,会生成JSSessionID和唯一的RRP编号,并在提交时发布 我已经创建了下面的脚本,从登录页面收集唯一的数字并提交数据,但它只显示登录页面。。。 谁能帮帮我,告诉我我错过了什么 <?php //set var $ch = curl_init(); $url = "w

L.S

我有一些开发技能,但我对php curl还不熟悉。 我正在尝试创建一个php脚本,在没有任何用户交互的情况下登录intraship页面

我使用fiddler来确定发布的值,并在登录表单中搜索隐藏的值

加载登录页面时,会生成JSSessionID和唯一的RRP编号,并在提交时发布

我已经创建了下面的脚本,从登录页面收集唯一的数字并提交数据,但它只显示登录页面。。。 谁能帮帮我,告诉我我错过了什么

<?php
//set var
$ch = curl_init();
$url = "www.intraship-dhl.nl/intraship/jsp/SessionCtrl.jsp";
$jTFName = "foobar";
$jPFPassword = "foo";
$jCBLanguage = "NL";
$jsstate = "false";
$jCBLanguage = "NL";
$jBtnSendLogin = "1";
$cookie = "C:/wamp/www/dhl.txt";

//start with curl
$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "X11; U; Linux x86_64; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt ($ch, CURLOPT_REFERER, $url); 
$output = curl_exec($ch);
//echo $output;

//start processing output to determine jsessionid, URL and RRP
$jsessionid_sub = array();
$var1 = preg_match('/jsessionid=(.*?)\?/s', $output, $jsessionid_sub);
$jsessionid = ($jsessionid_sub[1]);
//print_r($jsessionid_sub[1]);
$URL_sub = array ();
$var2 = preg_match('/URL=(.*?)\&/s', $output, $URL_sub);
$URL = ($URL_sub[1]);
//print_r($URL_sub[1]);
$RRP_sub = array();
$var3 = preg_match('/RRP=(.*?)\"/s', $output, $RRP_sub);
$RRP = ($RRP_sub[1]);
//print_r($RRP_sub[1]);

//continue post the data and collect the result page 

$postdata = "jBtnSendLogin=1&jBtnOK=Login&jTFName=".$jTFName."&jPFPassword=".$jPFPassword."&jsessionid=".$jsessionid."&RRP=".$RRP."&URL=".$URL."&jsstate=".$jsstate."&jCBLanguage=".$jCBLanguage."&jBtnSendLogin=".$jBtnSendLogin."&jBtnRefreshPage=1";
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch); 
echo $result;  
curl_close($ch);
?>
在第一个请求之后执行curl\u close,否则curl将不会将cookie保存到文件中。这就是为什么你会一次又一次地看到登录页面

curl_close($ch);
现在为第二篇文章打开一个新的curl会话:

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
// and the other options you might add from previous request, just add here!

这应该适合您。

好的,在做了更多的研究之后,我有以下代码,只是它生成了一个空页面

谁能告诉我我错过了什么

<?php
$ch = curl_init();
$url="http://www.intraship-dhl.nl/intraship/jsp/SessionCtrl.jsp";
$cookie = "C:/wamp/www/cookie.txt";

curl_setopt_array(
    $ch, array( 
    CURLOPT_URL => $url,
    CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEFILE => $cookie,
    CURLOPT_COOKIEJAR => $cookie
));

$output = curl_exec($ch);
//echo $output;

$post_sub = array();
$var1 = preg_match('/LoginCtrl.jsp;(.*?)\" class/s', $output, $post_sub);
$post = ($post_sub[1]);

$jTFName = "foobar";
$jPFPassword = "foo";
$jsstate = "true";
$jCBLanguage = "NL";
$jBtnSendLogin = "1";
$postData = "jsstate=".$jsstate."&jTFName=".$jTFName."&jPFPassword=".$jPFPassword."&jCBLanguage=".$jCBLanguage."&jBtnSendLogin=".$jBtnSendLogin;
$url2 = $url.$post;
$c = curl_init();
curl_setopt_array(
    $c, array( 
    CURLOPT_URL => $url2,
    CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEFILE => $cookie,
    CURLOPT_COOKIEJAR => $cookie,
    CURLOPT_POSTFIELDS => $postData,
    CURLOPT_POST => true
));
$result = curl_exec($c);
echo $result;

?>

很难说清楚,但我注意到在第二次通话中,您将会话id发布为post数据,我很确定事实并非如此,没有任何网站将会话id作为post数据,它们通常位于HTML请求头中。您正在使用fiddler来正确确定发布了哪些会话和cookie值,以及哪些是请求头的一部分,我相信一旦您有了正确的值,它就会正常工作。嘿,Sumit,form=see的post操作意味着jsessionid不是post数据的一部分,这是要获取的URL的一部分。@user3187831如果您已经尝试了我发布的建议,请更新描述中的代码。尝试过,没有工作类型的响应将不会帮助您获得答案!如果你真的想得到答案,你必须提供尽可能多的信息!!!