← Вернуться к списку тем

Поиск билетов по средствам известного агрегатора.

Как известно существует много региональных чатов, где людям часто нужно быстро узнать цены на билеты по одному-двум направлениям, остальные их не интересуют с учетом региональности.
у авиасейлс (не реклама) очень удобная ссылка для этого, она состоит всегда из-
https://www.aviasales.ru/search/MOW3112TCI1
где после слова серч идет индекс аэропорта Вылета, дальше дата ДЕНЬМЕСЯЦ и аэропорт назначения и последняя цифра количество пассажиров.

я написал такой код боту-

// Поиск билетов

if (preg_match("/bБилетыb/ui", $text)){       // реакция на слово "Билеты"
 apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'Для поиска авиабилетов из Москвы на Тенерифе, Гран-Канарию, Лансароте и обратно используйте спец. команды. 
Например для поиска билета из Москвы на Гран-Канарию на 12 января отправьте боту команду «/MG 1201».
Команды:
Москва-Тенерифе /MT
Тенерифе-Москва /TM
Москва-Гран-Канария /MG
Гран-Канария-Москва /GM
Москва-Лансароте /ML
Лансароте-Москва /LM'));
    }

else if (strpos($text, '/MT') !== false) {
      $option = explode(" ", $text); // Разбивает строку с помощью разделителя $option[1]-ДАТА
       apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'https://www.aviasales.ru/search/MOW'.$option[1].'TCI1'));
      }
  
else if (strpos($text, '/TM') !== false) {
      $option = explode(" ", $text); // Разбивает строку с помощью разделителя $option[1]-ДАТА
       apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'https://www.aviasales.ru/search/TCI'.$option[1].'MOW1'));
      }
  else if (strpos($text, '/MG') !== false) {
      $option = explode(" ", $text); // Разбивает строку с помощью разделителя $option[1]-ДАТА
       apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'https://www.aviasales.ru/search/MOW'.$option[1].'LPA1'));
      }
  
else if (strpos($text, '/GM') !== false) {
      $option = explode(" ", $text); // Разбивает строку с помощью разделителя $option[1]-ДАТА
       apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'https://www.aviasales.ru/search/LPA'.$option[1].'MOW1'));
      }
else if (strpos($text, '/ML') !== false) {
      $option = explode(" ", $text); // Разбивает строку с помощью разделителя $option[1]-ДАТА
       apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'https://www.aviasales.ru/search/MOW'.$option[1].'ACE1'));
      }
else if (strpos($text, '/LM') !== false) {
      $option = explode(" ", $text); // Разбивает строку с помощью разделителя $option[1]-Киев,$option[2] = число 3
       apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'https://www.aviasales.ru/search/ACE'.$option[1].'MOW1'));
      }

минус заключается в том что пользователю приходится в ручную вбивать команду в формате /MG 1201 это и неудобно да и не всем понятно.
Хочется модернизировать данный код по такому принципу-
Бот услышал слово Билеты и выдал пользователю стандартную (не ИНЛАЙН) клавиатуру вместе с фразой- выберете аэропорт вылета. Клаве уже изначально заданы несколько аэропортов, допустим Москва, Тенерифе, Гран-Канария.
человек выбрал кнопку Москва, Бот увидел это слово и сделал запись в ххх.ТХТ файл в виде кода MOW (это код аэропортов Москвы в системе авиасейлс), дальше он спрашивает- выберете аэропорт прилета, варианты те же , человек нажал к примеру кнопку Гран-Канария, после чего в тот же файл ххх.ТХТ добавилася код этого аэропорта в виде LPA. Далее вопрос введите количество пассажиров, человек отвечает к примеру 1 идет запись в файл ххх.ТХТ цифарки 1.
И последнйи вопрос Бота введи даты в формате день месяц.
пользователь отвечает к примеру- 3112 что значит 31 декабря, и теперь бот формирует уже готовую ссылку на выдачу в диалог, берет основу- https://www.aviasales.ru/search/
и подставляет к ней код аэропорта вылета из файла, дату, аэропорт прилета и в конце цифра- количество пассажиров, получается у нас в диалоговое окно он выбрасывает ссылку https://www.aviasales.ru/search/MOW3112LPA1
и по средствам Вебпревью мы сразу в диалогом окне видим минимальную цену по мнению ависейлся и можем нажать на ссылку чтобы перейти к ним на сайт и купить.

Ответы


  • iMakeBots [13.09.2019 в 20:18 → Грачик Абдулошвили]
    Можно это все зашить в инлайн-кнопку, после каждого ответа обновлять callback_data у кнопки - то есть добирать необходимые значения.

    При обработке слова Билеты выводиться сообщение с предложением выбрать город отбытия, под ним список из строк инлайн-кнопок , после каждого выбора меняется сообщение и набор кнопок в зависимости от выбора пользователя:

    Значения callback_data у инлайн-кнопок:
    1 запрос - выбор города отбытия типа MOW
    2 запрос - выбор города отбытия типа MOW_LPA
    3 запрос - выбор кол-ва пассажиров MOW_LPA_1 (кол-во пассажиров)
    4 запрос - кнопки месяца от текущего 12, где текст: по типу "Сентябрь 2019" и до "Август 2020", значение 092019
    5 запрос - кнопки дня месяца от 1 до 31 - с фильтрацией по кол-ву дней в выбранном месяце
    По итогу вывод сообщения с выбранными параметрами и кнопки-ссылки на внешний ресурс, или для превью ссылку в текством виде.
  • Грачик Абдулошвили [14.09.2019 в 17:52 → iMakeBots]
    
    switch($message) {
        case 'Билет':  
    $inline_button1 = array("text"=>"Москва","callback_data"=>'MOW');
    $inline_button2 = array("text"=>"Санкт-Петербург","callback_data"=>'LED');
    $inline_button3 = array("text"=>"Гран-Канария","callback_data"=>'LPA');
    $inline_button4 = array("text"=>"Лансароте","callback_data"=>'ACE');
    $inline_button5 = array("text"=>"Тенерифе","callback_data"=>'TCI');
        $inline_keyboard = [[$inline_button1,$inline_button2,$inline_button3],[$inline_button4,$inline_button5]];
        $keyboard=array("inline_keyboard"=>$inline_keyboard);
        $replyMarkup = json_encode($keyboard); 
         sendMessage($chat_id, "Выберите город вылета:", $parse_mode, $replyMarkup);
        break;
    }
    
    ХЗ что тут писать но должно уже получиться формата- https://www.aviasales.ru/search/MOW    если была нажата кнопка Москва
    
    
         sendMessage($chat_id, "Введите дату вылета в формате день месяц. Например 3112", $parse_mode, $replyMarkup);
        break;
    }
    

    ХЗ что тут писать но должно уже получиться формата- https://www.aviasales.ru/search/MOW3112 если была нажата кнопка Москва в начале и вбито 3112 при следующем вопросе.

      
    $inline_button1 = array("text"=>"Москва","callback_data"=>'MOW');
    $inline_button2 = array("text"=>"Санкт-Петербург","callback_data"=>'LED');
    $inline_button3 = array("text"=>"Гран-Канария","callback_data"=>'LPA');
    $inline_button4 = array("text"=>"Лансароте","callback_data"=>'ACE');
    $inline_button5 = array("text"=>"Тенерифе","callback_data"=>'TCI');
        $inline_keyboard = [[$inline_button1,$inline_button2,$inline_button3],[$inline_button4,$inline_button5]];
        $keyboard=array("inline_keyboard"=>$inline_keyboard);
        $replyMarkup = json_encode($keyboard); 
         sendMessage($chat_id, "Выберите город прилета:", $parse_mode, $replyMarkup);
        break;
    }
    

    ХЗ что тут писать но должно уже получиться формата- https://www.aviasales.ru/search/MOW3112TCI если была нажата кнопка Москва в начале и вбито 3112 при следующем вопросе и Тенерифе как город прилета.
    
         sendMessage($chat_id, "Введите количество пассажиров цифрой", $parse_mode, $replyMarkup);
        break;
    }
    

    финальная выдача Ботом в диалог получившейся ссылки-
    sendMessage($chat_id, "https://www.aviasales.ru/search/MOW3112TCI", $parse_mode, $replyMarkup);
  • iMakeBots [14.09.2019 в 18:48 → Грачик Абдулошвили]
    $buttons_1 = json_encode([
    	'inline_keyboard' => [
    			[
    				[
    					"text" => "Москва",
    					"callback_data" => "actionInlineButton_MOW"
    				]
    			],
    			[
    				[
    					"text" => "Санкт-Петербург",
    					"callback_data" => "actionInlineButton_LED"
    				]
    			],
    			[
    				[
    					"text" => "Гран-Канария",
    					"callback_data" => "actionInlineButton_LPA"
    				]
    			],
    		],
    	], true);
    
    switch($message) {
        case 'Билет':
        sendMessage($chat_id, "Выберите город вылета:", $parse_mode, $buttons_1);
        break;
    }
    
    // при нажатии на кнопку перехватываем событие функцией actionInlineButton и например по кнопке Москва прилетает значение MOW
    // выводим следующее сообщение для выбора месяца вылета
    // сейчас например месяц сентябрь 2019 значит выводим 12 кнопок с 09.19 по 08.20, программно это вычисляем - работаем с датой
    // в примере пока от руки пишем 6 рядов по 2 кнопки
    
    $buttons_2 = json_encode([
    	'inline_keyboard' => [
    			[
    				[
    					"text" => "Сентябрь 2019",
    					"callback_data" => "actionInlineButton_MOW_09"
    				],
    				[
    					"text" => "Октябрь 2019",
    					"callback_data" => "actionInlineButton_MOW_10"
    				],
    			],
    			[
    				[
    					"text" => "Ноябрь 2019",
    					"callback_data" => "actionInlineButton_MOW_11"
    				],
    				[
    					"text" => "Декабрь 2019",
    					"callback_data" => "actionInlineButton_MOW_12"
    				],
    			],
    			[
    				[
    					"text" => "Январь 2020",
    					"callback_data" => "actionInlineButton_MOW_01"
    				],
    				[
    					"text" => "Февраль 2020",
    					"callback_data" => "actionInlineButton_MOW_02"
    				],
    			],
    			[
    				[
    					"text" => "Март 2020",
    					"callback_data" => "actionInlineButton_MOW_03"
    				],
    				[
    					"text" => "Апрель 2020",
    					"callback_data" => "actionInlineButton_MOW_04"
    				],
    			],
    			[
    				[
    					"text" => "Май 2020",
    					"callback_data" => "actionInlineButton_MOW_05"
    				],
    				[
    					"text" => "Июнь 2020",
    					"callback_data" => "actionInlineButton_MOW_06"
    				],
    			],
    			[
    				[
    					"text" => "Июль 2020",
    					"callback_data" => "actionInlineButton_MOW_07"
    				],
    				[
    					"text" => "Август 2020",
    					"callback_data" => "actionInlineButton_MOW_08"
    				],
    			],
    		],
    	], true);
    
    sendMessage($chat_id, "Выберите месяц вылета:", $parse_mode, $buttons_2);
    
    // при нажатии например на кнопку Июнь 2020 в функцию actionInlineButton прилетает уже значение MOW O6
    // вычисляем кол-во дней в месяце и выводим в цикле кнопки выбора дня вылета например по 6 кнопок в строке
    
    $arr = $arr_s = [];
    for ($d = 1; $d <= 30; $d  ) {
    	$arr_s[] = ["text" => $d, "callback_data" => "actionInlineButton_MOW_06_" . $d];
    	if($d % 6 == 0) {
    		$arr[] = $arr_s;
    		$arr_s =[];
    	}
    }
            	
    $buttons_3 = json_encode([
    	'inline_keyboard' => $arr,
    ], true);
    
    sendMessage($chat_id, "Выберите день вылета:", $parse_mode, $buttons_3);
    
    // при нажатии например на кнопку 12 в функцию actionInlineButton прилетает уже значение MOW O6 12
    // и последний запрос это город прилета 
    
    $buttons_4 = json_encode([
    	'inline_keyboard' => [
    			[
    				[
    					"text" => "Лансароте",
    					"callback_data" => "actionInlineButton_MOW_06_12_ACE"
    				]
    			],
    			[
    				[
    					"text" => "Санкт-Петербург",
    					"callback_data" => "actionInlineButton_MOW_06_12_LED"
    				]
    			],
    			[
    				[
    					"text" => "Гран-Канария",
    					"callback_data" => "actionInlineButton_MOW_06_12_LPA"
    				]
    			],
    		],
    	], true);
    
    sendMessage($chat_id, "Выберите город прилета:", $parse_mode, $buttons_4);
    
    // после обработки нажатия кнопки мы получим полный напоб параметров для создания ссылки 
    // если нажали на кнопку Гран-Канария то  набор будет таким MOW 06 12 LPA
    
    sendMessage($chat_id, "https://www.aviasales.ru/search/MOW1206LPA");
    
    
    
  • Грачик Абдулошвили [14.09.2019 в 20:53 → iMakeBots]
    Дело в том что у меня в одном файле присутвует несколько функций для бота.
    я вставил его в конце в таком формате-
    
    //   Поиск билетов
    $access_token = 'TOKEN';
    $api = 'https://api.telegram.org/bot' . $access_token;
    $output = json_decode(file_get_contents('php://input'), TRUE);
    $chat_id = $output['message']['chat']['id'];
    $message = $output['message']['text'];
    $callback_query = $output['callback_query'];
    $data = $callback_query['data'];
    $message_id = ['callback_query']['message']['message_id'];
    $chat_id_in = $callback_query['message']['chat']['id'];
    $buttons_1 = json_encode([
    	'inline_keyboard' => [
    			[
    				[
    					"text" => "Москва",
    					"callback_data" => "actionInlineButton_MOW"
    				]
    			],
    			[
    				[
    					"text" => "Санкт-Петербург",
    					"callback_data" => "actionInlineButton_LED"
    				]
    			],
    			[
    				[
    					"text" => "Гран-Канария",
    					"callback_data" => "actionInlineButton_LPA"
    				]
    			],
    		],
    	], true);
    
    switch($message) {
        case 'Билет':
        sendMessage($chat_id, "Выберите город вылета:", $parse_mode, $buttons_1);
        break;
    }
    
    // при нажатии на кнопку перехватываем событие функцией actionInlineButton и например по кнопке Москва прилетает значение MOW
    // выводим следующее сообщение для выбора месяца вылета
    // сейчас например месяц сентябрь 2019 значит выводим 12 кнопок с 09.19 по 08.20, программно это вычисляем - работаем с датой
    // в примере пока от руки пишем 6 рядов по 2 кнопки
    
    $buttons_2 = json_encode([
    	'inline_keyboard' => [
    			[
    				[
    					"text" => "Сентябрь 2019",
    					"callback_data" => "actionInlineButton_MOW_09"
    				],
    				[
    					"text" => "Октябрь 2019",
    					"callback_data" => "actionInlineButton_MOW_10"
    				],
    			],
    			[
    				[
    					"text" => "Ноябрь 2019",
    					"callback_data" => "actionInlineButton_MOW_11"
    				],
    				[
    					"text" => "Декабрь 2019",
    					"callback_data" => "actionInlineButton_MOW_12"
    				],
    			],
    			[
    				[
    					"text" => "Январь 2020",
    					"callback_data" => "actionInlineButton_MOW_01"
    				],
    				[
    					"text" => "Февраль 2020",
    					"callback_data" => "actionInlineButton_MOW_02"
    				],
    			],
    			[
    				[
    					"text" => "Март 2020",
    					"callback_data" => "actionInlineButton_MOW_03"
    				],
    				[
    					"text" => "Апрель 2020",
    					"callback_data" => "actionInlineButton_MOW_04"
    				],
    			],
    			[
    				[
    					"text" => "Май 2020",
    					"callback_data" => "actionInlineButton_MOW_05"
    				],
    				[
    					"text" => "Июнь 2020",
    					"callback_data" => "actionInlineButton_MOW_06"
    				],
    			],
    			[
    				[
    					"text" => "Июль 2020",
    					"callback_data" => "actionInlineButton_MOW_07"
    				],
    				[
    					"text" => "Август 2020",
    					"callback_data" => "actionInlineButton_MOW_08"
    				],
    			],
    		],
    	], true);
    
    sendMessage($chat_id, "Выберите месяц вылета:", $parse_mode, $buttons_2);
    
    // при нажатии например на кнопку Июнь 2020 в функцию actionInlineButton прилетает уже значение MOW O6
    // вычисляем кол-во дней в месяце и выводим в цикле кнопки выбора дня вылета например по 6 кнопок в строке
    
    $arr = $arr_s = [];
    for ($d = 1; $d <= 30; $d  ) {
    	$arr_s[] = ["text" => $d, "callback_data" => "actionInlineButton_MOW_06_" . $d];
    	if($d % 6 == 0) {
    		$arr[] = $arr_s;
    		$arr_s =[];
    	}
    }
            	
    $buttons_3 = json_encode([
    	'inline_keyboard' => $arr,
    ], true);
    
    sendMessage($chat_id, "Выберите день вылета:", $parse_mode, $buttons_3);
    
    // при нажатии например на кнопку 12 в функцию actionInlineButton прилетает уже значение MOW O6 12
    // и последний запрос это город прилета 
    
    $buttons_4 = json_encode([
    	'inline_keyboard' => [
    			[
    				[
    					"text" => "Лансароте",
    					"callback_data" => "actionInlineButton_MOW_06_12_ACE"
    				]
    			],
    			[
    				[
    					"text" => "Санкт-Петербург",
    					"callback_data" => "actionInlineButton_MOW_06_12_LED"
    				]
    			],
    			[
    				[
    					"text" => "Гран-Канария",
    					"callback_data" => "actionInlineButton_MOW_06_12_LPA"
    				]
    			],
    		],
    	], true);
    
    sendMessage($chat_id, "Выберите город прилета:", $parse_mode, $buttons_4);
    
    // после обработки нажатия кнопки мы получим полный напоб параметров для создания ссылки 
    // если нажали на кнопку Гран-Канария то  набор будет таким MOW 06 12 LPA
    
    sendMessage($chat_id, "https://www.aviasales.ru/search/MOW1206LPA");
    
    
    //    Конец поиска билетов
    
    и получилось при таком коде ситуация что при ЛЮБОМ запросе к Боту от него выскакивает в ответ календарь с месяцами и ВСЁ.
  • iMakeBots [14.09.2019 в 21:03 → Грачик Абдулошвили]
    )) нет так не пойдет, я вам привел один из примеров как реализовать вывод кнопок к сообщениям.

    Просто так копировать и вставлять не прокатит.
    В приведенном вами коде будут выведены несколько сообщений с кнопками. А вам надо сделать пошагово. То есть обрабатывать каждый шаг пользователя.

    Пользователь запросил по сообщению "Билеты" - 1 шаг - вывод точки отправления, далее он выбрал город отправления, а это следующий шаг .... и т.д.

    Как минимум нужно реализовать обработку нажатия кнопок, и вывод в зависимости от текущего шага.
  • Грачик Абдулошвили [14.09.2019 в 21:14 → iMakeBots]
    можете приветси пример обработки хотя бы для одной комбинации? для остальных я сделаю по аналогии уже сам.
  • iMakeBots [14.09.2019 в 21:17 → iMakeBots]
    Статья Еще раз про кнопки и клавиатуру

        private function actionInlineButton($callback_data)
        {
            // получаем массив из переданного параметра callback_data кнопки inline
            // разделяем по знаку _
            // под индексом 0 идет значение actionInlineButton
            // под последующим индексом 1 идет значение, которое может при создании
            // кнопки генерироваться под ваши требования, например это может быть id какого-нибудь объекта
            // значений может быть больше, но общая строка не должна превышать 64 байта
            $params = explode("_", $callback_data["data"]);
    
            // отправляем Уведомление
            $this->botApiQuery("answerCallbackQuery", [
                "callback_query_id" => $callback_data["id"],
                "text" => "Событие inline получено",
                "alert" => false
            ]);
    
            // отправляем текстовое сообщение
            $this->botApiQuery("sendMessage", [
                "chat_id" => $this->userId,
                "text" => "Параметр " . $params["1"],
            ]);
        }