PHP 帮助从提交的表单请求信息

问题描述 投票:0回答:2

我在不久前创建的一些东西上遇到了麻烦,该东西通过 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 curl
2个回答
0
投票

我正在检查您的代码,并在我的本地环境中进行了以下更改:

一开始:

<php

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

$fields_string = '';
  • 添加了 php 标签以避免可能的错误,添加了错误报告以允许我更好地调试并声明
    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]

然后,通过这些更改,您可以跟踪开发,处理返回的信息并知道错误在哪里。

希望有帮助!


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 引擎

© www.soinside.com 2019 - 2024. All rights reserved.