G
G
garadon2021-06-11 18:13:29
Python
garadon, 2021-06-11 18:13:29

Telegram bot. How can the information entered by the user be read?

It is necessary to read the information entered by the user in the cityconfirm function and pass this data to getweather, can you tell me how to do this?)

I'm still quite new to python and to creating bots too, so don't swear too much at the code)

Thank you very much in advance!

keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
button_city = types.KeyboardButton(text="Ввести назву свого міста")
button_geo = types.KeyboardButton(text="Відправити геолокацію", request_location=True)
keyboard.add(button_city, button_geo)

keyboard2 = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
button_today = types.KeyboardButton(text="Сьогодні")
button_tomorrow = types.KeyboardButton(text="Завтра")
button_week = types.KeyboardButton(text="Тиждень")
button_setings = types.KeyboardButton(text="Налаштування")
keyboard2.add(button_today, button_tomorrow, button_week, button_setings)


@bot.message_handler(commands=['help'])
def help(message):

  bot.send_message(message.chat.id, '/start - Запуск бота\n/help - Команди бота\n Для того,' + 
        'щоб дізнатися погоду напишіть назву свого міста, або відправте свою геолокацію')

@bot.message_handler(commands=['start'])
def start (message):

  bot.send_message(message.chat.id, 'Мої вітання, ' + str(message.from_user.first_name) + '! ' + '\n' +
   'Я TeleWeatherBot' + '\n' +
   'Я допоможу тоді дізнатися погоду в потрібному місті ☀️☁️☔️❄️' )
  msg = bot.send_message(message.chat.id, 'Для початку введи назву свого міста, або відправте свою геолокацію :', reply_markup=keyboard)

  bot.register_next_step_handler(msg, cityenter)

def cityenter(message):

  if message.text == 'Ввести назву свого міста':
    msg = bot.send_message(message.chat.id, 'Введіть назву свого міста')
    bot.register_next_step_handler(msg, cityconfirm)

  elif message.text:
    msg = bot.send_message(message.chat.id, 'Натисніть на потрібну для вас кнопку!')
    bot.register_next_step_handler(msg, cityenter)

def cityconfirm(message):

  try:
    city_name = message.text
    params = {'APPID': api_weather, 'q': city_name, 'units': 'metric', 'lang': 'ua'}
    result = requests.get(url, params=params)
    weather = result.json()

    if weather["main"]['temp'] < 10:
      status = "Зараз холодно!"
    
    bot.send_message(message.chat.id, 'Ваша локація успішно збережена!', reply_markup = types.ReplyKeyboardRemove())

    msg = bot.send_message(message.chat.id, 'Виберіть потрібну для вас кнопку', reply_markup = keyboard2)


    bot.register_next_step_handler(msg, getweather)

  except:
    msg = bot.send_message(message.chat.id, "Місто " + city_name + " не знайдено!" + "\n"
    "Введіть назву міста заново, або відправте геолокацію")
  
    bot.register_next_step_handler(msg, cityconfirm)

def getweather(message):

    if message.text == 'Сьгодні':
      city_name = message.text
      params = {'APPID': api_weather, 'q': city_name, 'units': 'metric', 'lang': 'ru'}
      result = requests.get(url, params=params)
      weather = result.json()


      if weather["main"]['temp'] < 10:
        status = "Зараз холодно!"
      elif weather["main"]['temp'] < 20:
        status = "Зараз прохолодно!"
      elif weather["main"]['temp'] > 38:
        status = "Зараз жарко!"
      else:
        status = "Зараз чудова температура!"

      bot.send_message(message.chat.id, 
        "В місті " + str(weather["name"]) + " температура: " + str(float(weather["main"]['temp'])) + " ℃\n" + 
        "Максимальна температура: " + str(float(weather['main']['temp_max'])) + " ℃\n" + 
        "Мінімальна температура: " + str(float(weather['main']['temp_min'])) + " ℃\n" + 
        "Швидкість вітру: " + str(float(weather['wind']['speed'])) + " м\с\n" + 
        "Тиск: " + str(float(weather['main']['pressure'])) + " Н/м²\n" + 
        "Вологість: " + str(int(weather['main']['humidity'])) + " %" + "\n" + 
        "Видимість: " + str(weather['visibility']) + " м.\n" + 
        "Зараз: " + str(weather['weather'][0]["description"]) + ".\n\n" + status)


if __name__ == '__main__':
  bot.polling(none_stop=True, interval = 0)

Answer the question

In order to leave comments, you need to log in

1 answer(s)
O
o5a, 2021-06-14
@o5a

register_next_step_handler поддерживает указание дополнительных параметров вызова функции:

bot.register_next_step_handler(msg, getweather, city_name)

Соответственно надо будет изменить саму getweather, чтобы понимала этот параметр

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question