S
S
Sova_3452021-08-20 23:25:10
Parsing
Sova_345, 2021-08-20 23:25:10

How to enter a city for further goods in a telegram bot, in python?

I'm new to programming, I would like to ask knowledgeable people how to make it so that after you click on a button in a menu, for example "Products", the message "Enter your city" appears. After you enter, goods from this city are sent to you, all goods in all cities are the same.

I also have a script to search the database after writing the city.

Geocoder - Yandex Maps

How to make this code so that it appears after pressing a button, for example, "Products". and removed + removed goods from this city.

#Подлкючаем библиотеку requests
import requests
#Подключаем нужные для бота модули из библиотеки telegram.ext
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

#это наша функция для получения адреса по координатам. С ней мы знакомы.
def get_address_from_coords(coords):
    PARAMS = {
        "apikey": "ТОКЕН_ГЕОКОДЕРА",
        "format": "json",
        "lang": "ru_RU",
        "kind": "house",
        "geocode": coords
    }

    try:
        r = requests.get(url="https://geocode-maps.yandex.ru/1.x/", params=PARAMS)
        json_data = r.json()
        address_str = json_data["response"]["GeoObjectCollection"]["featureMember"][0]["GeoObject"]["metaDataProperty"][
            "GeocoderMetaData"]["AddressDetails"]["Country"]["AddressLine"]
        return address_str

    except Exception as e:
        #единственное что тут изменилось, так это сообщение об ошибке.
        return "Не могу определить адрес по этой локации/координатам.\n\nОтправь мне локацию или координаты (долгота, широта):"


#Эта функция будет использоваться когда человек первый нажал в боте START
def start(update, context):
    #эта строка отправляет сообщение пользователю с просьбой послать локацию или координаты
    update.message.reply_text('Отправь мне локацию или координаты (долгота, широта):')

#Эта функция будет использоваться, если пользователь послал в бота любой текст.
#Мы ожидаем координаты, но если прийдет что-то другое не страшно, ведь мы описали в функции получения адреса возвращение ошибки в случае чего.  
def text(update, context):
    #получаем текст от пользователя
    coords = update.message.text
    #отправляем текст в нашу функцио получения адреса из координат
    address_str = get_address_from_coords(coords)
    #вовщращаем результат пользователю в боте
    update.message.reply_text(address_str)

#Эта функция будет использоваться, если пользователь послал локацию.
def location(update, context):
    #получаем обьект сообщения (локации)
    message = update.message
    #вытаскиваем из него долготу и ширину
    current_position = (message.location.longitude, message.location.latitude)
    #создаем строку в виде ДОЛГОТА,ШИРИНА
    coords = f"{current_position[0]},{current_position[1]}"
    #отправляем координаты в нашу функцию получения адреса
    address_str = get_address_from_coords(coords)
    #вовщращаем результат пользователю в боте
    update.message.reply_text(address_str)

#Это основная функция, где запускается наш бот
def main():
    #создаем бота и указываем его токен
    updater = Updater("ТОКЕН_БОТА", use_context=True)
    #создаем регистратор событий, который будет понимать, что сделал пользователь и на какую функцию надо переключиться.
    dispatcher = updater.dispatcher

    #регистрируем команду /start и говорим, что после нее надо использовать функцию def start
    dispatcher.add_handler(CommandHandler("start", start))
    #регистрируем получение текста и говорим, что после нее надо использовать функцию def text
    dispatcher.add_handler(MessageHandler(Filters.text, text))
    #регистрируем получение локации и говорим, что после нее надо использовать функцию def location
    dispatcher.add_handler(MessageHandler(Filters.location, location))
    #запускаем бота
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    #запускаем функцию def main
    main()

Answer the question

In order to leave comments, you need to log in

1 answer(s)
I
Ilhomidin Bakhoraliev, 2021-08-23
@ilhomidin

All you need is the ConversationHandler, which is a complex handler that stores the state of the conversation with the user.
This is an example from the documentation:
https://github.com/python-telegram-bot/python-tele...

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question