2020-07-23 12:26:10 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Parser;
|
|
|
|
|
|
|
|
use App\ParsedHome;
|
|
|
|
use App\Parser;
|
|
|
|
|
2020-07-23 16:20:27 +02:00
|
|
|
/**
|
|
|
|
* Thanks to https://github.com/axeleroy/untoitpourcaramel/issues/3
|
|
|
|
* Class SeLoger
|
|
|
|
* @package App\Parser
|
|
|
|
*/
|
2020-07-23 12:26:10 +02:00
|
|
|
class SeLoger extends Parser
|
|
|
|
{
|
2020-07-23 16:20:27 +02:00
|
|
|
public const TOKEN_URL = 'https://api-seloger.svc.groupe-seloger.com/api/v1/security/authenticate';
|
|
|
|
public const LISTING_URL = 'https://api-seloger.svc.groupe-seloger.com/api/v1/listings/';
|
|
|
|
public const SELOGER_TOKEN = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTZUxvZ2VyLW1vYmlsZSIsImFwcCI6IjYzZWU3MTRkLWE2MmEtNGEyNy05ZmJlLTQwYjdhMmMzMThlNCIsImlhdCI6MTUzOTQ0MjMyMCwianRpIjoiNWYzODRhNDYtZjk5MS00ODZkLWFkN2YtMmE2M2YxZTdkM2UwIiwiYXVkIjoiU2VMb2dlci1Nb2JpbGUtNi4wIn0.Qib13Y4395f_bi5Df0IhMQRvIxQZEfpf8Ac66oTfyiA';
|
|
|
|
public const SELOGER_GUID = '63ee714d-a62a-4a27-9fbe-40b7a2c318e4';
|
2020-07-23 12:26:10 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
public function parse(): ParsedHome
|
|
|
|
{
|
2020-07-23 16:20:27 +02:00
|
|
|
$token = $this->retrieveToken();
|
2020-07-23 12:26:10 +02:00
|
|
|
$idAnnonce = $this->getIdAnnonceFromUrl($this->url);
|
2020-07-23 16:20:27 +02:00
|
|
|
$url = sprintf('%s%s', self::LISTING_URL, $idAnnonce);
|
|
|
|
$request = $this->client->request(
|
|
|
|
'GET',
|
|
|
|
$url,
|
|
|
|
[
|
|
|
|
'headers' => [
|
|
|
|
'AppToken' => $token,
|
|
|
|
],
|
|
|
|
]
|
|
|
|
);
|
|
|
|
$annonce = json_decode($request->getBody()->getContents(), true);
|
|
|
|
|
|
|
|
$parsedHome = new ParsedHome();
|
|
|
|
$parsedHome->city = $annonce['city'];
|
|
|
|
//ex: Vente maison 110 m² Tréguier (22220)
|
|
|
|
$parsedHome->title = $annonce['title'];
|
|
|
|
$parsedHome->price = $annonce['price'];
|
|
|
|
$parsedHome->surface = $annonce['livingArea'];
|
|
|
|
$parsedHome->rooms = $annonce['rooms'];
|
|
|
|
$parsedHome->energy = $annonce['energy']['grade'];
|
|
|
|
$parsedHome->description = $annonce['description'];
|
|
|
|
$parsedHome->pictures = $annonce['photos'];
|
|
|
|
$location = $annonce['coordinates'];
|
|
|
|
$parsedHome->map = ['lat' => $location['latitude'], 'lng' => $location['longitude']];
|
|
|
|
|
|
|
|
return $parsedHome;
|
2020-07-23 12:26:10 +02:00
|
|
|
}
|
|
|
|
|
2020-07-23 16:20:27 +02:00
|
|
|
/**
|
|
|
|
* @param string $url
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
2020-07-23 12:26:10 +02:00
|
|
|
private function getIdAnnonceFromUrl($url)
|
|
|
|
{
|
|
|
|
// ex : https://www.seloger.com/annonces/achat/maison/franconville-95/vieux-marche-mare-des-noues/159100953.htm
|
2020-07-23 16:20:27 +02:00
|
|
|
$url = parse_url($url, PHP_URL_PATH);
|
2020-07-23 12:26:10 +02:00
|
|
|
return collect(explode('.', collect(explode('/', $url))->last()))->first();
|
|
|
|
}
|
2020-07-23 16:20:27 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
|
|
*/
|
|
|
|
private function retrieveToken()
|
|
|
|
{
|
|
|
|
$request = $this->client->request(
|
|
|
|
'GET',
|
|
|
|
self::TOKEN_URL,
|
|
|
|
[
|
|
|
|
'headers' => [
|
|
|
|
'AppToken' => self::SELOGER_TOKEN,
|
|
|
|
'AppGuid' => self::SELOGER_GUID,
|
|
|
|
],
|
|
|
|
]
|
|
|
|
);
|
|
|
|
|
|
|
|
return trim($request->getBody()->getContents(), '"');
|
|
|
|
}
|
2020-07-23 12:26:10 +02:00
|
|
|
}
|