php-cURL登录到jsp网站并返回HTML


php cURL log into jsp website and return HTML

我正在尝试使用cURL登录jsp/tomcat网站(我们称之为https://unknown.com出于隐私原因),并从页面返回HTML。我观察了firebug中的Net面板和Firecookie中的cookie面板,以概述手册的以下步骤:

  1. 打开web根目录-https://unknown.com
  2. 已重定向至https://unknown.com/common/frames.jsp-创建的Cookie:JSESSIONID
  3. 填写j_username和j_password
  4. 将"j_username=user&j_password=pass&submit=logon"张贴到https://unknown.com/common/j_security_check
  5. 重定向至https://unknown.com/common/frames.jsp
  6. 用户从要返回的HTML所在的主页中选择链接

因此,基本上我对cURL没有太多经验,也没有太多运气,我真的只需要从了解cURL登录网站和访问目的地页面所需的步骤开始。

编辑:这是我的代码:

//user login information
$username = "user";
$password = "pass";
$postData = "j_username=".$username."&j_password=".$password."&logon=submit";
$cookie_file = "/tmp/curl_cookies.txt";
//$fp = fopen($cookie_file, "w");
//fclose($fp);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://unknown.com/common/j_security_check');
curl_setopt($ch, CURLOPT_POSTFIELDS,$postData);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_REFERER, "https://unknown.com/common/Frames.jsp");
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://unknown.com/claritymatch/ClarityBatchViewer.jsp?id=123');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
echo $data;

当我第一次运行.php文件时,它不起作用,但第二次它会显示目标HTML——我怎么能让它只显示第一次呢?此外,由于我将JSESSIONID cookie存储在上面指出的文件中,我是否会遇到会话id不更改的问题,或者会根据需要进行更改?

以下是针对您的情况的一些建议。。。

  • 为简便起见,请重新使用相同的卷曲手柄
    这减少了对每个请求重复选项的需要。一开始就设定你的大部分选项,并且只做一次。我主要指cookie选项、用户代理、关注位置等。
    然后,您可以为每个单独的请求设置URL和请求方法
    您甚至可以通过在请求中添加Keep-Alive标头来获得额外的性能,这样,如果远程服务器支持它,那么同一连接将用于发出多个请求,而不必每次都重新连接。

  • CURLOPT_FOLLOWLOCATION设置为true并从头开始
    试着完全按照你看到的浏览器的操作。也就是说,请求网络根;如果网站将您重定向到安全检查URL,cURL将遵循该重定向并捕获在此过程中设置的任何cookie。如果发送重定向,一个cURL请求可能会导致多个HTTP请求。然后继续"填写"登录表格。

  • 使用http_build_query()获取发布数据
    设置post字符串的方式没有错,但数据必须是url编码的。将http_build_query()与数组一起使用更容易操作,并且会产生一个url编码的字符串,您可以直接将其提供给cURL。

另请参阅我几天前为一个试图做类似事情的人发布的这个答案。我还发布了一些其他答案的参考,其中包含使用cURL请求多个URL的完整示例;只要看看这些答案就可以帮助你了解如何做你想做的事。尤其是看到这个答案,这是我提到的帖子中的第一个参考,因为它展示了如何通过发出几个帖子请求并最终发出一个get请求来登录谷歌。