Api для доступа к объявлениям с
Запросы для получения регионов
выполняются на адрес https://vhod-v-lichnyj-kabinet.ru/api/region методом GET.
Запросы для получения населенных пунктов
выполняются на адрес https://vhod-v-lichnyj-kabinet.ru/api/city методом GET.
Возможные параметры:
GET параметр | Обязательный | Описание |
---|---|---|
id | да | Идентификатор региона |
Запросы для получения объявлений
выполняются на адрес https://vhod-v-lichnyj-kabinet.ru/api/ads методом GET. За один запрос возвращается не больше 1000 объявлений.
Возможные параметры:
GET параметр | Обязательный | Описание |
---|---|---|
login | да | Логин пользователя в системе, e-mail |
token | да | Access token, используемый для авторизации. Выдается на этой странице в разделе “Подключение к API” |
category_id | да | Идентификатор категории, 0 – все категории |
region_id | нет | Идентификатор региона |
city_id | нет | Идентификатор города |
last_m | нет | Возможные значения: 1-30. Кол-во последних минут за который нужно вернуть результат (При использовании этого параметра, параметры date1 и date2 не учитываются) |
last_s | нет | Возможные значения: 1-60. Кол-во последних секунд за который нужно вернуть результат (При использовании этого параметра, параметры date1, date2 и last_m не учитываются) |
date1 | нет | Дата от в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС (пример: 2022-09-10 09:05:45 или 2022-09-10) |
date2 | нет | Дата до в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС (пример: 2022-09-10 09:10:45 или 2022-09-10) |
price1 | нет | Цена от |
price2 | нет | Цена до |
q | нет | Текст для поиска (по умолчанию ищет по заголовку) Замечание: Если вы используете спецсимволы, такие как пробел, вам нужно закодировать запрос при помощи urlencode(). |
in | нет (title) | Где искать значение q. Возможные значения: title, description |
phone | нет | Телефон в формате 8xxxYYYYYYY, по которому требуется фильтрация / поиск. Выводит объявления с этим телефоном. (минимум спишет 2 ед. с суточного лимита) https://i-find.pro – API для поиска по номеру |
pv | нет | Ищет значение в параметрах. Например: pv=Жёсткие диски Замечание: Категория должна быть выбрана. |
sort | нет (desc) | Сортировка по дате добавления в базу. Возможные значения: asc, desc |
limit | нет (1000) | Ограничение кол-ва, не может быть больше 1000 |
offset | нет (0) | Смещение |
format | нет (json) | Формат ответов. Возможные значения: json, xml, csv |
Примеры:
https://vhod-v-lichnyj-kabinet.ru/api/ads?login=ваш_логин&token=ваш_ключ&category_id=9
https://vhod-v-lichnyj-kabinet.ru/api/ads?login=ваш_логин&token=ваш_ключ&category_id=9&date1=2022-12-05 17:00:00&date2=2022-12-05 18:00:00
https://vhod-v-lichnyj-kabinet.ru/api/ads?login=ваш_логин&token=ваш_ключ&category_id=9&format=xml&limit=10
https://vhod-v-lichnyj-kabinet.ru/api/ads?login=ваш_логин&token=ваш_ключ&category_id=9&format=xml&last_m=5
Запрос для получения объявления по id
выполняются на адрес https://vhod-v-lichnyj-kabinet.ru/api/ad методом GET.
Возможные параметры:
Примеры:
https://vhod-v-lichnyj-kabinet.ru/api/ad?login=ваш_логин&token=ваш_ключ&id=685674499
Запрос для получения инфомации по аккаунту
выполняются на адрес https://vhod-v-lichnyj-kabinet.ru/api/info методом GET.
Возможные параметры:
Примеры:
https://vhod-v-lichnyj-kabinet.ru/api/info?login=ваш_логин&token=ваш_ключ
Пример ответа в формате JSON:
{ "status":"ok", "data":[ { "Id":"56021070", "url":"https://www.avito.ru/vichuga/avtomobili/vaz_2110_2001_709412481", "avito_id":"709412481", "title":"ВАЗ (LADA) 2110 1.5 МТ, 2001, седан", "price":"65000", "time":"2022-01-11 12:00:01", "operator":"Билайн", "phone":"89621652602", "name":"Роман", "region":"Ивановская область", "city":"Вичуга", "district":"", "address":"", "metro":"", "images":"http://46.img.avito.st/640x480/2182788746.jpg,http://08.img.avito.st/640x480/2182789008.jpg", "description":"Есть не большие рыжики,резина зима - лето,остальное по телефону!", "params":[ { "name":"Тип автомобиля", "value":"С пробегом" }, { "name":"Пробег, км", "value":"170 000 - 179 999" }, { "name":"Цвет", "value":"Серебряный" }, { "name":"Количество дверей", "value":"4" }, { "name":"Тип двигателя", "value":"Бензин" }, { "name":"Привод", "value":"Передний" }, { "name":"Руль", "value":"Левый" }, { "name":"Состояние", "value":"Не битый" }, { "name":"VIN-номер", "value":"XTA21102*20****65" }, { "name":"Мощность двигателя, л.с.", "value":"71" } ] }, { "Id": "68453128", "url": "https://www.avito.ru/kazan/kvartiry/4-k_kvartira_92_m_1118_et._725486559", "avito_id": "725486559", "title": "4-к квартира, 92 м², 11/18 эт.", "price": "30000", "time": "2022-02-09 17:22:45", "operator": "МТС", "phone": "89179369582", "name": "Арсен", "region": "Татарстан", "city": "Казань", "district": "", "address": "Академика Глушко ул, 8", "metro": "", "images": "http://22.img.avito.st/640x480/2237861422.jpg,http://02.img.avito.st/640x480/2237861002.jpg", "description": "Евроремонт. 3 изолированных и 1 проходная комната.", "params":[ { "name": "Тип объявления", "value": "Сдам" }, { "name": "Срок аренды" "value": "На длительный срок", }, { "name": "Комиссия", "value": "Нет" }, { "name": "Залог", "value": "Без залога" }, { "name": "Тип дома", "value": "Кирпичный" } ], "coords": { "lat": "55.779722", "lng": "49.236697" } } ] }
Пример ответа в формате XML:
<?xml version="1.0" encoding="UTF-8"?> <result> <status>ok</status> <data> <ad> <Id>56020970</Id> <url>https://www.avito.ru/sankt-peterburg/avtomobili/mitsubishi_pajero_2009_709412345</url> <avito_id>709412345</avito_id> <title>Mitsubishi Pajero 3.2 AT, 2009, внедорожник</title> <price>999000</price> <time>2022-01-11 11:59:50</time> <operator>Tele2</operator> <phone>89522151607</phone> <name>Владелец</name> <region>Санкт-Петербург</region> <city/> <district/> <address/> <metro>Площадь Мужества</metro> <images>http://89.img.avito.st/640x480/2182791389.jpg,http://69.img.avito.st/640x480/2182793369.jpg</images> <description>Максимальная комплектация.Покупали новым в ноябре 2009 года у оф.дилера Mitsubishi.</description> </ad> <ad> <Id>56020971</Id> <url>https://www.avito.ru/samara/avtomobili/vaz_vesta_2022_709412344</url> <avito_id>709412344</avito_id> <title>ВАЗ (LADA) Vesta 1.6 МТ, 2022, седан</title> <price>528000</price> <time>2022-01-11 11:59:50</time> <operator>Билайн</operator> <phone>89033014579</phone> <name>Андрей</name> <region>Самарская область</region> <city>Самара</city> <district/> <address/> <metro>Безымянка</metro> <images>http://91.img.avito.st/640x480/2182779891.jpg</images> <description>LADA Vesta стильная, стремительная, яркая - такая, каким и должен быть автомобиль LADA.</description> </ad> </data> </result>
Как использовать
API в основном предназначено для периодического к нему обращения, например, каждую минуту или 5 минут, и загрузки объявлений себе на сайт или CRM.
Пример на языке PHP (получение данных за последнюю минуту):
date_default_timezone_set('Europe/Moscow'); $login = 'user@mail.ru'; //здесь должен быть ваш логин в системе $token = 'df6fd21c885ec9c55737*********'; //здесь должен быть ваш token //делаем запрос к api $str = file_get_contents("https://rest-app.net/api/ads?login=".urlencode($login)."&token=".urlencode($token)."&category_id=9&last_m=1"); //парсим ответ как json $json = json_decode($str); //проходим по всем объявлениям foreach ($json->data as $ad) //$ad - объект объявления { //выводим: заголовок объявления, город, номер телефона echo $ad->title.';'.$ad->city.';'.$ad->phone; echo '<br/>'; }
Пример на языке PHP (получение данных за период):
date_default_timezone_set('Europe/Moscow'); $login = 'user@mail.ru'; //здесь должен быть ваш логин в системе $token = 'df6fd21c885ec9c55737*********'; //здесь должен быть ваш token //задаем время получаемых объявлений $date = new DateTime(); //текущее время $date1 = clone $date; //копируем объект даты $date1->modify("-32 minute"); //текущее минус 32 минуты $date2 = clone $date; //копируем объект даты $date2->modify("-31 minute"); //текущее минус 31 минуты //таким образом интервал $date1 и $date2 у нас будет 1 минута, теперь можно делать запрос //делаем запрос к api $str = file_get_contents("https://rest-app.net/api/ads?login=".urlencode($login)."&token=".urlencode($token)."&category_id=9" ."&date1=".urlencode($date1->format('Y-m-d H:i:s')) ."&date2=".urlencode($date2->format('Y-m-d H:i:s'))); //парсим ответ как json $json = json_decode($str); //проходим по всем объявлениям foreach ($json->data as $ad) //$ad - объект объявления { //выводим: заголовок объявления, город, номер телефона echo $ad->title.';'.$ad->city.';'.$ad->phone; echo '<br/>'; }
Скрипт можно запускать по расписанию для получения новых объявлений.
Запук каждые 5 минут, пример для crontab: */5 * * * * /path/to/php /path/to/script
или каждую минуту, пример для crontab: * * * * * /path/to/php /path/to/script
Для Windows можно использовать стандартный планировщик заданий
Получение данных за большой период или пагинация:
Если вам надо получить объявления, для примера, за неделю, и нужна пагинация, то для этого используйте временной интервал. Т.е. вместо пагинации вы запрашиваете объявления порциями по 5 минут или даже за минуту, используя параметры date1 (Дата от) и date2 (Дата до) для задания границ временного интервала. Только между запросами обязательно делайте задержку.
Пример на языке PHP (получение данных за большой период):
date_default_timezone_set('Europe/Moscow'); $token = '6159c82bcb4ec5************'; //токен (ключ) $login = 'user@mail.ru'; //логин #шаг $interval = " 1 hour"; #получение данных за период (с .. по ..) $date_start = new DateTime('2022-01-01'); $date_finish = new DateTime(); // текущее время $i=0; while($date_start<$date_finish){ $date1= clone $date_start; $date_start->modify($interval); if($date_start>$date_finish){ $date2= clone $date_finish; }else{ $date2= clone $date_start; } $str = get_data("https://rest-app.net/api/ads?login=".urlencode($login)."&token=".urlencode($token)."&category_id=24" ."&date1=".urlencode($date1->format('Y-m-d H:i:s')) ."&date2=".urlencode($date2->format('Y-m-d H:i:s'))."&limit=1000"); $arr=json_decode($str, true); if($arr['status']=='error'){ echo $arr['message']."n"; die; } if(!count($arr['data'])){ continue; } foreach($arr['data'] as $ad){ print_r($ad); //выводим объявления } sleep(2); } function get_data($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); return $output; }
Curl – капча – авито
Доброго времени суток! Ранее, при парсинге, у авито был немного другой алгоритм блокировки ip, при котором бан можно было обойти слипом на 6-8сек.
Но, иногда случалось, что бан все равно ловил. 20-30 мин пройдет и все ок .. Терпимо!
Сейчас,видимо, авито немного поменял алгоритм и бан чаще выскакивает . Но не бан создал сложность для меня, а выход из него .
Теперь нужно ввести капчу, чтобы выйти из бани. Капчу пытаться разгадывать сейчас не вижу смысла, т.к времени очень мало , а вот в ручную иногда ее писать – это нужно, т.к баня не часто возникает при парсинге.
Сложность : при открытии страницы блокировки через CURL капча не хочет отображаться (ошибка 403). Значит посылаться должен какой-то дополнительный параметр, чтобы её отобразить ..
Куки стоят.. Где копать ? За ранее спасибо !
function curl($url){
$ch = curl_init();
curl_setopt($ch,CURLOPT_COOKIEJAR,'./cookie.txt');
curl_setopt($ch,CURLOPT_COOKIEFILE,'./cookie.txt');
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_POST, true);
//curl_setopt($ch, CURLOPT_POSTFIELDS, "captcha=8дя1ц&yes");
curl_setopt($ch,CURLOPT_REFERER,"https://www.avito.ru");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36');
$page=curl_exec($ch);
curl_close($ch);
return $page;
}
$content=curl("https://www.avito.ru/blocked");
echo '<base href="https://www.avito.ru" />';
echo $content;
Curl авторизация на авито?
С помощью сниффера, самый удобный для HTTP – это Fiddler, но вообще способов отследить запросы – множество на разных уровнях, учите матчасть, самый простой сниффер сайтов пишется самостоятельно и имеет десять строк кода, а по эффективности в частных случаях лучше чем Fiddler.
2. Если я правильно понял, cURL должен будет сразу пройти по этой ссылке (с login и pass в ее составе)?
Да, но почему “сразу”, можно и подождать. 🙂 И понятия “пройти по ссылке” в нем нет, он работает на уровне HTTP-запросов в которых значим не только URL (ссылка), изучайте HTTP, а Fiddler поможет, в нем полная информация о запросах и ответах.
Парсер авито на php
Часто возникает необходимость парсинга Авито. Была статья на Хабре с парсером на перле. Но перл, не часто используемый язык. Решил поделиться актуальным на сегодня парсером Авито на PHP.
Часто возникает необходимость парсинга Авито. Была статья на Хабре с парсером на перле. Но перл, не часто используемый язык. Решил поделиться актуальным на сегодня парсером Авито на PHP, который я использую в своем сервисе Глиса, отслеживающим новые объявления.
Ниже приведен код функции, разбирающий html-код страницы результатов поиска мобильной версии Авито. На входе в функцию передается url страницы ($url), которую мы парсим и html-код данной страницы ($html). На выходе функция возвращает массив объявлений. Парсятся все основные данные, доступные в результатах поиска: номер объявления, url картинки, заголовок объявления, цена, дата выхода и ссылка на объявление.
function getads_avito($url,$html)
{
$pattern = "'<article.{0,10} class="(b-item js-catalog-item-enum |b-item js-catalog-item-enum item-highlight)".{0,10} data-item-id="(?<avito_id>.{7,10})".{1,1000}<span class="pseudo-img"(?<imgsrc>.*?)<.{1,1000}<h3 class="item-header">(?<title>.*?)</span>.*?</h3>(?<price>.*?)<div class="item-info">(?<details>.*?)<div .*? info-text">(?<data>.*?)</div>.*?<a href="(?<href>.*?)"'si";
$titre=preg_match_all($pattern, $html, $ads) ;
unset($ads[0]);
$pattern2="' url((?<imgsrc>.*?))'si";
for ($i=0;$i<count($ads["price"]);$i )
{
$ads["price"][$i]=preg_replace('/[^d] /', '',strip_tags($ads["price"][$i]));
$ads["title"][$i]=trim(strip_tags($ads["title"][$i]));
preg_match($pattern2, $ads["imgsrc"][$i], $ar) ;
$ads["imgsrc"][$i]=$ar["imgsrc"];
}
return $ads;
}
Пояснения по коду.
Самый сложный момент — задать регулярное выражение в $pattern. Каждое объявление начинается с <article — по нему и начинаем парсинг.
Отдельно сделан дополнительный паттерн.
$pattern2="' url((?<imgsrc>.*?))'si";
Это нужно для корректной обработки объявлений без картинок.
Далее в цикле очищаем некоторые данные:
— оставляем в цене только цифры;
— чистим от тегов заголовок;
— выбираем url картинки.
Думаю понятно откуда берется html-код страницы. Я использую для этого curl. Ну и с полученным массивом объявлений можно сделать все что угодно. Я пишу их в базу. Естественно проверив перед записью на предмет новизны. Ну и отсылаю уведомления на емайл и ботом в Телеграм информацию по новым объявлениям.