Бот в telegram принимает "левое" сообщение от пользователя

Павел Вовк

Новичок
Пользователь
Апр 8, 2020
5
1
3
Windows 10, python 3.74

Привет всем. Я создал код бота для отправки сообщения пользователю ТГ чата с температурой в выбранном городе.
Идея такая: пользователь пишет "1" -> бот спрашивает какой город -> обрабатывает инфу с модулем pyowm -> отвечает пользователю в чат.

сам код:

Python:
import telebot
import config

import pyowm

bot = telebot.TeleBot(config.TOKEN )

owm = pyowm.OWM('30c4998aa320f683f2c2b00fbc2b35b4', language = 'ru')

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


def weather_place(message):
    if message =='1':
        bot.send_message(message.from_user.id, 'Назови свой город')
        observation = owm.weather_at_place(message.text)
        w = observation.get_weather()
        temp_place = w.get_temperature('celsius')['temp']

        bot.send_message(message.from_user.id, 'Средняя температура в городе '+ message.text + ' сегодня составляет ' + str(temp_place) + ' ℃ ')

bot.polling(none_stop = True)

При выполнении возникает ошибка, сообщающая, что город "1" не найден.
Суть такая: и первое сообщение от пользователя ( '1' ) и второе ( указание города ) являются "message.text" (который и обрабатывает модуль pyowm). Но обработка всегда приходится на сообщение '1', а не на второе сообщение с городом.
Не знаю, как это исправить. Помогите пожалуйста.
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Можно попробовать разделить запросы. На 1 бот будет отправлять - 'назови свой город', а на остальные сообщения пытаться получить погоду:
Python:
import telebot
import config
import pyowm


bot = telebot.TeleBot(config.TOKEN)
owm = pyowm.OWM('30c4998aa320f683f2c2b00fbc2b35b4', language='ru')


@bot.message_handler(commands=['1'])
def handler_for_command(message):
    bot.send_message(message.from_user.id, 'Назови свой город')


@bot.message_handler(content_types=["text"])
def weather_place(message):
    try:
        observation = owm.weather_at_place(message.text)
    except:
        bot.send_message(message.from_user.id, 'Не могу получить данные для города: ' + message.text)
    else:
        w = observation.get_weather()
        temp_place = w.get_temperature('celsius')['temp']

    bot.send_message(message.from_user.id, 'Средняя температура в городе '+ message.text + ' сегодня составляет ' + str(temp_place) + ' ℃ ')


bot.polling(none_stop = True)
 
  • Мне нравится
Реакции: Павел Вовк

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот еще пример:
Python:
import config
import UserAsks

from time import sleep

import telebot
import pyowm

bot = telebot.TeleBot(config.TOKEN)
owm = pyowm.OWM('30c4998aa320f683f2c2b00fbc2b35b4', language='ru')


@bot.message_handler(commands=UserAsks.hello_list)
def get_hello_messages(message):
        sleep(1)
        bot.send_message(message.from_user.id, 'Здравствуй! Я - железобетонный помошник. ')
        sleep(1)
        bot.send_message(message.from_user.id, 'Я могу быть полезен для тебя =) ')
        sleep(1)
        bot.send_message(message.from_user.id, 'Чтобы узнать, что я умею, напиши в чат "функции"')


@bot.message_handler(commands=['функции'])
def get_functions(message):
        sleep(1)
        bot.send_message(message.from_user.id, 'Сейчас у меня функций немного: ')
        sleep(1)
        bot.send_message(message.from_user.id, '1) Узнать температуру воздуха в любом городе планеты.')
        sleep(1)
        bot.send_message(message.from_user.id, '2) в разработке...')
        sleep(1)
        bot.send_message(message.from_user.id, 'Чтобы я выполнил определенную функцию, напиши в чат ее порядковый номер.')


@bot.message_handler(commands=['1'])
def get_first(message):
    msg = bot.reply_to(message, 'Какой город тебе нужен?')
    bot.register_next_step_handler(msg, get_weather)


def get_weather(message):
    try:
        observation = owm.weather_at_place(message.text)
    except:
        bot.send_message(message.from_user.id, 'Не могу получить данные для города: ' + message.text)
    else:
        w = observation.get_weather()
        temp_place = w.get_temperature('celsius')['temp']

    bot.send_message(message.from_user.id, 'Средняя температура в городе '+ message.text + ' сегодня составляет ' + str(temp_place) + ' ℃ ')


@bot.message_handler(commands=['2'])
def get_second(message):
    bot.send_message(message.from_user.id, 'в разработке...')


@bot.message_handler(content_types=["text"])
def get_text_content(message):
    bot.send_message(message.from_user.id, 'Странная команда... Ты уже поздоровался со мной? =)')


bot.polling(none_stop=True)
 

Павел Вовк

Новичок
Пользователь
Апр 8, 2020
5
1
3
Можно попробовать разделить запросы. На 1 бот будет отправлять - 'назови свой город', а на остальные сообщения пытаться получить погоду:
Python:
import telebot
import config
import pyowm


bot = telebot.TeleBot(config.TOKEN)
owm = pyowm.OWM('30c4998aa320f683f2c2b00fbc2b35b4', language='ru')


@bot.message_handler(commands=['1'])
def handler_for_command(message):
    bot.send_message(message.from_user.id, 'Назови свой город')


@bot.message_handler(content_types=["text"])
def weather_place(message):
    try:
        observation = owm.weather_at_place(message.text)
    except:
        bot.send_message(message.from_user.id, 'Не могу получить данные для города: ' + message.text)
    else:
        w = observation.get_weather()
        temp_place = w.get_temperature('celsius')['temp']

    bot.send_message(message.from_user.id, 'Средняя температура в городе '+ message.text + ' сегодня составляет ' + str(temp_place) + ' ℃ ')


bot.polling(none_stop = True)

Пришло озарение=) паралельно с твоим ответом решил проблему. Просто изменил имя аргументов, чтобы чисто для города. Фишка в том, что это дополнительный модуль к основному коду. Когда диалог в основном коде приводит к тому, что нужно написать "1", запускается код из модуля (где уже другой аргумент, во избежание ошибок - не message, а city_place). Кажется логичным, но теперь этот отдельный модуль с погодой запускается первым, и на любой запрос от пользователя в чате - начинается поиск погоды.
Код ниже, и сори, что с темы на тему. Только недавно занимаюсь, и очевидные вещи не очевидными кажутся.


Python:
import config
import UserAsks

import weather


from time import sleep

import telebot


bot = telebot.TeleBot(config.TOKEN )

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

def get_text_messages(message):
    if message.text in UserAsks.hello_list:
        sleep(1)
        bot.send_message(message.from_user.id, 'Здравствуй! Я - железобетонный помошник. ')
        sleep(1)
        bot.send_message(message.from_user.id, 'Я могу быть полезен для тебя =) ')
        sleep(1)
        bot.send_message(message.from_user.id, 'Чтобы узнать, что я умею, напиши в чат "функции"')
    elif message.text == 'функции':
        sleep(1)
        bot.send_message(message.from_user.id, 'Сейчас у меня функций немного: ')
        sleep(1)
        bot.send_message(message.from_user.id, '1) Узнать температуру воздуха в любом городе планеты.')
        sleep(1)
        bot.send_message(message.from_user.id, '2) в разработке...')
        sleep(1)
        bot.send_message(message.from_user.id, 'Чтобы я выполнил определенную функцию, напиши в чат ее порядковый номер.')


    elif message.text == '1':
        bot.send_message(message.from_user.id, 'Какой город тебе нужен?')
        return weather.weather_place(city_place)

       
    else:
        bot.send_message(message.from_user.id, 'Странная команда... Ты уже поздоровался со мной? =)')

bot.polling(none_stop = True)
 
Последнее редактирование модератором:
  • Мне нравится
Реакции: Student

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
@Павел Вовк если вы получили нужный ответ, то выберите данный ответ как "правильный". Нажмите на иконку трофея слева от ответа.
 

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