account = $account; } /** * @param bool $debug * @return Actions */ public function setDebug($debug) { $this->debug = $debug; return $this; } /** * @param int $verbose * @return Actions */ public function setVerbose($verbose) { $this->verbose = $verbose; return $this; } /** * @param $action * @param Crawler $crawler * @return bool|int */ private function addPageDebug($action, Crawler $crawler) { if ($this->debug !== false) { return file_put_contents(sprintf('%s/%s-%s.html', $this->debug, date('YmdHi'), $action), $crawler->html()); } return true; } /** * Check if connected, if not, try to connect you * * @see Account#isConnected * * @return bool */ public function connect() { if (!$this->account->isConnected()) { // Let's connect to your account (or not) $crawler = $this->account->getClient()->request('GET', self::LOGIN_URL); $this->addPageDebug('connect', $crawler); $form = $crawler->selectButton('Se connecter')->form(); $crawler = $this->account->getClient()->submit($form, ['st_username' => $this->account->getConfig()->login, 'st_passwd' => $this->account->getConfig()->password]); $this->addPageDebug('checkIsConnected', $crawler); $this->account->setConnected($crawler->filter('.account_userinfo')->count() > 0); } return $this->account->isConnected(); } /** * Retrieve all deals from the current account * * @return Deals */ public function retrieve() { if ($this->connect()) { // Let's go to our dashboard $crawler = $this->account->getClient()->request('GET', self::ACCOUNT_URL); $this->addPageDebug('retrieve', $crawler); // Let's list our existing deals $deals = $crawler->filter('#dashboard .list .element')->each( function (Crawler $node) { return $node->filter('.detail .title')->each( function (Crawler $n) { return $n->filter('a')->first()->attr('href'); } ); } ); // Let's flatten that array $deals = array_map('current', $deals); return (new Deals())->setAccount($this->account)->setDeals($deals); } // Let's return empty deals container return (new Deals())->setAccount($this->account); } /** * Create the given deal in the account * * @param Deal $deal * * @return bool */ public function create(Deal $deal) { try { $crawler = $this->account->getClient()->request('GET', self::ADD_URL); $this->addPageDebug('add-form', $crawler); $form = $crawler->selectButton('Valider')->form(); $path = $deal->getPath(); if (empty($path)) { $path = sprintf('%s/%s', DEALS_DIR, $deal->getId()); } $images = []; $i = 0; foreach (new \DirectoryIterator($path) as $file) { if ($file->isFile() && $file->getExtension() === 'jpg') { $images['image'.$i] = $file->getRealPath(); $i++; } } $fields = $form->getPhpValues(); $fields = array_merge( $fields, [ 'geo_source' => 'user', 'geo_provider' => 'lbc', 'latitude' => '49.0707', 'longitude' => '2.31882', 'accept_localisation' => 'on', 'check_type_diff' => '0', 'location_p' => sprintf('%s %s', $this->account->getConfig()->city, $this->account->getConfig()->postal_code), 'zipcode' => $this->account->getConfig()->postal_code, 'city' => $this->account->getConfig()->city, 'region' => $this->account->getConfig()->region, 'dpt_code' => $this->account->getConfig()->department, 'address' => $this->account->getConfig()->address, 'name' => $this->account->getConfig()->name, 'email' => $this->account->getConfig()->login, 'phone' => $this->account->getConfig()->phone, 'category' => $deal->getCategory(), 'type' => $deal->getType(), 'subject' => $deal->getSubject(), 'body' => $deal->getBody(), 'price' => $deal->getPrice(), 'no_salesmen' => 1, 'phone_hidden' => 1, ] ); $uri = $form->getUri(); // It needs to be done twice !! $crawler = $this->account->getClient()->request('POST', $uri, $fields, $images); $this->addPageDebug('add-1', $crawler); $crawler = $this->account->getClient()->request('POST', $uri, $fields, $images); $this->addPageDebug('add-2', $crawler); // TODO need to check if we're in the good page // Let's validate $form = $crawler->selectButton('Valider mon annonce')->form(); $crawler = $this->account->getClient()->submit($form, ['accept_rule' => 1]); $this->addPageDebug('add-validation', $crawler); // TODO return if it's the validation page or not return true; } catch (\Exception $e) { // TODO manage exceptions echo $e->getTraceAsString(); return false; } } /** * Delete the deal from the account * * @param Deal $deal * * @return bool */ public function delete(Deal $deal) { $fields = [ sprintf('selected_ads[%s]', $deal->getId()) => 'on', 'cmd' => 'delete', 'continue' => 'Continuer' ]; $crawler = $this->account->getClient()->request('POST', self::DELETE_URL, $fields); $this->addPageDebug('delete', $crawler); // check s'il y a un bouton "Valider", s'il y en a pas c'est que la demande a déjà été faite $node = $crawler->filterXPath('//input[@value="Valider"]'); if ($node->count() == 1) { // confirmation $form = $crawler->selectButton('Valider')->form(); $crawler = $this->account->getClient()->submit($form, ['delete_reason' => '1']); // TODO return if it's the validation page or not $this->addPageDebug('delete-validation', $crawler); } return true; } }