Skip to content

22.07.2021 Элементарный Telegram-бот, выполняющий поиск мест на карте

Notifications You must be signed in to change notification settings

ellvenro/bot_eat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Элементарный Telegram-бот, выполняющий основные функции

Содержание

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

Geocoder 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'])

Places API

  • Используется для нахождения ближайших заведений на карте по координатам в определенном радиусе.
  • Использовано в функции 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 необходимо корректировать согласно документации.

About

22.07.2021 Элементарный Telegram-бот, выполняющий поиск мест на карте

Topics

Resources

Stars

Watchers

Forks

Languages