Telegram бот на python не выводит данные

Рейтинг: 0Ответов: 1Опубликовано: 30.04.2023

Телеграм-бот не выводит данные для показа пользователю, хотя сам парсер в Pycharm, на основе которого был разработан ТГ бот все данные исправно выводит на экран.

import telebot
from telebot import types
import requests
from bs4 import BeautifulSoup

# создаем объект бота
bot = telebot.TeleBot('#')


# обработчик команды /start
@bot.message_handler(commands=['start'])
def start(message):
    bot.reply_to(message, 'Введите название города где вы хотите узнать погоду...')
    bot.register_next_step_handler(message, category)


# обработчик нажатия на кнопку первого уровня
@bot.message_handler(content_types=['text'])
def category(message):
    city = message.text.lower()
    bot.reply_to(message, city)
    if message.text == city:
        # создаем клавиатуру первого уровня
        keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
        button1 = types.KeyboardButton('На сегодня')
        button2 = types.KeyboardButton('На завтра')
        button3 = types.KeyboardButton('Неделя')
        keyboard.add(button1, button2, button3)
        # отправляем сообщение с клавиатурой первого уровня
        bot.send_message(message.chat.id, 'Выберите категорию:', reply_markup=keyboard)

        if message.text == 'На сегодня':
            url = f'https://meteolabs.ru/погода_{city}/сегодня/'
            data = requests.get(url).text
            block = BeautifulSoup(data, 'lxml')
            city = block.find('h1', class_='h1')
            # print(city.text.strip())
            get_tiss = (city.text.strip())
            params = block.find('div', class_='wthSBlockWrapper').find_all('div', class_='wthSBlock wthSBlock_list')
            # print(len(params))
            day = params[0].text.strip()
            # print(day)
            night = params[1].text.strip()
            # print(night)
            bot.send_message(message.chat.id, get_tiss)
            bot.send_message(message.chat.id, day)
            bot.send_message(message.chat.id, night)
        elif message.text == 'На завтра':
            url = f'https://meteolabs.ru/погода_{city}/завтра/'
            data = requests.get(url).text
            block = BeautifulSoup(data, 'lxml')
            city = block.find('h1', class_='h1')
            # print(city.text.strip())
            get_tiss = (city.text.strip())
            params = block.find('div', class_='wthSBlockWrapper').find_all('div', class_='wthSBlock wthSBlock_list')
            # print(len(params))
            day = params[0].text.strip()
            # print(day)
            night = params[1].text.strip()
            # print(night)
            bot.send_message(message.chat.id, get_tiss)
            bot.send_message(message.chat.id, day)
            bot.send_message(message.chat.id, night)

        elif message.text == 'Категория 3':
            url = f'https://meteolabs.ru/погода_{city}/неделя/'
            data = requests.get(url).text
            block = BeautifulSoup(data, 'lxml')
            city = block.find('h1', class_='h1')
            # print(city.text.strip())
            get_tiss = (city.text.strip())
            params = block.find('div', class_='wthSBlockWrapper').find_all('div', class_='wthSBlock wthSBlock_list')
            # print(len(params))
            day = params[0].text.strip()
            # print(day)
            night = params[1].text.strip()
            # print(night)
            bot.send_message(message.chat.id, get_tiss)
            bot.send_message(message.chat.id, day)
            bot.send_message(message.chat.id, night)


bot.polling(none_stop=True)

Ответы

▲ 0Принят

твой запрос возвращает 404 ошибку, так как в

     
     if message.text == 'На сегодня':
            url = f'https://meteolabs.ru/погода_{city}/сегодня/'

В переменной city будет 'на сегодня' потому что фактически вы переопределяете переменную через message.text. Хорошим вариантом будет обработка все не в одной функции, а в нескольких, чтобы была возможность масштабировать и изменять кнопки. Как пример нажатие кнопки отслеживать не текстовым методом, а с помощью callback, а значение города можно сохранить в словарь. В качестве примера оставлю код, для остальных кнопок можно сделать аналогично.

    city_1 = {}

# обработчик нажатия на кнопку первого уровня
@bot.message_handler(content_types=['text'])
def category(message, city_12=city_1):
    city = message.text.lower()
    city_12['city'] = city
    bot.reply_to(message, city)
    if message.text.lower() == city:
        # создаем клавиатуру первого уровня
        markup = types.InlineKeyboardMarkup()
        button1 = types.InlineKeyboardButton(text='На сегодня', callback_data='today')
        button2 = types.InlineKeyboardButton(text='На Завтра', callback_data='qwerty')
        button3 = types.InlineKeyboardButton(text='Неделя', callback_data='week')
        markup.add(button1, button2, button3)
        # отправляем сообщение с клавиатурой первого уровня
        bot.send_message(message.chat.id, 'Выберите категорию:', reply_markup=markup)


@bot.callback_query_handler(func=lambda call: True)
def query_handler(call):
    if call.data == 'today':
        url = f'https://meteolabs.ru/погода_{city_1["city"]}/сегодня/'
        print(url)
        data = requests.get(url).text
        block = BeautifulSoup(data, 'lxml')
        city = block.find('h1', class_='h1')
        # print(city.text.strip())
        get_tiss = (city.text.strip())
        params = block.find('div', class_='wthSBlockWrapper').find_all('div', class_='wthSBlock wthSBlock_list')
        # print(len(params))
        day = params[0].text.strip()
        # print(day)
        night = params[1].text.strip()
        # print(night)
        bot.send_message(call.message.chat.id, get_tiss)
        bot.send_message(call.message.chat.id, day)
        bot.send_message(call.message.chat.id, night)


bot.polling(none_stop=True)

Плюс в условии, где вы определяете город, лучше так же поставить lower(), так как вводимый город может быть с большой буквы