PHP卷曲:是的框没有滴答作响

时间:2017-07-06 13:16:55

标签: php curl

真的很挣扎。一些帮助将不胜感激,我已经花了一个小时今天,我觉得我已经打了一堵砖墙..

这个完全相同的代码工作完美,但是我假设服务稍微更新了一些代码,因为它现在不能正常工作,它可能只是简单的东西,但我似乎不能再让它工作了无法找到更新,以阻止它工作。

此代码基本上访问一个页面以检查汽车运动/税收状态,一旦您访问该页面,您必须在下一页上单击是,这是我现在卡住的地方,但是用于完成每个工作的代码时间,提前感谢任何帮助人员。

<?
$Vrm = "KS09 FSV";

$url = 'https://vehicleenquiry.service.gov.uk/ConfirmVehicle';
$fields = array(
    'Vrm' => urlencode($Vrm),
    'Correct' => 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 = 'isUntaxed';
$divs = $xpath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $class ')]");

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 . " days ago<BR><BR>";
}

$class = 'isValidMot';
$divs = $xpath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $class ')]");

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 . " days ago<BR><BR>";
}?>

1 个答案:

答案 0 :(得分:0)

新答案

根据以下评论,您需要从两个请求中取消注释以下行:

curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);

政府网站已更改存储过期数据的元素的类名,因此,而不是isUntaxedisValidMot,两个div现在都具有类isValid

作为旁注,您在今天的日期创建DateTime对象,您可以使用以下内容:

$date1 = new DateTime(date('d M Y'));

更短,不会产生警告,例如

  

注意:使用未定义的常量d - 假设为'd'

原始答案

查看您的代码和网站,您要发送第一个网址'Correct' => urlencode("True") Ctrl+Alt+Delete,而需要将其提交到第二个网址{{3} })。

如果您在浏览器中手动转到https://vehicleenquiry.service.gov.uk/ConfirmVehicle,您将看到第一页上只需要注册号。提交完毕后,您需要在下一页上提交复选框。