diff --git a/.gitignore b/.gitignore index 6600fc5..6fb421f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ /composer.lock /vendor/ /.idea/ -/deals/lbcreposter.ini -/deals/*/ \ No newline at end of file +/data/config/lbcreposter.ini +/data/deals/*/ +data/logs/*.html diff --git a/deals/lbcreposter.ini.dev b/data/config/lbcreposter.ini.dev similarity index 100% rename from deals/lbcreposter.ini.dev rename to data/config/lbcreposter.ini.dev diff --git a/data/logs/.gitkeep b/data/logs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/library/Account.php b/library/Account.php index d905888..14dd49c 100644 --- a/library/Account.php +++ b/library/Account.php @@ -2,7 +2,7 @@ namespace Shikiryu\LBCReposter; -use Goutte\Client; +use GuzzleHttp\Client; class Account { @@ -20,22 +20,19 @@ class Account */ public function __construct(Config $config) { - $this->client = new \Goutte\Client(); - $this->client->setClient( - new \GuzzleHttp\Client([ - 'timeout' => 90, - 'verify' => false, - 'curl' => [ - CURLOPT_TIMEOUT => 60, - CURLOPT_TIMEOUT_MS => 60, - CURLOPT_CONNECTTIMEOUT => 60, - ], - 'headers' => [ - 'User-Agent' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0', - ], - ]) - ); - $this->client->setMaxRedirects(10); + $this->client = new Client([ + 'timeout' => 90, + 'verify' => false, + 'curl' => [ + CURLOPT_TIMEOUT => 60, + CURLOPT_TIMEOUT_MS => 60, + CURLOPT_CONNECTTIMEOUT => 60, + CURLOPT_COOKIEJAR => tmpfile(), + ], + 'headers' => [ + 'User-Agent' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0', + ], + ]); $this->config = $config; } @@ -64,8 +61,8 @@ class Account public function isConnected() { if (!$this->is_connected) { - $crawler = $this->client->request('GET', Actions::HOME_URL); - $this->is_connected = $crawler->filter('#account_logout')->count() == 1; +// $crawler = $this->client->request('GET', Actions::HOME_URL); +// $this->is_connected = $crawler->filter('#account_logout')->count() == 1; } return $this->is_connected; } diff --git a/library/Actions.php b/library/Actions.php index 9ab6a75..612324d 100644 --- a/library/Actions.php +++ b/library/Actions.php @@ -2,17 +2,22 @@ namespace Shikiryu\LBCReposter; +use GuzzleHttp\Exception\GuzzleException; use Symfony\Component\DomCrawler\Crawler; class Actions { const HOME_URL = 'https://www.leboncoin.fr/'; - const LOGIN_URL = 'https://www.leboncoin.fr/beta/ajax/popins/connexion.html'; const ACCOUNT_URL = 'https://compteperso.leboncoin.fr/account/index.html'; const ADD_URL = 'https://www.leboncoin.fr/ai/form/0'; const DELETE_URL = 'https://compteperso.leboncoin.fr/store/main?cmd=adservices'; const UPLOAD_URL = 'https://www.leboncoin.fr/ai/photo_upload_ajax/0'; + const API_LOGIN_URL = 'https://api.leboncoin.fr/api/oauth/v1/token'; + const API_DEAL_RETRIEVE_URL = 'https://api.leboncoin.fr/api/dashboard/v1/search'; + const API_PROFILE_URL = 'https://api.leboncoin.fr/api/accounts/v1/accounts/me/personaldata'; + const API_STATUS_URL = 'https://api.leboncoin.fr/api/dashboard/v1/kyc_status/me'; + const VERBOSE_INFO = 1; const VERBOSE_PAGE = 2; const VERBOSE_REQUEST = 4; @@ -21,6 +26,8 @@ class Actions protected $debug = false; protected $verbose = self::VERBOSE_INFO; + protected $access_token; + /** * @var Account */ @@ -80,12 +87,34 @@ class Actions { 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); + try { + $crawler = $this->account->getClient()->request('POST', self::API_LOGIN_URL, [ + 'form_params' => [ + 'client_id' => 'frontweb', + 'grant_type' => 'password', + 'password' => $this->account->getConfig()->password, + 'username' => $this->account->getConfig()->login + ] + ]); + $response = json_decode($crawler->getBody()->getContents()); + $this->access_token = $response->access_token; + } catch (GuzzleException $e) { + $this->account->setConnected(false); + } + try { + $crawler = $this->account->getClient()->request('GET', self::API_STATUS_URL, + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => sprintf('Bearer %s', $this->access_token) + ] + ] + ); + $response = json_decode($crawler->getBody()->getContents()); + $this->account->setConnected($response->status === 1); + } catch (GuzzleException $e) { + $this->account->setConnected(false); + } } return $this->account->isConnected(); } @@ -99,7 +128,40 @@ class Actions { if ($this->connect()) { // Let's go to our dashboard - $crawler = $this->account->getClient()->request('GET', self::ACCOUNT_URL); + $search_params = [ + 'context' => 'default', + 'filters' => [ + 'owner' => [ + 'store_id' => '' + ] + ], + 'limit' => '5', + 'offset' => '0', + 'sort_by' => 'date', + 'sort_order' => 'desc', + ]; + var_dump($search_params); + var_dump( $this->access_token ); + try { + $crawler = $this->account->getClient()->request('POST', self::API_DEAL_RETRIEVE_URL, + [ + 'headers' => [ + 'Accept' => 'application/json', + 'Content-Type' => 'application/json', +// 'api_key' => self::API_KEY, + 'Authorization' => sprintf('Bearer %s', $this->access_token), + ], + 'body' => json_encode($search_params), + 'debug' => true, + ] + ); + $response = json_decode($crawler->getBody()->getContents()); + var_dump($response); exit; + $this->account->setConnected($response->status === 1); + } catch (GuzzleException $e) { + echo $e->getMessage() . ' - '.$e->getTraceAsString(); exit; + $this->account->setConnected(false); + } $this->addPageDebug('retrieve', $crawler); // Let's list our existing deals $deals = $crawler->filter('#dashboard .list .element')->each( diff --git a/library/User.php b/library/User.php new file mode 100644 index 0000000..72a9cd4 --- /dev/null +++ b/library/User.php @@ -0,0 +1,38 @@ +storeId = $storeId; + $this->userId = $userId; + } + + /** + * @return mixed + */ + public function getStoreId() + { + return $this->storeId; + } + + /** + * @return mixed + */ + public function getUserId() + { + return $this->userId; + } + + +} \ No newline at end of file