У меня возникли проблемы с некоторыми вещами, которые были созданы некоторое время назад, которые проверяют, есть ли у автомобиля действующее ТО и налог через сайт gov.uk, я был бы признателен, чтобы другие посмотрели на него, чтобы увидеть, что я делаю не так.
Я просто не могу этого понять. Этот точный код раньше работал, но сайт недавно был немного изменен, что полностью остановило его работу.
Я использую это, чтобы автоматически проверять, облагаются ли автомобили моих сотрудников налогами и проходят ТО, при большом количестве сотрудников это может стать проблемой при проверке задних сторон вручную.
Итак, в основном я вхожу в 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>";
}
?>
он поддерживает <? да, похоже, я не могу понять, почему он вообще перестал работать, кажется, теперь я не получаю никаких результатов
"Кажется, теперь я не получаю никаких результатов" вот в чем проблема. Итак, что вы получите, если сделаете var_dump($result);. Это покажет, что возвращается.
www.smiledb.co.uk/output.txt - так что в основном куча вещей, которых я не ожидал, хотя внизу написано, что JavaScript не включен, но я не уверен, было ли у них когда-либо это раньше.






Я проверял ваш код и в своей локальной среде внес следующие изменения:
В начале:
<php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$fields_string = '';
fields_string (избегать предупреждений).Когда появилось сообщение об ошибке, я увидел, что мне нужно установить библиотеку PHP-CURL.
После установки у меня есть отклик из URL-адреса, например:
' (function(){ var securemsg; var dosl7_common; window["bobcmn"] = "1011200000002200000001300000021application/x-www-form-urlencoded3000000081d015909300000008TSPD_101300000011%2fConfirmVehicle300000000300000006/TSPD/300000008TSPD_101300000005https30000001fVrm=ND17+PXK&Corre'... (length=27391)
Затем я увидел, что вы делаете это:
$value = explode("value=\"", $result);
$value = explode("\"", $value[1]);
Но в позиции массива $ value [1] результатов нет, надо сделать $ значение [0].
Затем, с этими изменениями, вы сможете следить за разработкой, обрабатывать возвращенную информацию и знать, в чем заключаются ваши ошибки.
Надеюсь, поможет!
Спасибо, посмотрю как можно скорее
Еще раз спасибо за вашу помощь, все еще появляется одно и то же сообщение об ошибке на обеих страницах, я думаю, что они добавили некоторую защиту, поэтому, если у посетителя не включен javascript, он не будет работать. Мне нужно подумать об этом, я думаю
это все еще супер дерьмовый ненадежный способ получить состояние просмотра. сделайте $value = (@DOMDocument::loadHTML($result))->getElementById("viewstate")->getAttribute("value"); вместо этого. гораздо более надежен, ваш код разнесения сломается, как только они поместят другой входной тег (так что он больше не [1], возможно, [2]), или если они удалят 1 (так что он станет [0] вместо [1]), или если он включает какие-либо объекты html, explode () не будет декодировать объекты html за вас, а DOMDocument будет. ваш код взрыва даже сломается, если они поместят пробел между value и =, например, value = "foo", или value= "foo", или value = "foo".
вам требуются определенные файлы cookie для доступа к результатам, эти файлы cookie создаются и устанавливаются очень сложным и намеренно запутанным фрагментом javascript, который вы получаете, когда пытаетесь получить доступ к https://vehicleenquiry.service.gov.uk/ConfirmVehicle без каких-либо файлов cookie, что немного похоже на
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, получить переменную javascript document.cookie и передать ее CURLOPT_COOKIE. Что касается того, какой движок javascript использовать, вы можете обойтись с помощью интерпретатора javascript, написанного на PHP (например, https://github.com/jakubkulhan/js2php), но, черт возьми, на сегодняшний день нет полнофункциональных движков PHP JS, поэтому вам может потребоваться внешний / не-php движок javascript, например Механизм JavaScript V8 от Google.
"Перестал работать", что происходит? Что должно было произойти вместо этого? Страница ломается, плохие результаты? Невозможно установить причину проблемы, если мы не знаем ее. Поддерживает ли ваша версия PHP короткие открытые теги?
<?