Пример работы API поиска авиабилетов (более не поддерживается)
Данное API устарело. Его поддержка и обновление не осуществляется. Описание актуальной версии.
- Получение данных для запроса
- Обработка данных
- Структура ответа
- Обработка ответа и отображение результата
- Часовые пояса
Уважаемые партнеры! Обратите внимание, что по умолчанию установлено ограничение: 100 запросов в час. Если требуется обрабатывать больше запросов, напишите на support@travelpayouts.com.
Для обработки и вывода полученных данных нам понадобятся знания языка PHP, а именно:
- Информация о массивах.
- Функция foreach.
- Функция array_slice.
Пример работы API находится на данном сайте.
Вы можете скачать файл-пример с поддержкой CSS.
Получение данных для запроса
Для того чтобы собрать данные от пользователей реализуем форму запроса:
<form> <input name="search[params_attributes][origin_name]" value="Москва"> <input name="search[params_attributes][destination_name]" value="Ливерпуль"> <input name="search[params_attributes][depart_date]" value="2014-12-04"> <input name="search[params_attributes][return_date]" value="2014-12-10"> <input name="search[params_attributes][adults]" value="1"> <input name="search[params_attributes][children]" value="0"> <input name="search[params_attributes][infants]" value="0"> <input name="search[params_attributes][trip_class]" value="0"> <input name="search[params_attributes][direct]" value="0"> <input type="submit"> </form>
Обработка данных
После заполнения формы, запрос отправляется на сервер. На его обработку и поиск подходящих вариантов серверу требуется от 5 до 30 секунд. Для того чтобы скрасить ожидание пользователя в это время можно отображать какую-нибудь заглушку.
Результат запроса выводится с помощью следующей команды:
<?php /*Вывод на странице параметров запроса*/ /*var_dump($_GET);*/ if(count($_GET) > 0){ /*Партнерский токен*/ $token = '{PARTNER_TOKEN}'; /*Партнерский маркер*/ $marker = '{PARTNER_MARKER}'; /*Запрос данных*/ $aParams = array( 'search[params_attributes][origin_name]' => $_GET['search']['params_attributes']['origin_name'], 'search[params_attributes][destination_name]' => $_GET['search']['params_attributes']['destination_name'], 'search[params_attributes][depart_date]' => $_GET['search']['params_attributes']['depart_date'], 'search[params_attributes][return_date]' => $_GET['search']['params_attributes']['return_date'], 'search[params_attributes][adults]' => $_GET['search']['params_attributes']['adults'], 'search[params_attributes][children]' => $_GET['search']['params_attributes']['children'], 'search[params_attributes][infants]' => $_GET['search']['params_attributes']['infants'], 'search[params_attributes][trip_class]' => $_GET['search']['params_attributes']['trip_class'] ); ksort($aParams); /*Рассчет md5 суммы*/ $signature = md5("$token:$marker:".implode(':', array_values($aParams))); $bParams = array( 'signature' => $signature, 'enable_api_auth' => true, 'marker' => $marker ); $aParams = $aParams + $bParams; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://engine.aviasales.ru/searches.json'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($aParams)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FAILONERROR, 1); /*Выполнение curl запроса*/ $answer = curl_exec($ch); /*Декодирование json строки*/ $answer = json_decode($answer, true);
} ?>
Структура ответа
В результате работы запроса мы получаем ответ в виде массива:
array(10) { /*в основном массиве 10 параметров*/ ["params_attributes"]=> array(6) { ["origin_iata"]=> string(3) "MOW" ["destination_iata"]=> string(3) "LED" ["origin_name"]=> string(12) "Москва" ["destination_name"]=> string(18) "Петроград" ["origin_type"]=> string(4) "city" ["destination_type"]=> string(4) "city" } ["search_id"]=> 26301f4e-6360-47e3-b1ac-8c4f2440d22f ["search_cache_time"]=> int(30) ["metadata"]=> array(0) { } ["tickets"]=> array(634) { /*в массиве тикетов содержится 634 варианта билетов, для примера отображается часть*/ [0]=> array(5) { ["total"]=> int(5774) ["native_prices"]=> array(7) { [30]=> int(5774) [11]=> float(5818.28) [8]=> int(5894) [6]=> float(6075) [7]=> int(5937) [62]=> float(6131) [20]=> int(5789) } ["order_urls"]=> array(7) { [30]=> int(52) [11]=> int(315) [8]=> int(1) [6]=> int(62) [7]=> int(418) [62]=> int(878) [20]=> int(1634) } ["direct_flights"]=> array(1) { [0]=> array(9) { ["number"]=> int(36) ["airline"]=> string(2) "UN" ["departure"]=> int(1388859900) ["arrival"]=> int(1388865000) ["duration"]=> int(85) ["delay"]=> int(0) ["origin"]=> string(3) "VKO" ["destination"]=> string(3) "LED" ["aircraft"]=> NULL } } ["return_flights"]=> array(1) { [0]=> array(9) { ["number"]=> int(33) ["airline"]=> string(2) "UN" ["departure"]=> int(1389368100) ["arrival"]=> int(1389372900) ["duration"]=> int(80) ["delay"]=> int(0) ["origin"]=> string(3) "LED" ["destination"]=> string(3) "VKO" ["aircraft"]=> NULL } } } [1]=> array(5) { ["total"]=> int(5774) ["native_prices"]=> array(7) { [30]=> int(5774) [11]=> float(5818.28) [8]=> int(5894) [6]=> float(6075) [7]=> int(5937) [62]=> float(6131) [20]=> int(5789) } ["order_urls"]=> array(7) { [30]=> int(121) [11]=> int(277) [8]=> int(2) [6]=> int(54) [7]=> int(428) [62]=> int(888) [20]=> int(1660) } ["direct_flights"]=> array(1) { [0]=> array(9) { ["number"]=> int(36) ["airline"]=> string(2) "UN" ["departure"]=> int(1388859900) ["arrival"]=> int(1388865000) ["duration"]=> int(85) ["delay"]=> int(0) ["origin"]=> string(3) "VKO" ["destination"]=> string(3) "LED" ["aircraft"]=> NULL } } ["return_flights"]=> array(1) { [0]=> array(9) { ["number"]=> int(6) ["airline"]=> string(2) "UN" ["departure"]=> int(1389382200) ["arrival"]=> int(1389387300) ["duration"]=> int(85) ["delay"]=> int(0) ["origin"]=> string(3) "LED" ["destination"]=> string(3) "DME" ["aircraft"]=> NULL } } } ... [633]=> array(6) { ["total"]=> int(18050) ["native_prices"]=> array(1) { [20]=> int(18050) } ["order_urls"]=> array(1) { [20]=> int(1965) } ["direct_flights"]=> array(2) { [0]=> array(9) { ["number"]=> int(369) ["airline"]=> string(2) "U9" ["departure"]=> int(1388829000) ["arrival"]=> int(1388834100) ["duration"]=> int(85) ["delay"]=> int(0) ["origin"]=> string(3) "DME" ["destination"]=> string(3) "KZN" ["aircraft"]=> NULL } [1]=> array(9) { ["number"]=> int(504) ["airline"]=> string(2) "U9" ["departure"]=> int(1388857800) ["arrival"]=> int(1388866200) ["duration"]=> int(140) ["delay"]=> int(395) ["origin"]=> string(3) "KZN" ["destination"]=> string(3) "LED" ["aircraft"]=> NULL } } ["main_airline"]=> string(2) "U9" ["return_flights"]=> array(2) { [0]=> array(9) { ["number"]=> int(588) ["airline"]=> string(2) "U9" ["departure"]=> int(1389388200) ["arrival"]=> int(1389396300) ["duration"]=> int(135) ["delay"]=> int(0) ["origin"]=> string(3) "LED" ["destination"]=> string(3) "KZN" ["aircraft"]=> NULL } [1]=> array(9) { ["number"]=> int(370) ["airline"]=> string(2) "U9" ["departure"]=> int(1389423600) ["arrival"]=> int(1389429600) ["duration"]=> int(100) ["delay"]=> int(455) ["origin"]=> string(3) "KZN" ["destination"]=> string(3) "DME" ["aircraft"]=> NULL } } } } ["airlines"]=> array(12) { /*тут выводится информация о 12 авиакомпаниях, которые летают по данным направлениям, отображается только часть*/ ["5N"]=> array(5) { ["name"]=> string(8) "Nordavia" ["id"]=> int(12) ["alliance_name"]=> NULL ["rates"]=> int(344) ["average_rate"]=> float(3.4) } ["7R"]=> array(5) { ["name"]=> string(11) "Rusline Air" ["id"]=> int(557) ["alliance_name"]=> NULL ["rates"]=> int(326) ["average_rate"]=> float(2.85) } } ["airports"]=> array(11) { /*информация об аэропортах, через которые происходит полет, в том числе аэропорты пересадки*/ ["ARH"]=> array(6) { ["rates"]=> int(56) ["average_rate"]=> float(3.14) ["name"]=> string(12) "Талаги" ["city"]=> string(22) "Архангельск" ["country"]=> string(12) "Россия" ["time_zone"]=> string(13) "Europe/Moscow" } ["DME"]=> array(6) { ["rates"]=> int(160) ["average_rate"]=> float(3.92) ["name"]=> string(20) "Домодедово" ["city"]=> string(12) "Москва" ["country"]=> string(12) "Россия" ["time_zone"]=> string(13) "Europe/Moscow" } } ["gates_info"]=> array(10) { /*информация об агентах, через которые продаются билеты*/ [0]=> array(10) { ["id"]=> int(6) ["label"]=> string(7) "Sindbad" ["payment_methods"]=> array(4) { [0]=> string(4) "cash" [1]=> string(8) "terminal" [2]=> string(4) "card" [3]=> string(3) "exp" } ["currency_code"]=> string(3) "rub" ["is_airline"]=> bool(false) ["mobile_version"]=> bool(false) ["airline_iatas"]=> array(0) { } ["productivity"]=> float(14.120089228725) ["average_rate"]=> float(0) ["rates"]=> int(0) } [1]=> array(10) { ["id"]=> int(7) ["label"]=> string(11) "OZON.travel" ["payment_methods"]=> array(8) { [0]=> string(4) "cash" [1]=> string(12) "yandex_money" [2]=> string(9) "web_money" [3]=> string(8) "terminal" [4]=> string(4) "card" [5]=> string(7) "elexnet" [6]=> string(7) "contact" [7]=> string(7) "euroset" } ["currency_code"]=> string(3) "rub" ["is_airline"]=> bool(false) ["mobile_version"]=> bool(false) ["airline_iatas"]=> array(0) { } ["productivity"]=> float(18.176374887213) ["average_rate"]=> float(0) ["rates"]=> int(0) } } ["search_minimal_prices"]=> array(4) { /*информация о минимальной цене*/ [0]=> array(6) { ["depart_date"]=> string(10) "2014-01-04" ["number_of_changes"]=> int(0) ["value"]=> int(5465) ["gate_id"]=> int(11) ["show_to_affiliates"]=> bool(false) ["return_date"]=> string(10) "2014-01-10" } [1]=> array(6) { ["depart_date"]=> string(10) "2014-01-04" ["number_of_changes"]=> int(1) ["value"]=> int(12074) ["gate_id"]=> int(20) ["show_to_affiliates"]=> bool(false) ["return_date"]=> string(10) "2014-01-10" } } ["currency_rates"]=> array(155) { /*курсы валют по отношению к рублю*/ ["eur"]=> float(44.0201) ["usd"]=> float(32.6874) ["uah"]=> float(4.0564409652) } }
Важно! Пример ответа содержит не все результаты, а лишь часть, чтобы продемонстрировать его структуру и содержание. Полный пример ответа отображается на странице примере после результатов поиска.
Обратите внимание! Дата отправления и возвращения приходит в формате Unix Timestamp по Гринвичу. При переводе с помощью php date("c", "значение UNIX-time") берется время сервера и часовые пояса не учитываются. Поэтому требуется принимать в расчет время сервера или принудительно приводить его к времени Гринвича с помощью функции date_default_timezone_set('GMT').
Обработка ответа и отображение результата
На основе полученных данных организовывается вывод информации. Актуальный пример работы API смотрите здесь. Ниже приводится один из возможных вариантов обработки и отображения полученных данных:
Город вылета: Москва
Город прилета: Петроград
Перелеты между этими городами совершают следующие авиакомпании: Nordavia, Rusline Air, Rossiya Airlines, Hahn Air, S7, Aeroflot, Ural Airlines, Tatarstan Aircompany, Transaero, UT Air, Yamal Air, Polet Airlines,
Дата отправления: 04.01.2014
Дата возвращения: 10.01.2014
Минимальная стоимость перелета: 5465, руб.
Максимальная стоимость перелета: 35925, руб.
Для того чтобы вывести данные из массива необходимо прописать точный путь до них. Для этого используется конструкция вида:
echo "<p>Город вылета: " .$answer['params_attributes']['origin_name']. "</p>"; echo "<p>Город прилета: " .$answer['params_attributes']['destination_name']. "</p>";
Список авиакомпаний выводится при помощи функции foreach. Т.к. заранее не известно какие именно авиакомпании будут в массиве ответа, то потребуется перебрать все варианты и организовать выдачу:
echo "<p>Перелеты между этими городами совершают следующие авиакомпании:</p><ul>"; foreach ($answer['airlines'] as $value){ echo "<li>" .$value['name']. "</li>"; } echo "</ul>";
Чтобы определить минимальную и максимальную стоимость билета, воспользуемся комбинацией методов и функциями min и max:
$min = null; $max = null; foreach ($answer['tickets'] as $valuetotal) { if ($min === null || $valuetotal['total'] < $min) $min = $valuetotal['total']; if ($max === null || $valuetotal['total'] > $max) $max = $valuetotal['total']; } echo "<p>Минимальная стоимость перелета: " .$min. ", руб.</p>"; echo "<p>Максимальная стоимость перелета: " .$max. ", руб.</p>";
Для того чтобы отобразить дату и время вылета/прилета в правильном часовом поясе, необходимо перевести их из формата UNIX:
$departuretime = date('d.m.Y', $answer['tickets'][0]['direct_flights'][0]['departure']); echo "<p>Дата отправления: " .$departuretime. "</p>"; $arrivaltime = date('d.m.Y', $answer['tickets'][0]['return_flights'][0]['arrival']); echo "<p>Дата возвращения: " .$arrivaltime. "</p>";
Из результатов запроса можно получить и другие полезные данные, например, количество пересадок, аэропорты в которых они совершаются и многое другое.
Пример работы API (откроется в новом окне)