Прошу помощи

ilich

Новичок
Пользователь
Апр 12, 2020
4
1
3
Изучаю Python
Пробую писать телеграмм бота

  1. Указать свою операционную систему (Windows)
  2. Указать версию Python ( 3.8)
  3. Вставьте фрагмент кода который у вас имеется на данный момент (Ниже)


Python:
import pyowm

import telebot



owm=pyowm.OWM('ХХХХХХХХХХХХХХХХХХХХХХХХХ', language = 'ru')



bot = telebot.TeleBot("ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ")



keyboard = telebot.types.ReplyKeyboardMarkup(True, True)

keyboard.row("Cейчас", "Через 3 часа")



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

def start_message(message):

    bot.send_message(message.chat.id,'Привет, я готов к работе! Напиши какой город ищем: ')



@bot.message_handler(content_types=['text'])



def send_text(message):

    bot.send_message(message.chat.id,'Показывать текущую погоду или прогноз на ближайшие 3 часа? выбирай: ', reply_markup=keyboard)

    if message.text.lower()  == "сейчас":

        bot.register_next_step_handler(message, send_echo)

    elif message.text.lower() == "Через 3 часа":

        bot.register_next_step_handler(message, send_text2)

    else:

        bot.register_next_step_handler(message, send_text2)



def send_echo(message):

    try:

        observation = owm.weather_at_place(message.text)

        w = observation.get_weather()

        temp=w.get_temperature('celsius')['temp']

        wind=w.get_wind()['speed']

        hum=w.get_humidity()

        #rein=w.get_rain()

        #snow=w.get_snow()

        #icon=w.get_weather_icon_name()

        #icon2=w.get_weather_icon_url()



        answer = f"В городе {message.text} сейчас {w.get_detailed_status()} \n"

        answer += f"Температура около {round(temp)} градусов\n\n"

        #answer = f"{icon2}\n\n"

        answer += f"Ветер: {wind} метров в секунду\n\n"

        answer += f"Влажность: {hum} %\n\n"

        #answer += f"Дождь: {rein} \n\n"

        #answer += f"Снег: {snow} \n\n"



        if temp <0:

            answer += 'Мороз, надевай все что есть теплого дома )))'

        elif temp<10:

            answer += 'Очень холодно, оденься потеплее))'

        elif temp<23:

            answer += 'Прохладно, лучше оденься:)'

        else:

            answer += 'На улице комфортно, можно одевать летние вещи:)'

        if wind <3:

            answer += 'Слабый ветер. Практически не заметный'

        elif wind <10:

            answer += 'Ветер умеренный. Температура ощущается ниже чем есть'

        elif wind <17:

            answer += 'Ветер сильный. Может останешся дома?'

        else:

            answer += 'На улице шторм или УРАГАН. Сиди дома!'



        bot.send_message(message.chat.id, answer)

    except pyowm.exceptions.api_response_error.NotFoundError:

        bot.send_message(message.chat.id, 'Такой город мне не известен, попробуй другой :(')



    bot.send_message(message.chat.id,'Напиши какой город ищем: ')



def send_text2(message):

    bot.send_message(message.chat.id,'Это еще не умею: ')



    bot.send_message(message.chat.id,'Напиши какой город ищем: ')



bot.polling(none_stop = True)



При выполнении не понимает вот эту строчку
bot.send_message(message.chat.id,'Показывать текущую погоду или прогноз на ближайшие 3 часа? выбирай: ', reply_markup=keyboard)
if message.text == "Cейчас":
bot.register_next_step_handler(message, send_echo)
На любой ввод значения из бота идет по else. и соответственно не исполняется команда bot.register_next_step_handler(message, send_echo)

Что я делаю не так???
 
Последнее редактирование:

God

Уже не совсем ламер.
Пользователь
Апр 11, 2020
91
14
8
1. Оформите код как положено на форуме.
2. Запихните код в спойлер.
3. Пришлите текст ошибки.
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Попробуйте вот так:
Python:
import pyowm
import telebot

owm = pyowm.OWM('ХХХХХХХХХХХХХХХХХХХХХХХХХ', language='ru')
bot = telebot.TeleBot("ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ")


@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Привет, я готов к работе! Напиши какой город ищем: ')


@bot.message_handler(content_types=['text'])
def send_text(message):
    markup = telebot.types.InlineKeyboardMarkup()
    markup.add(telebot.types.InlineKeyboardButton(text="Cейчас", callback_data='%s %s' % ("Сейчас", message.text)))
    markup.add(telebot.types.InlineKeyboardButton(text="Через 3 часа", callback_data='%s %s' % ("Через 3 часа", message.text)))
    bot.send_message(message.chat.id, text="Показывать текущую погоду или прогноз на ближайшие 3 часа? выбирай: ", reply_markup=markup)


@bot.callback_query_handler(func=lambda call: True)
def query_handler(call):

    bot.answer_callback_query(callback_query_id=call.id, text='...')
    answer = ''
    if "Cейчас" in call.data:
        try:
            observation = owm.weather_at_place(call.data.split(' ')[1])
            w = observation.get_weather()
            temp = w.get_temperature('celsius')['temp']
            wind = w.get_wind()['speed']
            hum = w.get_humidity()

            answer = f"В городе {call.data.split(' ')[1]} сейчас {w.get_detailed_status()} \n"
            answer += f"Температура около {round(temp)} градусов\n\n"
            answer += f"Ветер: {wind} метров в секунду\n\n"
            answer += f"Влажность: {hum} %\n\n"

            if temp < 0:
                answer += 'Мороз, надевай все что есть теплого дома )))'
            elif temp < 10:
                answer += 'Очень холодно, оденься потеплее))'
            elif temp < 23:
                answer += 'Прохладно, лучше оденься:)'
            else:
                answer += 'На улице комфортно, можно одевать летние вещи:)'

            if wind < 3:
                answer += 'Слабый ветер. Практически не заметный'
            elif wind < 10:
                answer += 'Ветер умеренный. Температура ощущается ниже чем есть'
            elif wind < 17:
                answer += 'Ветер сильный. Может останешся дома?'
            else:
                answer += 'На улице шторм или УРАГАН. Сиди дома!'

            bot.send_message(call.message.chat.id, answer)

        except pyowm.exceptions.api_response_error.NotFoundError:
            bot.send_message(call.message.chat.id, 'Такой город мне не известен, попробуй другой :(')
        
    elif "Через 3 часа" in call.data:
        bot.send_message(call.message.chat.id, 'Это еще не умею: ')
    else:
        bot.send_message(call.message.chat.id, 'Это еще не умею: ')

    bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id)


bot.polling(none_stop=True)
 
  • Wow!
Реакции: Student

ilich

Новичок
Пользователь
Апр 12, 2020
4
1
3
1. Оформите код как положено на форуме.
2. Запихните код в спойлер.
3. Пришлите текст ошибки.

Спасибо, исправил
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
При выполнении не понимает вот эту строчку
bot.send_message(message.chat.id,'Показывать текущую погоду или прогноз на ближайшие 3 часа? выбирай: ', reply_markup=keyboard)
if message.text == "Cейчас":
bot.register_next_step_handler(message, send_echo)
На любой ввод значения из бота идет по else. и соответственно не исполняется команда bot.register_next_step_handler(message, send_echo)
Что я делаю не так???
У Вас в функцию send_text(message) на момент проверки условия уже пришел message с городом и естественно он не равен "Сейчас" или
"Через 3 часа", вот и выполняется ветка else.
 

ilich

Новичок
Пользователь
Апр 12, 2020
4
1
3
У Вас в функцию send_text(message) на момент проверки условия уже пришел message с городом и естественно он не равен "Сейчас" или
"Через 3 часа", вот и выполняется ветка else.
Спасибо, не подскажете как это можно исправить?
 
  • Мне нравится
Реакции: Student

ilich

Новичок
Пользователь
Апр 12, 2020
4
1
3
Попробуйте вот так:
Python:
import pyowm
import telebot

owm = pyowm.OWM('ХХХХХХХХХХХХХХХХХХХХХХХХХ', language='ru')
bot = telebot.TeleBot("ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ")


@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Привет, я готов к работе! Напиши какой город ищем: ')


@bot.message_handler(content_types=['text'])
def send_text(message):
    markup = telebot.types.InlineKeyboardMarkup()
    markup.add(telebot.types.InlineKeyboardButton(text="Cейчас", callback_data='%s %s' % ("Сейчас", message.text)))
    markup.add(telebot.types.InlineKeyboardButton(text="Через 3 часа", callback_data='%s %s' % ("Через 3 часа", message.text)))
    bot.send_message(message.chat.id, text="Показывать текущую погоду или прогноз на ближайшие 3 часа? выбирай: ", reply_markup=markup)


@bot.callback_query_handler(func=lambda call: True)
def query_handler(call):

    bot.answer_callback_query(callback_query_id=call.id, text='...')
    answer = ''
    if "Cейчас" in call.data:
        try:
            observation = owm.weather_at_place(call.data.split(' ')[1])
            w = observation.get_weather()
            temp = w.get_temperature('celsius')['temp']
            wind = w.get_wind()['speed']
            hum = w.get_humidity()

            answer = f"В городе {call.data.split(' ')[1]} сейчас {w.get_detailed_status()} \n"
            answer += f"Температура около {round(temp)} градусов\n\n"
            answer += f"Ветер: {wind} метров в секунду\n\n"
            answer += f"Влажность: {hum} %\n\n"

            if temp < 0:
                answer += 'Мороз, надевай все что есть теплого дома )))'
            elif temp < 10:
                answer += 'Очень холодно, оденься потеплее))'
            elif temp < 23:
                answer += 'Прохладно, лучше оденься:)'
            else:
                answer += 'На улице комфортно, можно одевать летние вещи:)'

            if wind < 3:
                answer += 'Слабый ветер. Практически не заметный'
            elif wind < 10:
                answer += 'Ветер умеренный. Температура ощущается ниже чем есть'
            elif wind < 17:
                answer += 'Ветер сильный. Может останешся дома?'
            else:
                answer += 'На улице шторм или УРАГАН. Сиди дома!'

            bot.send_message(call.message.chat.id, answer)

        except pyowm.exceptions.api_response_error.NotFoundError:
            bot.send_message(call.message.chat.id, 'Такой город мне не известен, попробуй другой :(')
       
    elif "Через 3 часа" in call.data:
        bot.send_message(call.message.chat.id, 'Это еще не умею: ')
    else:
        bot.send_message(call.message.chat.id, 'Это еще не умею: ')

    bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id)


bot.polling(none_stop=True)

Увы, не заработало
 

Форум IT Специалистов