- Бот для поиска ближайших ресторанов быстрого питания
- Основные моменты при реализации
- Реализация поиска заведений и геокодера
3.1 Geocoder API
3.2 Places API
3.3 Альтернатива с использованием Яндекс-сервисов
Программа создана для изучения основ при работе с картами с помощью Telegram-бота.
Программа производит поиск ближайших заведений по отправленному пользователем местоположению или названию станции метро в СПб. Также она предоставляет выбор между четырьмя ресторанами:
- McDonald’s
- KFC
- Subway
- Burger King
Бот присылает местоположение ближайших заведений с помощью точек на картах. Пользователь может выбрать ресторан, наиболее подходящий его требованиям.
Отправление локаций пользователю оптимизировано и содержит мало сообщений: отправляется одна локация и предоставляется вариант выбора другой, либо же выбора другого ресторана.
Видео, иллюстрирующее работу программы.
Бот написан на языке python 3, с помощью библиотеки pyTelegramBotAPI (документация Telegram Bot API). Для реализации бота создано три файла.
В файле bot_eat.py расположены основные функции бота, реагирующие на отклики пользователя.
Файл functions.py содержит реализации функций, необходимых для корректной работы программы. В нем находятся как функции для реализации работы с картами, так и функции вывода текста и кнопок.
API-ключи, как и token бота, были помещены в файл config.py. Для запуска программы необходимо добавить индивидуальные данные в этот файл.
Работа с картами была реализована с помощью сервиса 2gis и библиотек requests и json. 2gis не требует подключения нескольких ключей для выполнения разных действий. Для реализации были использованы сервисы Geocoder API и Places API.
- Используется для определения координат станций метро, введенных пользователем.
- Использовано в функции func_geo_gis.
- Документация Geocoder API для 2gis.
- Альтернатива при использовании сервисов Яндекс: API Геокодера.
С помощью библиотеки requests отправляются get-запросы с конкретными параметрами, которые указаны в документации, на сайты, результат возвращается в формате объекта json.
Пример отправления запроса на сайт config.gis_geo на получение координат объекта query с преобразованием полученного объекта json в список:
query = 'СПб метро ' + message.text
r = requests.get(url=config.gis_geo, params={
'q' : query,
'key': config.API_key_gis,
'fields' : 'items.point'
})
result = json.loads(r.text)
Работа с полученными результатами производится согласно документации.
point = str(result['result']['items'][0]['point']['lon']) + ',' + str(result['result']['items'][0]['point']['lat'])
- Используется для нахождения ближайших заведений на карте по координатам в определенном радиусе.
- Использовано в функции func_search_gis.
- Документация Places API для 2gis.
- Альтернатива при использовании сервисов Яндекс: API поиска по организациям.
Пример отправления запроса на сайт config.gis_search на получение объекта call.data, находящегося в радиусе 1000 метров от точки point с последующем преобразованием в список:
r = requests.get(url=config.gis_search, params={
'q' : call.data,
'key': config.API_key_gis,
'point' : point,
'type' : 'branch',
'fields' :'items.point,items.schedule',
'radius' : '1000'
})
result = json.loads(r.text)
Результаты, полученные списками из нескольких элементов можно обрабатывать по разному. Есть возможность использовать цикл со счетчиком для перебора всех элементов списка.
Пример отправления ботом полученных результатов пользователю через функцию send_venue с помощью перебора циклом for:
for item in result['result']['items']:
bot.send_venue(call.message.chat.id, item['point']['lat'], item['point']['lon'], item['name'], item['address_name'])
Также зная количество полученных элементов возможно производить обработку по одному элементу.
bot.send_venue(chat_id=call.message.chat.id,
latitude=result['result']['items'][cnt]['point']['lat'],
longitude=result['result']['items'][cnt]['point']['lon'],
title=result['result']['items'][cnt]['name'],
address=result['result']['items'][cnt]['address_name'])
При реализации работы с картами с помощью Яндекс-сервисов необходимо иметь индивидуальный ключ для каждого сервиса. Работа осуществляется также с помощью библиотек requests и json. Однако параметры запроса и работу с полученным объектом json необходимо корректировать согласно документации.
- Документация API Геокодера при использовании сервисов Яндекс.
- Документация API поиска по организациям при использовании сервисов Яндекс.