Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php [Dead]如何利用异步回发成功发布到旧ASP.NET站点_Php_Javascript_Asp.net_Curl_Updatepanel - Fatal编程技术网

Php [Dead]如何利用异步回发成功发布到旧ASP.NET站点

Php [Dead]如何利用异步回发成功发布到旧ASP.NET站点,php,javascript,asp.net,curl,updatepanel,Php,Javascript,Asp.net,Curl,Updatepanel,[更新]不幸的是,我从来没有机会解决这个问题。然而,下面有一些有趣的回答值得其他读者尝试一下 我正在尝试解析来自运行ASP.NET的站点的数据。这个站点有一个登录页面,我已经成功地遍历了该页面(使用合法帐户)并为其存储了cookie,但是当我深入该站点时,我需要通过异步回发更新UpdatePanel来导航它。UpdatePanel包含我想要的数据 我正在尝试使用PHP和curl来完成这一切。我可以成功加载初始页面。当我将所有相关数据(通过Firefox的篡改数据插件获得)发布到目标页面时,cur

[更新]不幸的是,我从来没有机会解决这个问题。然而,下面有一些有趣的回答值得其他读者尝试一下

我正在尝试解析来自运行ASP.NET的站点的数据。这个站点有一个登录页面,我已经成功地遍历了该页面(使用合法帐户)并为其存储了cookie,但是当我深入该站点时,我需要通过异步回发更新UpdatePanel来导航它。UpdatePanel包含我想要的数据

我正在尝试使用PHP和curl来完成这一切。我可以成功加载初始页面。当我将所有相关数据(通过Firefox的篡改数据插件获得)发布到目标页面时,curl返回的回显结果总是会清除我的页面。通常情况下,回显结果只需打印(或输出一些错误/乱码文本)到页面下方。curl_error()没有打印任何内容,因此返回给我的内容有问题

我不知道如何从这里开始。请告诉我,如果:a)你知道我遇到了什么错误,b)如果这在纯PHP中是可能的,以及c)相反,如果我需要删除javascript来与ASP.NET的UpdatePanel交互,请告诉我

$uri = "TARGETURL";
$cl=curl_init();
curl_setopt($cl, CURLOPT_URL, $uri);
curl_setopt($cl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0');
curl_setopt($cl, CURLOPT_COOKIEFILE, "/tmp/cookie2.txt");
curl_setopt($cl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cl, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($cl, CURLOPT_POST, 1);
$postdata=array(

    "__VIEWSTATE" => $viewstate,
    "OTHER DATA" => "asdfkljsddflkjshdjf",
    "__ASYNCPOST" => "true",
);
echo "<PRE>";
print_r($postdata);
echo "</PRE>";
curl_setopt ($cl, CURLOPT_POSTFIELDS, $postdata);
$result = curl_exec($cl); // execute the curl command
echo $result;
$uri=“TARGETURL”;
$cl=curl_init();
curl_setopt($cl,CURLOPT_URL,$uri);
curl_setopt($cl,CURLOPT_USERAGENT,'Mozilla/5.0(windowsnt 6.1;WOW64;rv:5.0)Gecko/20100101 Firefox/5.0');
curl_setopt($cl,CURLOPT_COOKIEFILE,“/tmp/cookie2.txt”);
curl_setopt($cl,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($cl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($cl,CURLOPT_CONNECTTIMEOUT,0);
卷曲设置($cl,卷曲设置桩,1);
$postdata=数组(
“_VIEWSTATE”=>$VIEWSTATE,
“其他数据”=>“asdfkljsddflkjshdjf”,
“\uuu ASYNCPOST”=>“true”,
);
回声“;
打印(postdata);
回声“;
curl_setopt($cl,CURLOPT_POSTFIELDS,$postdata);
$result=curl_exec($cl);//执行curl命令
回声$结果;
以下是我从服务器收到的标题和正文(通过电子邮件发送给我自己以绕过echo语句中发生的页面清除):

标题响应:
HTTP/1.1 100继续
HTTP/1.1200ok
缓存控制:没有缓存
Pragma:没有缓存
内容类型:文本/纯文本;字符集=utf-8
过期:-1
服务器:Microsoft IIS/7.5
X-Content-Type-Options:nosniff
设置Cookie:culture=en-US;expires=周二,2012年11月27日20:02:37格林威治标准时间;路径=/
X-Powered-By:ASP.NET日期:2011年11月28日星期一20:02:37 GMT
内容长度:112
身体反应:
69 | dataItem | | window.location=“about:blank”| 11 | pageRedirect | | |/Error.aspx|

这就解释了页面变为空白时出现的问题(javascript重定向浏览器输出)。它似乎还表明头不是问题所在,因为我会从错误的头值中得到一个HTTP错误。

另一种方法是使用非常有用的PHP工具(一个模拟浏览器行为的类),完成所有工作以跟踪所有字段,通过单击链接或按钮执行post/get

链接如下:


A.您在请求中声明您是Firefox浏览器:

curl_setopt($cl,CURLOPT_USERAGENT,'Mozilla/5.0(windowsnt 6.1;WOW64;rv:5.0)Gecko/20100101 Firefox/5.0')

不要声称自己是Firefox:

  • 如果您无法处理脚本(就像Firefox一样)
  • 如果要阻止ASP.NET向您发送部分呈现响应
创建自己的用户代理名称,或者根本不发送它

ASP.NET检查用户代理是否支持回调:


B.不要发送
\uu ASYNCPOST=true
(试试看)。

我对php和curl没有任何线索,但如果我理解正确,您正在尝试将信息发送到ASP页面。问题可能是页面激活了
CausesValidation
选项。因此,服务器不允许向该页面发送外部帖子。

这里是一种适用于我的addapted方法:

    public function doPostbackToAspDotNetPage()
{
    $uri = '*** THE_URL ***';
    $cl = curl_init();
    curl_setopt($cl, CURLOPT_URL, $uri);
    curl_setopt($cl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:54.0) Gecko/20100101 Firefox/54.0');
    curl_setopt($cl, CURLOPT_COOKIESESSION, '*** OPTIONAL ***');
    curl_setopt($cl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($cl, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($cl, CURLOPT_POST, 1);

    // Just in case the url is https and the certification gives some kind of error
    curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, false);

    $postdata = array(
        '__EVENTTARGET' => '*** A value such as: SOME_ID$ctl20$ctl02 ***',
        '__EVENTARGUMENT' => ' *** OPTIONAL ***',
        "__VIEWSTATE" => '*** REQUIRED BUNCH OF CHARACTERS ***',
        "__ASYNCPOST" => "true",
        '__VIEWSTATEGENERATOR' => '*** OPTIONAL ***',
        '__EVENTVALIDATION' => "*** REQUIRED BUNCH OF CHARACTERS ***",

    );
    curl_setopt($cl, CURLOPT_POSTFIELDS, $postdata);

    $result = curl_exec($cl);
    if (!$result) {
        echo sprintf('ERROR:%s', PHP_EOL);
        echo curl_error($cl);
    } else {
        echo $result;
    }
    curl_close($cl);
}

只需调整ajax请求的数据并完全模拟它。目标url是什么?可能丢失了,如
\uuu EVENTTARGET
\uuu EVENTARGUMENT
为保密起见,已将其删除。与_EVENTTARGET和_EVENTARGUMENT相同(尽管我知道这两个参数是正确的)。但是,是的,因为它不是SSL,您可以使用Wireshark轻松地嗅探流量,并查看您不发送的请求或标头中的哪一行。。尽量模仿每一个字节。谢谢你的信息。我查看了Wireshark,决定可能需要投入大量时间。当我有机会的时候,我会回到那个话题上来。谢谢。可能是打开了一扇大门,但如果只是问你正在抓取的网站,问他们是否有API、RSS提要,或者甚至是生成的XML文件来访问你想要的数据,这难道不容易吗。
    public function doPostbackToAspDotNetPage()
{
    $uri = '*** THE_URL ***';
    $cl = curl_init();
    curl_setopt($cl, CURLOPT_URL, $uri);
    curl_setopt($cl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:54.0) Gecko/20100101 Firefox/54.0');
    curl_setopt($cl, CURLOPT_COOKIESESSION, '*** OPTIONAL ***');
    curl_setopt($cl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($cl, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($cl, CURLOPT_POST, 1);

    // Just in case the url is https and the certification gives some kind of error
    curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, false);

    $postdata = array(
        '__EVENTTARGET' => '*** A value such as: SOME_ID$ctl20$ctl02 ***',
        '__EVENTARGUMENT' => ' *** OPTIONAL ***',
        "__VIEWSTATE" => '*** REQUIRED BUNCH OF CHARACTERS ***',
        "__ASYNCPOST" => "true",
        '__VIEWSTATEGENERATOR' => '*** OPTIONAL ***',
        '__EVENTVALIDATION' => "*** REQUIRED BUNCH OF CHARACTERS ***",

    );
    curl_setopt($cl, CURLOPT_POSTFIELDS, $postdata);

    $result = curl_exec($cl);
    if (!$result) {
        echo sprintf('ERROR:%s', PHP_EOL);
        echo curl_error($cl);
    } else {
        echo $result;
    }
    curl_close($cl);
}