Теперь — открываем пункт «Настройки» в меню аппарата, и кликаем по строке «параметры разработчика» После чего, находим в нем функцию «Фиктивные местоположения» (он же может называться «симуляция местоположения» и др.) и включаем или разрешаем ее. Готово.
Как отправить геоданные в Telegram?
Создатель мессенджера Telegram Павел Дуров предоставил пользователям приложения для обмена сообщениями возможность делиться своей геолокацией в режиме реального времени. Такая возможность предоставляется временным сроком от 15 минут до 8 часов.
Если вы отправите сведение о своей геолокации в группу, тогда она будет видна всем участникам. Особенно такая возможность мессенджера является полезной при необходимости наглядно показать где вы сейчас находитесь. К примеру, вы опаздываете на совещание, и чтобы лишний раз вам не названивали с вопросом «Ты скоро?», вы можете отправить ему свою геолокацию, чтобы собеседник мог видеть ваше перемещение. Либо, когда на опен-эйр вы договорились встретиться с другом, но он никак не может вас найти, тогда отправка геоданных в Telegram придет вам в помощь.
Как отправлять геоданные в Telegram? Все достаточно просто:
- сперва запустите мессенджер Telegram на своем смартфоне. Выберите собеседника, с которым хотите поделиться геоданными;
- затем тапните на значок в виде скрепки, размещенный в нижнем правом углу экрана;
- после тапните на «Геопозиция» и выберите «Транслировать мою геопозицию»;
- вам осталось только выбрать время трансляции: 15 минут, 1 час, 8 часов;
теперь ваш собеседник будет видеть ваше перемещение в режиме реального времени.
Telegram бот на Python, работа с геолокацией пользователя
Вот и третья часть, где мы продолжим создавать телеграм бота с помощью Python и библиотеки requests . Сегодня вы узнаете как работать с геолокацией пользователя, и как с помощью бесплатного «API геокодера» определить адрес по координатам.
Функционал бота будем выглядеть следующим образом: Пользователь нажимает кнопку в боте и отправляет свою геолокацию. А в ответ к нему бот пишет, в каком городе он находится.
Это часть добавлена по просьбе одно из читателей сайта ramziv.com 🙂
Код телеграм бота
Перед тем как продолжить писать код, предлагаю убрать для удобства весь лишний функционал, что мы добавили в прошлых частях. Оставить только настраиваемую клавиатуру и ответ на приветствие.
Прошу вас обратить внимание на функцию run , я добавил новое условие, так как бот прекращал работу ошибкой, если вместо текста отправить ему файл, картинку или геолокацию. Данный код будет работать на Python 3.8 и выше.
#https://ramziv.com/blog/29 import requests import time import json TOKEN = ‘ТОКЕН’ URL = ‘https://api.telegram.org/bot’ def get_updates(offset=0): result = requests.get(f’/getUpdates?offset=’).json() return result[‘result’] def send_message(chat_id, text): requests.get(f’/sendMessage?chat_id= «keyboard»: [[«Привет», «Hello»]], «resize_keyboard»: True, «one_time_keyboard»: True>data = requests.post(f’/sendMessage’, data=data) def check_message(chat_id, message): if message.lower() in [‘привет’, ‘hello’]: send_message(chat_id, ‘Привет :)’) else: reply_keyboard(chat_id, ‘Я не понимаю тебя :(‘) def run(): update_id = get_updates()[-1][‘update_id’] # Сохраняем ID последнего отправленного сообщения боту while True: time.sleep(2) messages = get_updates(update_id) # Получаем обновления for message in messages: # Если в обновлении есть ID больше чем ID последнего сообщения, значит пришло новое сообщение if update_id < message[‘update_id’]: update_id = message[‘update_id’]# Сохраняем ID последнего отправленного сообщения боту if (user_message := message[‘message’].get(‘text’)): # Проверим, есть ли текст в сообщении check_message(message[‘message’][‘chat’][‘id’], user_message) # Отвечаем if __name__ == ‘__main__’: run()
Геолокация пользователя
Что бы получить геолокацию пользователя, добавим в нашу клавиатуру новую кнопку с текстом «Где я нахожусь» и укажем ключ request_location со значением True .
#https://ramziv.com/blog/29 def reply_keyboard(chat_id, text): reply_markup =< «keyboard»: [[«Привет», «Hello»], []], «resize_keyboard»: True, «one_time_keyboard»: True> data = requests.post(f’/sendMessage’, data=data)
Так же добавим новое условие в функцию run , что бы проверить, что вместо текста в сообщение была отправлена геолокация. Если условие истина, выведем на экран сообщение с координатами пользователя.
#https://ramziv.com/blog/29 def run(): update_id = get_updates()[-1][‘update_id’] # Сохраняем ID последнего отправленного сообщения боту while True: time.sleep(2) messages = get_updates(update_id) # Получаем обновления for message in messages: # Если в обновлении есть ID больше чем ID последнего сообщения, значит пришло новое сообщение if update_id < message[‘update_id’]: update_id = message[‘update_id’]# Сохраняем ID последнего отправленного сообщения боту if (user_message := message[‘message’].get(‘text’)): # Проверим, есть ли текст в сообщении check_message(message[‘message’][‘chat’][‘id’], user_message) # Отвечаем if (user_location := message[‘message’].get(‘location’)): # Проверим, если ли location в сообщении print(user_location)
Запустим, и проверим нашего бота.
Если нажать кнопку «Где я нахожусь», всплывает push сообщения, где телеграм спрашивает разрешение на отправку геолокации боту.
Нажимаем «Ок», и видим что в консоли появилось сообщение с координатами пользователя.
Все работает, теперь можно переходить к следующему этапу, где мы научимся определять адрес по координатам с помощью обратного геокодирования.
API геокодер
LocationIQ API: позволяет определять координаты и получать сведения об объекте по его адресу (прямое геокодирование) и наоборот, определять адрес объекта по его координатам (обратное геокодирование). Сервис предлагает бесплатный план, где разрешено делать 5000 запросов в день, с 2 запросами в секунду.
Зарегистрируемся, и получим токен.
Проверим как работает API, откроем в новой вкладке ссылку заменив токен и ранее полученные координаты пользователя.
https://eu1.locationiq.com/v1/reverse.php?key=lon=lat=format=json’, headers=headers).json() return f’Твое местоположение: ‘
Почти все готово, осталось изменить функцию run , что бы бот отправил пользователю сообщение с его местоположением, если в боте нажали кнопку «Где я нахожусь».
#https://ramziv.com/blog/29 import requests import time import json TOKEN = ‘ТОКЕН’ URL = ‘https://api.telegram.org/bot’ def get_updates(offset=0): result = requests.get(f’/getUpdates?offset=’).json() return result[‘result’] def send_message(chat_id, text): requests.get(f’/sendMessage?chat_id= «keyboard»: [[«Привет», «Hello»], []], «resize_keyboard»: True, «one_time_keyboard»: True> data = requests.post(f’/sendMessage’, data=data) def check_message(chat_id, message): if message.lower() in [‘привет’, ‘hello’]: send_message(chat_id, ‘Привет :)’) else: reply_keyboard(chat_id, ‘Я не понимаю тебя :(‘) def geocoder(latitude, longitude): token = ‘pk.токен’ headers = address = requests.get(f’https://eu1.locationiq.com/v1/reverse.php?key=lon= message[‘update_id’]: update_id = message[‘update_id’]# Присваиваем ID последнего отправленного сообщения боту if (user_message := message[‘message’].get(‘text’)): # Проверим, есть ли текст в сообщении check_message(message[‘message’][‘chat’][‘id’], user_message) # Отвечаем if (user_location := message[‘message’].get(‘location’)): # Проверим, если ли location в сообщении latitude = user_location[‘latitude’] longitude = user_location[‘longitude’] send_message(message[‘message’][‘chat’][‘id’], geocoder(latitude, longitude)) if __name__ == ‘__main__’: run()
Проверим как работает.
Ответ с местоположением выглядит смешно :), но это сделано для демонстрации. Вы можете в функции geocoder заменить address.get(«display_name») на address[«address»].get(«town») и в ответ получать только название города.
Конец
Теперь вы знаете как работать с геолокацией пользователя. Надеюсь полученный знания помогут вам реализовать, что ни будь интересное в вашем проекте. Если у вас есть пожелания для следующей части, прошу отпишите мне в обратной связи.
Комментарии
ballout
13 марта 2023
Привет, огромное спасибо за предоставленный код! очень помогло! Хотел спросить, как сделать чтобы когда я нажимал на «позицию» мне предоставлялась информация где я нахожусь и когда я бы нажимал на кнопку «погода» то бот также запрашивал геопозицию и выдавал мне только погоду в моем городе, на этом месте у меня полетела логика, так как когда я все сделал то у меня при нажатии на кнопку присылается сразу два сообщения, код внизу, буду очень благодарен если кто поможет!
Рамис
14 марта 2023
ballout
15 марта 2023
Источник: ramziv.com