- Saved searches
- Use saved searches to filter your results more quickly
- ellvenro/bot_eat
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
- Шаг за шагом: реализация поисковика в боте Telegram на Python и Aiogram
- 1. Начальная настройка
- 2. Регистрация бота в Telegram
- 3. Создание команд для бота
- 4. Реализация поиска
- 5. Запуск бота
- 6. Выводы
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
22.07.2021 Элементарный Telegram-бот, выполняющий поиск мест на карте
ellvenro/bot_eat
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Элементарный Telegram-бот, выполняющий основные функции
Бот для поиска ближайших ресторанов быстрого питания
Программа создана для изучения основ при работе с картами с помощью Telegram-бота.
Программа производит поиск ближайших заведений по отправленному пользователем местоположению или названию станции метро в СПб. Также она предоставляет выбор между четырьмя ресторанами:
Бот присылает местоположение ближайших заведений с помощью точек на картах. Пользователь может выбрать ресторан, наиболее подходящий его требованиям.
Отправление локаций пользователю оптимизировано и содержит мало сообщений: отправляется одна локация и предоставляется вариант выбора другой, либо же выбора другого ресторана.
Видео, иллюстрирующее работу программы.
Основные моменты при реализации
Бот написан на языке 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 поиска по организациям при использовании сервисов Яндекс.
About
22.07.2021 Элементарный Telegram-бот, выполняющий поиск мест на карте
Шаг за шагом: реализация поисковика в боте Telegram на Python и Aiogram
Telegram — популярный мессенджер, который часто используется для создания ботов для различных целей. В данной статье мы рассмотрим, как создать бота Telegram на языке Python и фреймворке Aiogram, который будет осуществлять поиск информации в Интернете.
1. Начальная настройка
Первым шагом будет настройка окружения для работы с Python и Aiogram. Для этого необходимо установить Python (версия 3.7 и выше) и установить необходимые библиотеки, используя командную строку:
pip install aiogram beautifulsoup4 requests aiohttp
После установки библиотек будет создан файл main.py , в котором мы будем разрабатывать бота.
2. Регистрация бота в Telegram
Для создания бота в Telegram необходимо зарегистрироваться в мессенджере. После этого необходимо создать бота с помощью BotFather, следуя его инструкциям. BotFather выдаст токен, который мы будем использовать в нашем боте.
3. Создание команд для бота
Для того чтобы создать команды для нашего бота, необходимо создать функции, которые будут вызываться при определенных сообщениях от пользователя. Для этого создаем файл handlers.py и определяем функции-обработчики:
from aiogram import types from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters import Text from aiogram.dispatcher.filters.state import State, StatesGroup from aiogram.types import KeyboardButton, ReplyKeyboardMarkup, \ ReplyKeyboardRemove from search import search class SearchForm(StatesGroup): waiting_for_query = State() async def on_start(message: types.Message): keyboard = ReplyKeyboardMarkup(resize_keyboard=True) buttons = Python telegram bot поиск keyboard.add(*buttons) await message.answer("Hello", reply_markup=keyboard) async def search_form_start(message: types.Message, state: FSMContext): await message.answer("Type query searchString") await SearchForm.waiting_for_query.set() async def process_search_query(message: types.Message, state: FSMContext): query = message.text results = search(query) result_text = '\n'.join(map(str, results)) await message.answer(result_text) await state.finish()
Также переопределяем функцию main() , в которой создаем объект бота и добавляем обработчики команд:
import logging from aiogram import Bot, Dispatcher, types from aiogram.types import ParseMode from aiogram.utils import executor from handlers import ( on_start, search_form_start, process_search_query, SearchForm, ) API_TOKEN = 'BOT TOKEN HERE' # Configure logging logging.basicConfig(level=logging.INFO) # Initialize bot and dispatcher bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) # Register handlers dp.register_message_handler(on_start, commands=['start']) dp.register_message_handler( search_form_start, commands=['search'], state='*' ) dp.register_message_handler( process_search_query, state=SearchForm.waiting_for_query, content_types=types.ContentType.TEXT, )
4. Реализация поиска
Для осуществления поиска мы будем использовать модуль search.py , который будет вызываться при вводе пользователем запроса. В этом модуле определяется функция search() , которая осуществляет поиск поисковой системе Bing API. Мы используем библиотеку aiohttp для выполнения HTTP-запросов:
import os import aiohttp from bs4 import BeautifulSoup async def make_request(url): headers = < 'Ocp-Apim-Subscription-Key': os.environ['BING_API_KEY'] >async with aiohttp.ClientSession(headers=headers) as session: async with session.get(url) as response: if response.status == 200: return await response.text() else: return '' def parse_results(html): soup = BeautifulSoup(html, 'html.parser') results = [] for tag in soup.find_all('a'): url = tag.get('href') if url is None or not url.startswith('http'): continue title_tag = tag.find('h2') if title_tag is None: continue title = title_tag.get_text() description_tag = tag.find('p') description = '' if description_tag is not None: description = description_tag.get_text() results.append() return results async def search(query): url = f'https://bing.com/search?q=&count=10' html = await make_request(url) return parse_results(html)
5. Запуск бота
После всех настроек и создания необходимых файлов можно запустить бота, используя команду:
docker build --tag bot_tag . docker run --env-file env.list bot_tag
6. Выводы
Таким образом, мы создали бота Telegram, который может осуществлять поиск информации в Интернете и присылать результаты пользователю. Использование фреймворка Aiogram позволило значительно упростить процесс разработки и облегчить поддержку кода в будущем.