- Бот для поиска ближайших ресторанов быстрого питания
 - Основные моменты при реализации
 - Реализация поиска заведений и геокодера
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 поиска по организациям при использовании сервисов Яндекс.