CURL авторизация на Авито? — Хабр Q&A

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.

Похожее:  Битрикс: Не могу авторизоваться. В чем моя ошибка? — Хабр Q&A

Возможные параметры:

Примеры:

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 авторизация на авито?

1. Как и где посмотреть, какую ссылку форма формирует при отправке данных авторизации?

С помощью сниффера, самый удобный для HTTP – это Fiddler, но вообще способов отследить запросы – множество на разных уровнях, учите матчасть, самый простой сниффер сайтов пишется самостоятельно и имеет десять строк кода, а по эффективности в частных случаях лучше чем Fiddler.

Похожее:  OAuth аутентификация в приложении Flask / Хабр

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. Ну и с полученным массивом объявлений можно сделать все что угодно. Я пишу их в базу. Естественно проверив перед записью на предмет новизны. Ну и отсылаю уведомления на емайл и ботом в Телеграм информацию по новым объявлениям.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 4,00 из 5)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *