63 lines
2.0 KiB
PHP
63 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Parser;
|
|
|
|
use App\ParsedHome;
|
|
use App\Parser;
|
|
|
|
class Pap extends Parser
|
|
{
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function parse(): ParsedHome
|
|
{
|
|
$idAnnonce = $this->getIdAnnonceFromUrl($this->url);
|
|
$url = sprintf('https://ws.pap.fr/immobilier/annonces/%s', (int)$idAnnonce);
|
|
$request = $this->client->get(
|
|
$url,
|
|
[
|
|
'headers' => [
|
|
'X-Device-Gsf' => '36049adaf18ade77',
|
|
'User-Agent' => 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; D5803 Build/MOB30M.Z1)',
|
|
'Connection' => 'Keep-Alive',
|
|
'Accept-Encoding' => 'gzip'
|
|
],
|
|
]
|
|
);
|
|
$annonce = json_decode($request->getBody()->getContents(), true);
|
|
|
|
$parsedHome = new ParsedHome();
|
|
$parsedHome->city = $annonce['_embedded']['place'][0]['title'];
|
|
//ex: Vente maison 110 m² Tréguier (22220)
|
|
$parsedHome->title = sprintf(
|
|
'%s %s %s m² %s',
|
|
ucfirst($annonce['produit']),
|
|
$annonce['typebien'],
|
|
$annonce['surface'],
|
|
$parsedHome->city
|
|
);
|
|
$parsedHome->price = $annonce['prix'];
|
|
$parsedHome->surface = $annonce['surface'];
|
|
$parsedHome->rooms = $annonce['nb_pieces'];
|
|
$parsedHome->energy = $annonce['classe_energie'];
|
|
$parsedHome->description = $annonce['texte'];
|
|
$parsedHome->pictures = collect(
|
|
$annonce['_embedded']['photo']
|
|
)->map(static function ($photo) {
|
|
return $photo['_links']['self']['href'];
|
|
});
|
|
$location = $annonce['marker'];
|
|
|
|
$parsedHome->map = ['lat' => $location['lat'], 'lng' => $location['lng']];
|
|
|
|
return $parsedHome;
|
|
}
|
|
|
|
private function getIdAnnonceFromUrl($url)
|
|
{
|
|
//ex: https://www.pap.fr/annonces/maison-treguier-22220-r432301732
|
|
return substr(collect(explode('-', collect(array_filter(explode('/', $url)))->last()))->last(), 1);
|
|
}
|
|
}
|