Ejemplo n.º 1
0
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $licence = $input->getArgument('licence');
     $center = $input->getArgument('center');
     $filterDate = $input->getOption('filter');
     $mail = $input->getOption('mail');
     $client = new Client();
     $crawler = $client->request('GET', 'https://driverpracticaltest.direct.gov.uk/application');
     $output->writeln('Step 1');
     $form = $crawler->selectButton('testTypeCar')->form();
     $crawler = $client->submit($form);
     $output->writeln('Step 2');
     $form = $crawler->selectButton('drivingLicenceSubmit')->form();
     $form->setValues(['driverLicenceNumber' => $licence, 'extendedTest' => 'false', 'specialNeeds' => 'false']);
     $crawler = $client->submit($form);
     $output->writeln('Step 3');
     $form = $crawler->selectButton('testCentreSubmit')->form();
     $form->setValues(['testCentreName' => $center]);
     $crawler = $client->submit($form);
     $output->writeln('Step 4');
     $link = $crawler->filter('.test-centre-results > li > a')->first()->link();
     $crawler = $client->click($link);
     $output->writeln('Step 5');
     $button = $crawler->selectButton('drivingLicenceSubmit');
     if ($button->count() == 0) {
         $output->writeln('Captcha!');
         //TODO: display captcha image and ask to solve? Use decaptcha?
         return;
     }
     $form = $button->form();
     $date = (new \DateTime())->format('d/m/y');
     $form->setValues(['preferredTestDate' => $date]);
     $crawler = $client->submit($form);
     $output->writeln('Step 6');
     $slots = $crawler->filter('.slotDateTime');
     $dates = $slots->each(function ($node, $i) use($output) {
         return $node->text();
     });
     if ($filterDate) {
         $filter = new DateFilter();
         $dates = $filter->filterDates($dates, $filterDate);
     }
     foreach ($dates as $date) {
         $output->writeln($date);
     }
     if (count($dates) && $mail) {
         $mailer = new DateMailer();
         $mailer->mail($mail, $dates);
     }
 }