cURL和ASP.NET:post参数问题

时间:2014-10-27 15:25:35

标签: php asp.net curl

我们有一个搜索引擎在asp.net中编程。 我设法卷曲个人结果,因为他们有或多或少的直接链接,我可以预测和卷曲。 但是我没有设法卷曲结果列表,这是它的工作原理:

在搜索页面上,我们必须通过复选框菜单选择要搜索的数据库。 一旦我检查了我要搜索的数据库,我点击"搜索"按钮将我转到搜索页面,并考虑选择的数据库。

如果我尝试使用直接链接转到搜索页面,它不起作用,因为它不知道搜索将在哪个数据库中。 我试着用Firebug查看post参数,我得到了以下内容:

Checkbox_db1  on
__EVENTARGUMENT
__EVENTTARGET LinkButtonCategory
__VIEWSTATE zeyhbf5vg41g6a4f1ezragf136er46ga4gfv658a4r6g4 (something looking like that but longer)

以下是我在卷曲中尝试的内容:

$ch = curl_init();
$fields = array ('Checkbox_db1' => 'on', '__EVENTARGUMENT' => '', 
                 '__EVENTTARGET' => 'LinkButtonCategory', '__VIEWSTATE' => '');
$postvars = '';
foreach($fields as $key=>$value)
{
    $postvars .= $key.'='.$value.'&';
}
rtrim ($postvars, '&');

curl_setopt ($ch, CURLOPT_URL, "monsite.com/choosedb.aspx");
curl_setopt ($ch, CURLOPT_POST, count($fields));
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postvars);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

$output1 = curl_exec($ch);

$fields2 = array ('TxtBox1' => 'value1', 'Txtbox2' => 'value2', '__EVENTARGUMENT' => '',
                 '__EVENTTARGET' => '', '__VIEWSTATE' => '');
$postvars = '';
foreach($fields2 as $key=>$value)
{
    $postvars .= $key.'='.$value.'&';
}
rtrim ($postvars, '&');

curl_setopt ($ch, CURLOPT_URL, "monsite.com/search.aspx");
curl_setopt ($ch, CURLOPT_POST, count($fields2));
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postvars);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

$output2 = curl_exec($ch);

但当然这不起作用....问题是我对ASP.NET不熟悉:/ 有人可以帮忙吗?提前致谢

1 个答案:

答案 0 :(得分:0)

所以首先你得到一个定期卷曲的初始页面。

然后你必须提取VIEWSTATE参数:

$regexViewstate = '/__VIEWSTATE\" value=\"(.*)\"/i';

function regexExtract($text, $regex, $regs, $nthValue)
{
if (preg_match($regex, $text, $regs)) {
 $result = $regs[$nthValue];
}
else {
 $result = "";
}
return $result;
}

$viewstate = regexExtract($data,$regexViewstate,$regs,1);

你编造新帖子:

$postData = '__EVENTARGUMENT=&__EVENTTARGET=LinkButtonCategory&__VIEWSTATE=';
$postData .= rawurlencode($viewstate).'&TxtBox1=value1&TxtBox2=value2';

curl_setOpt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_URL, $urlLogin);   
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);     

$output = curl_exec($ch);