Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP帮助从提交的表单中请求信息_Php_Curl - Fatal编程技术网

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

PHP帮助从提交的表单中请求信息,php,curl,Php,Curl,我遇到了一些问题,这是前一段时间创建的,通过gov.uk网站检查一辆车是否有有效的MOT和税收,我希望其他人能看到我做错了什么 我就是想不出来。这个确切的代码过去是可以工作的,但最近该网站发生了轻微的变化,从而完全停止了它的工作 我用它来自动检查我的员工的汽车是否被征税和不征税,因为有很多员工,这可能会成为一个痛苦的背面手动检查 因此,基本上我登录发送汽车注册和确认_真然后从页面抓取结果 但现在它突然停止了工作 提前感谢您的帮助/建议 <? $Vrm = "ND17 PXK";

我遇到了一些问题,这是前一段时间创建的,通过gov.uk网站检查一辆车是否有有效的MOT和税收,我希望其他人能看到我做错了什么

我就是想不出来。这个确切的代码过去是可以工作的,但最近该网站发生了轻微的变化,从而完全停止了它的工作

我用它来自动检查我的员工的汽车是否被征税和不征税,因为有很多员工,这可能会成为一个痛苦的背面手动检查

因此,基本上我登录发送汽车注册和确认_真然后从页面抓取结果

但现在它突然停止了工作

提前感谢您的帮助/建议

    <?
$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 = '';
但是在数组位置$value[1]中没有结果,您应该执行$value[0]

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


希望有帮助

您需要特定的cookies来访问结果,这些cookies是由一个高度复杂的、故意混淆的javascript片段生成和设置的,当您尝试在没有任何cookies的情况下访问时,会获得该片段,看起来有点像

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
        },
securemsg={
IlS:功能{
返回securemsg[L(28897)](securemsg.j((713),0),S,104?1:0,function(){
返回字符串[I(185197194192150187180197150194183184)](Math[L(26206011)](Math[L(1650473734)]()*(160?256:270)+(39?1:0))%(905?331:256))
})[L(918239)](“”)
},
s:功能{
返回((S&((u(163)?255:361))((u(79)?8:4)和((u(301)?65280:33117)S>>((u(635)?17:24)和((u(366)?255:291))>>((u(803),0)
},
L5:功能(S,J){
对于(var l=”,O=((u(206),0);O<
S[L(1294399205)];O++)L++=String[“\u0066ro\x6dCh\u0061rC\x6fde”](S[I(182187180197150194183184148199)]((O+S[L(1294399205)]-J)%S[L(1294399205)];
返回l
},

虽然可以在PHP中重新实现该算法,并从HTML中提取数据(实际上,出于验证目的,vehicleenquiry.service.gov.uk/ConfirmVehicle devs自己在javascript和ASP.net中实现了该算法),这几乎肯定不值得这么麻烦,只需将javascript提供给javascript引擎,并获取
document.cookie
javascript变量,然后将其提供给CURLOPT_cookie,可能会容易得多。至于要使用哪种javascript引擎,您可以使用PHP编写的javascript解释器(如),但恕我直言,目前还没有功能完整的PHP JS引擎,因此您可能需要使用外部/非PHP javascript引擎。

“停止工作”发生了什么?应该发生什么?页面是否中断,结果是否不好?如果我们不知道问题的原因,则无法确定问题的原因。您的PHP版本是否支持短开放标记?
它确实支持“似乎我现在没有收到结果”,这就是问题所在。那么,如果您执行
var\u dump($result),您会得到什么
这将显示返回的内容。www.smiledb.co.uk/output.txt-因此基本上有很多我没有预料到的东西,虽然底部说JavaScript没有启用,但我不确定他们以前是否启用过,我想,Anks会再次查看asapThanks以获得您的帮助,在这两个页面上仍然会收到相同的错误消息,我想k他们已经添加了一些保护,所以如果访问者没有启用javascript,那么它将无法工作。我必须重新考虑一下这个问题,我认为这仍然是一种非常糟糕的不可靠的获取viewstate的方法。do
$value=(@DOMDocument::loadHTML($result))->getElementById(“viewstate”)->getAttribute(“value”);
相反。更可靠的是,一旦他们放入另一个输入标记(因此不再是[1],可能是[2]),或者如果他们删除了1(因此变成[0]而不是[1]),或者如果它包含任何html实体,explode()DOMDocument将不会为您解码html实体。如果您的分解代码在
value
=
之间留出一个空格,例如
value=“foo”
,或
value=“foo”
,或
value=“foo”
,则它们甚至会中断。
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
        },