在新标签中打开第二个卷曲(第一个保持打开状态)

时间:2014-04-27 10:21:37

标签: php iframe curl

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

在浏览器中,同样的事情发生了 - 当我打开面板页面并在新标签页中打开post.aspx时,没有直接访问权限。但是当我向curl发送login.aspx并且curl post.aspx之前没有关闭它时,我该如何处理卷曲?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我发现如何做到这一点,但另一个问题出现了。 这是可以打开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的内容时,我得到一个错误页面,表示表单不完整.. 任何帮助请....