client = $client; $this->config = $config; } /** * @return Client */ public function getClient() { return $this->client; } /** * Check if it's connected * (if there's a "logout" link) * * @return bool */ public function isConnected() { if (!$this->is_connected) { $crawler = $this->client->request('GET', self::HOME_URL); $this->is_connected = $crawler->filter('#account_logout')->count() == 1; } return $this->is_connected; } /** * Check if connected, if not, try to connect you * * @see this#isConnected * * @return bool */ public function connect() { if (!$this->isConnected()) { // $t = date('YmdHis'); // $log_folder = sprintf('%s/logs/%s', APP_DIR, $t); // mkdir($log_folder); $crawler = $this->client->request('GET', self::LOGIN_URL); // file_put_contents(sprintf('%s/connect.html', $log_folder), $crawler->html()); $form = $crawler->selectButton('Se connecter')->form(); $crawler = $this->client->submit($form, ['st_username' => $this->config->login, 'st_passwd' => $this->config->password]); // file_put_contents(sprintf('%s/connected.html', $log_folder), $crawler->html()); $this->is_connected = $crawler->filter('.account_userinfo')->count() > 0; } return $this->is_connected; } /** * Retrieve all deals from the current account * * @return Deals */ public function getDeals() { if ($this->connect()) { $crawler = $this->client->request('GET', self::ACCOUNT_URL); $deals = $crawler->filter('#dashboard .list .element')->each( function ($node) { return $node->filter('.detail .title')->each( function ($n) { return $n->filter('a')->first()->attr('href'); } ); } ); $deals = array_map('current', $deals); return (new Deals())->setAccount($this)->setDeals($deals); } return (new Deals())->setAccount($this); } public function addDeal(Deal $deal) { try { $t = date('YmdHis'); $log_folder = sprintf('%s/logs/%s', APP_DIR, $t); mkdir($log_folder); $crawler = $this->client->request('GET', self::ADD_URL); file_put_contents(sprintf('%s/add.html', $log_folder), $crawler->html()); $form = $crawler->selectButton('Valider')->form(); $image0 = fopen(sprintf('%s/%s/image0.jpg', DEALS_DIR, $deal->getId()), 'r'); $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->config->city, $this->config->postal_code), 'zipcode' => $this->config->postal_code, 'city' => $this->config->city, 'region' => $this->config->region, 'dpt_code' => $this->config->department, 'address' => $this->config->address, 'name' => $this->config->name, 'email' => $this->config->login, 'phone' => $this->config->phone, 'category' => $deal->getCategory(), 'type' => $deal->getType(), 'subject' => $deal->getSubject(), 'body' => $deal->getBody(), 'price' => $deal->getPrice(), 'image0' => $image0, 'no_salesmen' => 1, 'phone_hidden' => 1, ] ); $uri = self::UPLOAD_URL; $this->client->request('POST', $uri, $fields, [], ['Content-Type => multipart/form-data']); $uri = $form->getUri(); // It needs to be done twice $this->client->request('POST', $uri, $fields, [], ['Content-Type => multipart/form-data']); $crawler = $this->client->request('POST', $uri, $fields, [], ['Content-Type => multipart/form-data']); // This one doesn't wor either -> redirect to Home file_put_contents(sprintf('%s/add-2.html', $log_folder), $crawler->html()); $form = $crawler->selectButton('Valider mon annonce')->form(); $crawler = $this->client->submit($form, ['accept_rule' => 1]); } catch (\Exception $e) { echo $e->getTraceAsString(); } } public function delete(Deal $deal) { $fields = [ sprintf('selected_ads[%s]', $deal->getId()) => 'on', 'cmd' => 'delete', 'continue' => 'Continuer' ]; $crawler = $this->client->request('POST', self::DELETE_URL, $fields); // confirmation $form = $crawler->selectButton('Valider')->form(); $crawler = $this->client->submit($form, ['delete_reason' => '1']); } }