Telegram-бот для получения адреса по локации или координатам (Python)
Привет! Представь ситуацию, когда тебе скинули координаты или локацию, но ты хочешь срочно узнать адрес этого места.
Сегодня попробуем написать Telegram-бота для получения адреса по координатам или локации.
В итоге у тебя получится вот такой бот @SayMyAddressBot.
Что нам для этого потребуется?
- Бот в Telegram;
- Обратный геокодинг от Яндекса. Геокодинг это такой сервис, который позволяет получить из адреса координаты, а нам нужно наоборот, поэтому «обратный геокодинг»;
- Установленный Python и библиотека requests для посылки запросов;
- Установленная библиотека Python-telegram-bot.
Но давай обо всём по порядку!
Создаём бота в Telegram.
1) Ищем в поиске Telegram бота по нику @botfather. Этот бот ответственен за регистрацию всех остальных ботов;
2) Отправляем ему /newbot и начинаем создание бота;
3) Отправляем имя бота (оно может быть любым) и ник бота (обязательно должен оканчиваться на «bot»). Если у тебя выходит ошибка, то значит этот ник занят. Пробуй другой.
4) Получаем токен бота (скопируй этот токен и никому не давай😅).
Скриншот ниже (токен выделен красной рамкой).
Супер! Бот создан и уже доступен внутри Telegram по нику. Можешь вбить в поиске и убедиться. Также ты можешь найти его по ссылке t.me/НикТвоегоБота. Например на скриншоте я зарегистрировал SayMyAddressBot, значит его ссылка t.me/SayMyAddressBot. Сохрани такую ссылку с ником твоего бота. Скоро она нам пригодится.
Отлично. С ботом разобрались.
Обратный геокодинг от Яндекса.
Я надеюсь, что у тебя есть аккаунт на Яндексе. Если нет, то тебе сюда.
Итак. Как работает обратный геокодинг от Яндекса?
Всё очень просто. Нужно отправить GET запрос с координатами и получить в ответ адрес.
Вот пример такого запроса:
Что мы тут видим?
Запрос:
https://geocode-maps.yandex.ru/1.x/
Параметры:
- format: в каком формате возвращать данные. В данном случае json;
- lang: язык возвращаемых данных. В данном случае ru_RU (русский);
- kind: вид адреса. В данном случае house (точность до дома);
- geocode: координаты (сначала идет долгота, затем широта);
- apikey: токен для доступа.
P.S.: параметров гораздо больше, но нам они не нужны. Подробнее можешь почитать тут.
Просто, правда? Послал запрос с координатами, получил адрес 😊.
Как видишь у нас есть все данные кроме токена. Займемся его получением!
Получаем токен.
1) Заходим на страницу разработчика и входим в кабинет (аккаунт на Яндексе у тебя уже есть).
2) Получилось? Отлично. Далее ты увидишь вот такую страницу.
Жми желтую кнопку «Подключить API»
3) Теперь нужно выбрать какой именно токен нам нужен.
Выбирай «JavaScript API и HTTP геокодер». За ним мы и пришли.
4) Далее заполняем формочку твоими данными.
В поле «Ссылка на ваш сайт» пиши ссылку на своего бота, которую мы сохранили ранее.
Ну и тыкай кнопку «Продолжить».
5) Тебе должно всплыть окошко с сообщением об успешной регистрации.
Жми «Перейти к API».
6) Вот и всё. На открывшейся странице уже лежит наш искомый токен геокодера (выделил красной рамкой). Его тоже сохрани и никому не давай.
Токен активируется через 15 минут после создания. Можешь прямо в браузере (Chrome, Safari или что там у тебя) вбить (не забудь подставить свой токен в конце).
и получить ответ в json виде:
Пол дела сделано. У нас есть и Telegram бот (с его токеном) и геокодер (с его токеном).
Теперь с помощью Python мы их объединим!
Python у тебя уже установлен? Если нет, то тебе сюда.
Получаем адрес по координатам на Python.
В Python есть библиотека requests и она позволяет посылать запросы (как ты только что делал в браузере). Это нам подходит.
1) Открывай консоль (терминал) и устанавливай requests с помощью команды:
Подробнее тут.
2) Теперь нужно будет написать небольшой код на Python для получения адреса по координатам.
Открывай свою среду разработки или просто текстовый файл (нужно будет сохранить его с окончанием. py, а не. txt). Назовём файл main.py.
И добавляй туда этот код. Он полностью расписан в комментариях.
3) В консоли (терминале) переходим в папку с нашим файлом через команду «cd» (у меня он лежит в папке Documents/Python/).
И запускаем файл с помощью «python3».
Как результат, ты получишь адрес координат из кода.
Мы почти закончили! Осталось совсем немного.
Программируем Telegram бота на Python
Здесь в целом всё точно также, как и в предыдущей части.
Нам необходимо:
- Установить библиотеку python-telegram-bot для управления нашим ботом.
- Написать немного кода.
Поехали!
Установка библиотеки python-telegram-bot
1) Снова открывай консоль (терминал) и устанавливай python-telegram-bot с помощью команды:
Подробнее тут.
2) Пришло время написать код нашего бота. Я снова всё опишу в комментариях (не забудь поставить токен геокодера и токен бота в нужных местах в коде)!
3) Создаем файл main_bot.py и сохраняем этот код в нём.
4) В консоли (терминале) переходим в папку с нашим файлом через команду «cd» (у меня он лежит в папке Documents/Python/).
5) И снова запускаем файл с помощью «python3». Теперь уже это файл нашего готового бота!
Всё! Заходи в своего бота в Telegram (ищи по нику) и используй🤩🥳.
Моего бота можно посмотреть тут @SayMyAddressBot.
P. S. Это моя первая инструкция на портале. Старался сделать так, чтобы было понятно даже совсем начинающим. Спасибо за то, что прочёл до конца!
Начну с вопроса - а зачем такой бот нужен? Любая онлайн карта без проблем справляется с определением адреса по координатам.
Конечно можно сказать, что это pet project и основной смысл в обучении, но зачем это тогда постить? Статья видимо рассчитана на крайне узкую прослойку начинающих программистов, которые уже вроде что-то умеют, но ещё не написали ни одного полноценного скрипта, который бы выполнял какую-то полезную функцию.
Автор явно сам является начинающим программистом, а уже хочет научить чему-то других. Причём библиотека для работы с api телеги используется далеко не самая топовая, но в этом ничего плохого нет - как говорится на вкус и цвет.
Собственно я клоню к тому, что если автор хочет начать постить статьи о программировании, и сам при этом является начинающим программистом, то стоило начать с цикла статей с соответствующей тематикой, а-ля "Я являюсь программистом такого-то уровня и поставил перед собой задачу достичь такой-то цели. Буду рад советам в комментариях".
Крайне простой и (без обид, но сам понимаешь) абсолютно бесполезный тг-бот, коих сотни тысяч, а то и миллионы, с очень узкой специализацией конечно не тянет на такую цель.
А что тянет?, - Ну например было бы гораздо круче, если был выбран такой функционал бота, в котором нужно задействовать базы данных. И которого потом можно было бы интегрировать с сайтом или мобильным приложением.
В любом случае я не пытаюсь критиковать автора и уж тем более не хочу обидеть. Просто хотелось бы увидеть более осмысленный и интересный материал в этой области, а не подобное ребячество. Это было бы полезно, как для самого автора, так и для всех читателей.
Привет! Спасибо за критику. Пост в рамках конкурса для начинающих. Можешь посмотреть наши работы https://t.me/EngJackBot, https://t.me/OzyBot, https://t.me/ArzonAptekaBot. Но расписать создание таких ботов по простому - сложновато (да и только "профи" поймут всё), поэтому хотел скорее для широкой аудитории, чтобы побольше ребят не уходили расстроенные, а пробовали и понимали, что все возможно).
А бот из статьи используют уже несколько компаний для получения адреса. Т.к им клиенты скидывают локации (у водителей гонит интернет и навигатор не открывается, в регионах с плохим интернетом это боль) и многие не могут или забывают назвать точный адрес. При этом множество мелких бизнесов работают именно через Телеграм. Не все диджитализированы по максимуму;)
Послушай токсик, нормальная статься, мне лично было интересно взглянуть, если таких как ты слушать то никто ничего вообще не запостит и не выложит никогда.
Какая сейчас топовая библиотека для тг-бота и чем плоха эта библиотека?
Ещё бы с фотки координаты мог сканировать )
Рай закладчика
Все очень четко и просто объяснили. Спасибо!
Комментарий удален модератором
Скажите пожалуйста, как вытащить из json файла, дающегося при запросе, город пользователя? Я просто хочу вытащить его из GeocoderMetaData, потом Component и locality, но не входит
Статья очень дельная!!!!
Автору огромный респект.
А вы не сталкивались с oAuth авторизацией Уяндекса? Как внедрить невпихнуемое, когда кодирование запроса не в json a x-www-form-urlencoded???