Справка PHP для запроса информации из отправленных форм

У меня возникли проблемы с некоторыми вещами, которые были созданы некоторое время назад, которые проверяют, есть ли у автомобиля действующее ТО и налог через сайт 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>";
}
?>

"Перестал работать", что происходит? Что должно было произойти вместо этого? Страница ломается, плохие результаты? Невозможно установить причину проблемы, если мы не знаем ее. Поддерживает ли ваша версия PHP короткие открытые теги? <?

James 06.05.2018 13:10

он поддерживает <? да, похоже, я не могу понять, почему он вообще перестал работать, кажется, теперь я не получаю никаких результатов

Ryan Patterson 06.05.2018 13:26

"Кажется, теперь я не получаю никаких результатов" вот в чем проблема. Итак, что вы получите, если сделаете var_dump($result);. Это покажет, что возвращается.

James 06.05.2018 13:28

www.smiledb.co.uk/output.txt - так что в основном куча вещей, которых я не ожидал, хотя внизу написано, что JavaScript не включен, но я не уверен, было ли у них когда-либо это раньше.

Ryan Patterson 06.05.2018 13:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
119
2

Ответы 2

Я проверял ваш код и в своей локальной среде внес следующие изменения:

В начале:

<php

error_reporting(E_ALL);
ini_set('display_errors', 1);

$fields_string = '';
  • Добавлен тег php, чтобы избежать возможных ошибок, добавлен отчет об ошибках, чтобы я мог лучше отлаживать и объявлен 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].

Затем, с этими изменениями, вы сможете следить за разработкой, обрабатывать возвращенную информацию и знать, в чем заключаются ваши ошибки.

Надеюсь, поможет!

Спасибо, посмотрю как можно скорее

Ryan Patterson 06.05.2018 13:58

Еще раз спасибо за вашу помощь, все еще появляется одно и то же сообщение об ошибке на обеих страницах, я думаю, что они добавили некоторую защиту, поэтому, если у посетителя не включен javascript, он не будет работать. Мне нужно подумать об этом, я думаю

Ryan Patterson 06.05.2018 16:34

это все еще супер дерьмовый ненадежный способ получить состояние просмотра. сделайте $value = (@DOMDocument::loadHTML($result))->getElementById("viewstate‌​")->getAttribute("va‌​lue"); вместо этого. гораздо более надежен, ваш код разнесения сломается, как только они поместят другой входной тег (так что он больше не [1], возможно, [2]), или если они удалят 1 (так что он станет [0] вместо [1]), или если он включает какие-либо объекты html, explode () не будет декодировать объекты html за вас, а DOMDocument будет. ваш код взрыва даже сломается, если они поместят пробел между value и =, например, value = "foo", или value= "foo", или value = "foo".

hanshenrik 07.05.2018 09:52

вам требуются определенные файлы 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.

Другие вопросы по теме