我在不久前创建的一些东西上遇到了麻烦,该东西通过 gov.uk 网站检查汽车是否具有有效的 MOT 和税款,我希望其他人能够关注它,看看我做错了什么。
我似乎无法弄清楚。这个确切的代码曾经可以工作,但该网站最近发生了轻微的变化,这使它完全停止工作。
我用它来自动检查我员工的汽车是否被征税和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>";
}
?>
我正在检查您的代码,并在我的本地环境中进行了以下更改:
一开始:
<php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$fields_string = '';
fields_string
(避免警告)。随着错误消息的出现,我发现我必须安装
PHP-CURL
库。
安装后,我会从 URL 收到响应,例如:
'(函数(){ var securemsg; var dosl7_common;窗口[“bobcmn”] =“1011200000002200000001300000021application/x-www-form-urlencoded3000000081d015909300000008TSPD_101300000011%2fConfirmVehicle300000000300000006/TSPD /300000008TSPD_101300000005https30000001fVrm=ND17+PXK&Corre'... (长度=27391)
然后,我看到你在这样做:
$value = explode("value=\"", $result);
$value = explode("\"", $value[1]);
但是在数组位置$value[1]没有结果,你应该做$value[0]。
然后,通过这些更改,您可以跟踪开发,处理返回的信息并知道错误在哪里。
希望有帮助!
您需要某些 cookie 才能访问结果,这些 cookie 是由您在尝试访问时获得的一段高度复杂且故意混淆的 JavaScript 生成和设置的 https://vehicleenquiry.service.gov.uk/ConfirmVehicle没有任何饼干,看起来有点像
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 和 ASP 中都实现了该算法。 net 以进行验证),这几乎肯定不值得这么麻烦,将 javascript 提供给 javascript 引擎,并获取
document.cookie
javascript 变量,并将其提供给 CURLOPT_COOKIE 可能会容易得多。至于使用哪个 javascript 引擎,您可能可以使用用 PHP 编写的 javascript 解释器(例如 https://github.com/jakubkulhan/js2php ),但是据我所知,没有功能完整的 PHP迄今为止的 JS 引擎,因此您可能需要使用外部/非 php javascript 引擎,例如 Google 的 V8 javascript 引擎。