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

时间:2018-05-06 11:08:38

标签: php curl

我遇到了一段时间后出现的问题,检查汽车是否有有效的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>";
}
?>

2 个答案:

答案 0 :(得分:0)

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

一开始:

<php

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

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