PHP帮助从提交的表单中请求信息
我遇到了一些问题,这是前一段时间创建的,通过gov.uk网站检查一辆车是否有有效的MOT和税收,我希望其他人能看到我做错了什么 我就是想不出来。这个确切的代码过去是可以工作的,但最近该网站发生了轻微的变化,从而完全停止了它的工作 我用它来自动检查我的员工的汽车是否被征税和不征税,因为有很多员工,这可能会成为一个痛苦的背面手动检查 因此,基本上我登录发送汽车注册和确认_真然后从页面抓取结果 但现在它突然停止了工作 提前感谢您的帮助/建议PHP帮助从提交的表单中请求信息,php,curl,Php,Curl,我遇到了一些问题,这是前一段时间创建的,通过gov.uk网站检查一辆车是否有有效的MOT和税收,我希望其他人能看到我做错了什么 我就是想不出来。这个确切的代码过去是可以工作的,但最近该网站发生了轻微的变化,从而完全停止了它的工作 我用它来自动检查我的员工的汽车是否被征税和不征税,因为有很多员工,这可能会成为一个痛苦的背面手动检查 因此,基本上我登录发送汽车注册和确认_真然后从页面抓取结果 但现在它突然停止了工作 提前感谢您的帮助/建议 <? $Vrm = "ND17 PXK";
<?
$Vrm = "ND17 PXK";
$url = 'https://vehicleenquiry.service.gov.uk/ConfirmVehicle';
$fields = array(
'Vrm' => urlencode($Vrm),
'Correct_True' => urlencode("True")
);
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
$value = explode("value=\"", $result);
$value = explode("\"", $value[1]);
$url = 'https://vehicleenquiry.service.gov.uk/ViewVehicle';
$fields = array(
'Vrm' => urlencode($Vrm),
'viewstate' => urlencode($value[0])
);
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument();
@$res=$dom->loadHTML($result);
$xpath = new DomXPath($dom);
$class = 'isInvalid';
$divs = $xpath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $class ')]");
if ( !$divs ) { echo "issue"; }
foreach($divs as $div)
{
$dateSplit = explode(":", $div->nodeValue);
echo $dateSplit[0] . " " . $dateSplit[1] . " ";
$date1 = new DateTime(date(d) . " " . date ( M ) . " " . date( Y ));
$date2 = new DateTime($dateSplit[1]);
if ( $date1 > $date2 ) $exp = "Expired";
else $exp = "Valid for another";
$diff = $date2->diff($date1)->format("%a");
echo $exp . " " . $diff . "<BR><BR>";
}
$class = 'isValid';
$divs = $xpath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $class ')]");
if ( !$divs ) { echo "issue"; }
foreach($divs as $div)
{
$dateSplit = explode(":", $div->nodeValue);
echo $dateSplit[0] . "<BR>" . $dateSplit[1] . "<BR>";
$date1 = new DateTime(date(d) . " " . date ( M ) . " " . date( Y ));
$date2 = new DateTime($dateSplit[1]);
$diff = $date2->diff($date1)->format("%a");
if ( $date1 > $date2 ) $exp = "Expired";
else $exp = "Valid for another";
echo $exp . " " . $diff . "<BR><BR>";
}
?>
我正在检查您的代码,并在本地环境中进行了以下更改:
一开始:
<php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$fields_string = '';
但是在数组位置$value[1]中没有结果,您应该执行$value[0]
然后,通过这些更改,您可以跟踪开发,处理返回的信息,并知道错误在哪里
希望有帮助 您需要特定的cookies来访问结果,这些cookies是由一个高度复杂的、故意混淆的javascript片段生成和设置的,当您尝试在没有任何cookies的情况下访问时,会获得该片段,看起来有点像
securemsg = {
IlS: function(S) {
return securemsg[L(28897)](securemsg._j((_(713), 0), S, _(104) ? 1 : 0), function() {
return String[I(185, 197, 194, 192, 150, 187, 180, 197, 150, 194, 183, 184)](Math[L(26206011)](Math[L(1650473734)]() * (_(160) ? 256 : 270) + (_(39) ? 1 : 0)) % (_(905) ? 331 : 256))
})[L(918239)]("")
},
s_: function(S) {
return ((S & (_(163) ? 255 : 361)) << (_(968) ? 33 : 24) | (S & (_(383) ? 65280 : 62377)) << (_(767) ? 5 : 8) | S >> (_(79) ? 8 : 4) & (_(301) ? 65280 : 33117) | S >> (_(635) ? 17 : 24) & (_(366) ? 255 : 291)) >>> (_(803), 0)
},
L5: function(S, J) {
for (var l = "", O = (_(206), 0); O <
S[L(1294399205)]; O++) l += String["\u0066ro\x6dCh\u0061rC\x6fde"](S[I(182, 187, 180, 197, 150, 194, 183, 184, 148, 199)]((O + S[L(1294399205)] - J) % S[L(1294399205)]));
return l
},
securemsg={
IlS:功能{
返回securemsg[L(28897)](securemsg.j((713),0),S,104?1:0,function(){
返回字符串[I(185197194192150187180197150194183184)](Math[L(26206011)](Math[L(1650473734)]()*(160?256:270)+(39?1:0))%(905?331:256))
})[L(918239)](“”)
},
s:功能{
返回((S&((u(163)?255:361))((u(79)?8:4)和((u(301)?65280:33117)S>>((u(635)?17:24)和((u(366)?255:291))>>((u(803),0)
},
L5:功能(S,J){
对于(var l=”,O=((u(206),0);O<
S[L(1294399205)];O++)L++=String[“\u0066ro\x6dCh\u0061rC\x6fde”](S[I(182187180197150194183184148199)]((O+S[L(1294399205)]-J)%S[L(1294399205)];
返回l
},
虽然可以在PHP中重新实现该算法,并从HTML中提取数据(实际上,出于验证目的,vehicleenquiry.service.gov.uk/ConfirmVehicle devs自己在javascript和ASP.net中实现了该算法),这几乎肯定不值得这么麻烦,只需将javascript提供给javascript引擎,并获取document.cookie
javascript变量,然后将其提供给CURLOPT_cookie,可能会容易得多。至于要使用哪种javascript引擎,您可以使用PHP编写的javascript解释器(如),但恕我直言,目前还没有功能完整的PHP JS引擎,因此您可能需要使用外部/非PHP javascript引擎。“停止工作”发生了什么?应该发生什么?页面是否中断,结果是否不好?如果我们不知道问题的原因,则无法确定问题的原因。您的PHP版本是否支持短开放标记?它确实支持“似乎我现在没有收到结果”,这就是问题所在。那么,如果您执行var\u dump($result),您会得到什么
这将显示返回的内容。www.smiledb.co.uk/output.txt-因此基本上有很多我没有预料到的东西,虽然底部说JavaScript没有启用,但我不确定他们以前是否启用过,我想,Anks会再次查看asapThanks以获得您的帮助,在这两个页面上仍然会收到相同的错误消息,我想k他们已经添加了一些保护,所以如果访问者没有启用javascript,那么它将无法工作。我必须重新考虑一下这个问题,我认为这仍然是一种非常糟糕的不可靠的获取viewstate的方法。do$value=(@DOMDocument::loadHTML($result))->getElementById(“viewstate”)->getAttribute(“value”);
相反。更可靠的是,一旦他们放入另一个输入标记(因此不再是[1],可能是[2]),或者如果他们删除了1(因此变成[0]而不是[1]),或者如果它包含任何html实体,explode()DOMDocument将不会为您解码html实体。如果您的分解代码在value
和=
之间留出一个空格,例如value=“foo”
,或value=“foo”
,或value=“foo”
,则它们甚至会中断。
securemsg = {
IlS: function(S) {
return securemsg[L(28897)](securemsg._j((_(713), 0), S, _(104) ? 1 : 0), function() {
return String[I(185, 197, 194, 192, 150, 187, 180, 197, 150, 194, 183, 184)](Math[L(26206011)](Math[L(1650473734)]() * (_(160) ? 256 : 270) + (_(39) ? 1 : 0)) % (_(905) ? 331 : 256))
})[L(918239)]("")
},
s_: function(S) {
return ((S & (_(163) ? 255 : 361)) << (_(968) ? 33 : 24) | (S & (_(383) ? 65280 : 62377)) << (_(767) ? 5 : 8) | S >> (_(79) ? 8 : 4) & (_(301) ? 65280 : 33117) | S >> (_(635) ? 17 : 24) & (_(366) ? 255 : 291)) >>> (_(803), 0)
},
L5: function(S, J) {
for (var l = "", O = (_(206), 0); O <
S[L(1294399205)]; O++) l += String["\u0066ro\x6dCh\u0061rC\x6fde"](S[I(182, 187, 180, 197, 150, 194, 183, 184, 148, 199)]((O + S[L(1294399205)] - J) % S[L(1294399205)]));
return l
},