我遇到了一段时间后出现的问题,检查汽车是否有有效的MOT并通过gov.uk网站征税,我会很感激其他人看到我做错了什么。
我似乎无法弄明白。这个确切的代码曾经起作用,但该网站最近稍有改变,这使得它完全停止了工作。
我用这个来自动检查我的员工的汽车是否已征税和MOT,有很多员工,这可能会成为手动背面检查的痛苦。
所以基本上我登录https://vehicleenquiry.service.gov.uk/ConfirmVehicle发送汽车注册表和Confirm_True然后从https://vehicleenquiry.service.gov.uk/ViewVehicle页面获取结果
但它现在突然停止了工作。
提前感谢您的任何帮助/建议。
<?
$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>";
}
?>
答案 0 :(得分:0)
我正在检查您的代码,在我的本地环境中,我做了以下更改:
一开始:
<php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$fields_string = '';
fields_string
(避免警告)。错误消息为ON,我看到我必须安装PHP-CURL
库。
安装完成后,我会从网址获得响应,例如:
'(function(){ var securemsg; var dosl7_common; window [“bobcmn”] =“1011200000002200000001300000021application / x-www-form-urlencoded3000000081d015909300000008TSPD_101300000011%2fConfirmVehicle300000000300000006 / TSPD / 300000008TSPD_101300000005https30000001fVrm = ND17 + PXK&amp; Corre'... (长度= 27391)
然后,我看到你这样做了:
$value = explode("value=\"", $result);
$value = explode("\"", $value[1]);
但是在数组位置$ value [1]没有结果,你应该做 $ value [0] 。
然后,通过此更改,您可以跟踪开发,处理返回的信息并知道您的错误在哪里。
希望它有所帮助!
答案 1 :(得分:0)
您需要某些Cookie来访问结果,这些Cookie是由您在尝试访问https://vehicleenquiry.service.gov.uk/ConfirmVehicle时没有任何Cookie时获得的高度复杂且有意混淆的javascript生成和设置的,看起来有点像喜欢
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
},
虽然可以在PHP中重新实现该算法,并从HTML中提取数据(实际上,看起来像vehicleenquiry.service.gov.uk/ConfirmVehicle开发人员自己在javascript和in中实现了算法ASP.net用于验证目的),它几乎肯定不值得麻烦,将javascript提供给javascript引擎可能要容易得多,并获取document.cookie
javascript变量,并将其输入到CURLOPT_COOKIE。至于使用哪个javascript引擎,你可能能够使用PHP编写的javascript解释器(如https://github.com/jakubkulhan/js2php),但是afaik,到目前为止还没有功能完备的PHP JS引擎,所以你可能会需要使用外部/非php javascript引擎,例如Google's V8 javascript engine。