не работает парсер погоды в телеграм боте
не работает нажмаю на кнопку новости их выдает а нажимаю на кнопку погоды он опять новости выдает как сделать чтобы нажимая на кнопку нововсти он выдавал погоду
import datetime
from aiogram import Bot, types, Dispatcher, executor
from bs4 import BeautifulSoup
import requests
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
open_weather_token = ''
bot = Bot(token='')
dp = Dispatcher(bot)
#команда старт
@dp.message_handler(commands=['start', 'help'])
async def start(message: types.message):
kb = [
[types.KeyboardButton(text="Новости")],
[types.KeyboardButton(text="Погода")]
]
keyboard = types.ReplyKeyboardMarkup(
keyboard=kb,
resize_keyboard=True,
input_field_placeholder="Выберите способ"
)
await bot.send_message(message.chat.id, 'Привет я бот который выдаст тебе самые акутальные новости, а также погоду, просто выбери нужное снизу', reply_markup=keyboard)
#парсер новостей
@dp.message_handler()
async def get_news(message):
url = 'https://news.rambler.ru'
page = requests.get(url)
soup = BeautifulSoup(page.text, "html.parser")
filteredNews = []
allNews = soup.findAll('a', class_='_6bF6i')
for data in allNews:
if data.find('div', class_='_1tnKf') is not None:
filteredNews.append(data.text)
for data in filteredNews:
await message.answer(data)
return filteredNews
@dp.message_handler()
async def get_weather(message: types.Message):
code_to_smile = {
"Clear": "Ясно \U00002600",
"Clouds": "Облачно \U00002601",
"Rain": "Дождь \U00002614",
"Drizzle": "Дождь \U00002614",
"Thunderstorm": "Гроза \U000026A1",
"Snow": "Снег \U0001F328",
"Mist": "Туман \U0001F32B"
}
try:
r = requests.get(
f"http://api.openweathermap.org/data/2.5/weather?q={message.text}&appid={open_weather_token}&units=metric"
)
data = r.json()
city = data["name"]
cur_weather = data["main"]["temp"]
weather_description = data["weather"][0]["main"]
if weather_description in code_to_smile:
wd = code_to_smile[weather_description]
else:
wd = "Посмотри в окно, не пойму что там за погода!"
humidity = data["main"]["humidity"]
pressure = data["main"]["pressure"]
wind = data["wind"]["speed"]
sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"])
sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"])
length_of_the_day = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) - datetime.datetime.fromtimestamp(
data["sys"]["sunrise"])
await message.reply(f"***{datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}***\n"
f"Погода в городе: {city}\nТемпература: {cur_weather}C° {wd}\n"
f"Влажность: {humidity}%\nДавление: {pressure} мм.рт.ст\nВетер: {wind} м/с\n"
f"Восход солнца: {sunrise_timestamp}\nЗакат солнца: {sunset_timestamp}\nПродолжительность дня: {length_of_the_day}\n"
f"***Хорошего дня!***"
)
except:
await message.reply("\U00002620 Проверьте название города \U00002620")
@dp.message_handler(content_types=['text'])
async def text(message):
if message.text == "Новости":
await bot.send_message(get_news(message))
elif message.text == "Погода":
await bot.send_message("Привет! Напиши мне название города и я пришлю сводку погоды!")
elif message.text == "Погода":
await bot.send_message(get_weather(message))
else:
await bot.send_message("Я не понимаю")
if __name__ == '__main__':
executor.start_polling(dp)
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
У вас что-то в край непонятное. Скорее всего что-то не будет работать с первого раза.
# делаете стейты
class Input_FSM(StatesGroup):
input_wheather = State()
@dp.message_handler(commands=['start', 'help'])
async def start(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, input_field_placeholder="Выберите способ").add(
"Новости", "Погода")
await message.answer(
'Привет я бот который выдаст тебе самые акутальные новости, '
'а также погоду, просто выбери нужное снизу',
reply_markup=markup)
@dp.message_handler(text="Новости")
async def news(message: types.Message):
# не имею
await message.answer(await get_news(message))
@dp.message_handler(text="Погода")
async def wheather(message: types.Message):
await message.answer("Привет! Напиши мне название города и я пришлю сводку погоды!")
await Input_FSM.input_wheather.set()
@dp.message_handler(state=Input_FSM.input_wheather)
async def get_city(message: types.Message, state: FSMContext):
code_to_smile = {
"Clear": "Ясно \U00002600",
"Clouds": "Облачно \U00002601",
"Rain": "Дождь \U00002614",
"Drizzle": "Дождь \U00002614",
"Thunderstorm": "Гроза \U000026A1",
"Snow": "Снег \U0001F328",
"Mist": "Туман \U0001F32B"
}
try:
r = requests.get(
f"http://api.openweathermap.org/data/2.5/weather?q={message.text}&appid={open_weather_token}&units=metric"
)
data = r.json()
city = data["name"]
cur_weather = data["main"]["temp"]
weather_description = data["weather"][0]["main"]
if weather_description in code_to_smile:
wd = code_to_smile[weather_description]
else:
wd = "Посмотри в окно, не пойму что там за погода!"
humidity = data["main"]["humidity"]
pressure = data["main"]["pressure"]
wind = data["wind"]["speed"]
sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"])
sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"])
length_of_the_day = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) - datetime.datetime.fromtimestamp(
data["sys"]["sunrise"])
await message.reply(f"***{datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}***\n"
f"Погода в городе: {city}\nТемпература: {cur_weather}C° {wd}\n"
f"Влажность: {humidity}%\nДавление: {pressure} мм.рт.ст\nВетер: {wind} м/с\n"
f"Восход солнца: {sunrise_timestamp}\nЗакат солнца: {sunset_timestamp}\n"
f"Продолжительность дня: {length_of_the_day}\n"
f"***Хорошего дня!***")
# закрываем стейт
await state.finish()
except Exception:
await message.reply("\U00002620 Проверьте название города \U00002620")
# парсер новостей
async def get_news(message: types.Message):
url = 'https://news.rambler.ru'
page = requests.get(url)
soup = BeautifulSoup(page.text, "html.parser")
filteredNews = []
allNews = soup.findAll('a', class_='_6bF6i')
for data in allNews:
if data.find('div', class_='_1tnKf') is not None:
filteredNews.append(data.text)
for data in filteredNews:
await message.answer(data)
return filteredNews