打开secound卷曲像在新标签(第一个保持打开)


open secound curl like in new tab (first one stay open)

我想用curl填充一个表单,它加载在登录后出现的面板页面中的iframe中。我已经使用curl登录并获取面板页面的内容,但无法为iframe设置javascript以显示post.aspx。当我尝试直接加载post.aspx时,我会得到一个重定向。

在浏览器中,同样的事情也会发生——当我打开一个面板页面并在一个新的选项卡中打开post.aspx时,没有直接访问exept。但当我向login.aspx发送curl,而对于post.aspx,在curl之前没有关闭它时,我如何使用curl来做到这一点?

由于它是一个ASP.net应用程序,它很可能在您的登录上设置了几个cookie,例如ASP.net会话id。您需要从初始登录请求中获取cookie值,并在每个新请求中发送这些值,才能继续登录该应用程序。您还需要查看post页面是否需要通过您提到的JavaScript设置的任何参数,并在curl请求中手动提供这些参数。

然而,不使用curl可能更容易,而是使用web驱动程序来运行浏览器来为您执行请求,例如phantomjs或脚本化的webkit实例。

我找到了如何做到这一点,但另一个问题出现了。这是打开post.aspx页面并保持面板页面(default.aspx)打开的方法,这是我的代码:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/$rand.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/$rand.txt');
curl_setopt($ch, CURLOPT_URL, "http://blogfa.com/Desktop/Login.aspx");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=".$viewstate."&__EVENTVALIDATION=".$eventvalidation."&master%24ContentPlaceHolder1%24Uid=".$user."&master%24ContentPlaceHolder1%24Password=".$pass."&master%24ContentPlaceHolder1%24btnSubmit=%D9%88%D8%B1%D9%88%D8%AF+%D8%A8%D9%87+%D8%A8%D8%AE%D8%B4+%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA"); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
$Cpanel = curl_exec($ch);;
preg_match_all( '#<a href'="Post'.aspx'?t'=(.*?)" target#', $Cpanel, $seasonid);
$res = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, "http://blogfa.com/Desktop/Post.aspx?t=".$seasonid[1][0]);
curl_setopt($ch, CURLOPT_POST, 0);
$res = curl_exec($ch);
preg_match_all( '#id="__VIEWSTATE" value="(.*?)" />#', $res, $poststate))
$postviewstate = urlencode($poststate[1][0]);
preg_match_all( '#id="__EVENTVALIDATION" value="(.*?)" />#', $res, $postvalidation);
$posteventvalidation = urlencode($postvalidation[1][0]);
preg_match_all( '#<input name="txtDay" type="text" value="(.*?)" maxlength="2" id="txtDay" title#', $res, $day);
preg_match_all( '#<input name="txtMonth" type="text" value="(.*?)" maxlength="2" id="txtMonth"#', $res, $Month);
preg_match_all( '#<input name="txtYear" type="text" value="(.*?)" maxlength="4" id="txtYear"#', $res, $Year);
preg_match_all( '#<input name="txtMinute" type="text" value="(.*?)" maxlength="2" id="txtMinute"#', $res, $Minute);
preg_match_all( '#<input name="txtHour" type="text" value="(.*?)" maxlength="2" id="txtHour"#', $res, $Hour);
// send  post
$res = curl_exec($ch);         
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/$rand.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/$rand.txt');
curl_setopt($ch, CURLOPT_URL, "http://blogfa.com/Desktop/Post.aspx?t=".$seasonid[1][0]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "__VIEWSTATE=".$postviewstate."&__EVENTVALIDATION=".$posteventvalidation."&hasextended=false&txtTitle=".$posttitle."&txtContent=".$postcontent."%3Cbr+%2F%3E%3Cp%3E%0D%0A%0D%0A%3C%2Fp%3E&txtExtended=&btnPublish=%D8%AB%D8%A8%D8%AA+%D9%85%D8%B7%D9%84%D8%A8+%D9%88+%D8%A8%D8%A7%D8%B2%D8%B3%D8%A7%D8%B2%DB%8C+%D9%88%D8%A8%D9%84%D8%A7%DA%AF&txtTags=".$posttags."&cmbCommentType=9&txtDay=".$day[1][0]."&txtMonth=".$Month[1][0]."&txtYear=".$Year[1][0]."&txtMinute=".$Minute[1][0]."&txtHour=".$Hour[1][0]."&chkAutomateTime=on&txtPostPW=");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
$posted = curl_exec($ch);

这是一个新问题:每次加载post.aspx时,都会有一个新的验证和状态。所以在我的代码中,我首先打开post.aspx,获得验证、状态和日期值,然后制作一个标题并发布它,我想当我尝试发布时,它在一个新的post.aspx中,并有一个新验证和状态,这是错误的。当我回显$posted的内容时,我会收到一个错误页面,上面写着表单不完整。。有什么帮助吗。。。。