Помогите разобраться с погода ботом
Решил я написать простенького погодабота все хорошо, ошибок не выдает, но он и не отвечает мне на мои запросы, вот сам код
@dp.message_handler(commands=['start'])
async def welcome(message):
await message.reply("Добро пожаловать!\nЯ - <b>Погода-бот</b>, бот созданный чтобы всегда знать погоду.\n<b>Укажите город</b>", parse_mode='html')
@dp.message_handler()
async def cites(meassge: types.Message):
global city
city = meassge.text
keybord = types.InlineKeyboardMarkup()
item1 = types.InlineKeyboardButton("Температура", callback_data='temp')
item2 = types.InlineKeyboardButton("Состояние погоды", callback_data='weather')
item3 = types.InlineKeyboardButton("Как мне одется", callback_data='clothes')
item4 = types.InlineKeyboardButton("Все сразу", callback_data='all')
keybord.add(item1, item2, item3, item4)
await meassge.answer('Выберите, что хотите узнать', reply_markup=keybord)
@dp.message_handler(lambda c: c.data == 'temp')
async def temp(call: types.CallbackQuery):
weather = await client.get(city)
resp_msg = weather.nearest_area.name + ", " + weather.nearest_area.country + "\n"
resp_msg += f"Текущая температура: {weather.current.temperature}°"
await call.answer(resp_msg)
@dp.message_handler(lambda c: c.data == 'weather')
async def wea(call: types.CallbackQuery):
weather = await client.get(city)
resp_msg = weather.nearest_area.name + ',' + weather.nearest_area.country + '\n'
resp_msg += f'Текущие состояние погоды: {weather.current.description}'
await call.answer(resp_msg)
@dp.message_handler(lambda c: c.data == 'clothes')
async def clo(call: types.CallbackQuery):
weather = await client.get(city)
resp_msg = weather.nearest_area.name + '\n'
temperature = weather.current.temperature
if temperature < -30:
resp_msg += f'На улице {weather.current.temperature}°, одевайтесь как можно теплее!'
elif -30 < temperature < -10:
resp_msg += f'На улице {weather.current.temperature}°, одевайтесь очень тепло!'
elif -10 < temperature < 0:
resp_msg += f'На улице ниже 0, одевайтесь тепло, не забудьте про шапку'
elif 0 > temperature > 18:
resp_msg += f'На улице прохладно, посоветовал бы надеть легкую куртку'
elif 18 > temperature > 30:
resp_msg += f'На улице тепло, одевайтесь полегче'
elif temperature > 30:
resp_msg += f'На улице ужасно жарко: {weather.current.temperature}°, советую остаться в доме лежать под кондиционером'
await call.answer(resp_msg)
@dp.message_handler(lambda c: c.data == 'all')
async def all(call: types.CallbackQuery):
weather = await client.get(city)
temperature = weather.current.temperature
resp_msg = weather.nearest_area.name + weather.nearest_area.country + '\n'
resp_msg += f'Текущая температура: {weather.current.temperature}°\n'
resp_msg += f'Текущее состояние погоды: {weather.current.description}\n\n'
if temperature < -30:
resp_msg += f'На улице {weather.current.temperature}°, одевайтесь как можно теплее!'
elif -30 < temperature < -10:
resp_msg += f'На улице {weather.current.temperature}°, одевайтесь очень тепло!'
elif -10 < temperature < 0:
resp_msg += f'На улице ниже 0, одевайтесь тепло, не забудьте про шапку'
elif 0 > temperature > 18:
resp_msg += f'На улице прохладно, посоветовал бы надеть легкую куртку'
elif 18 > temperature > 30:
resp_msg += f'На улице тепло, одевайтесь полегче'
elif temperature > 30:
resp_msg += f'На улице ужасно жарко: {weather.current.temperature}°, советую остаться в доме лежать под кондиционером'
await call.answer(resp_msg)
до ходит бот до выбора, я нажимаю на любу. из четырех кнопок и ничего не происходит, сам бот не выдает инфу, и ошибки при этом не вылетают
Ответы (1 шт):
Автор решения: Любомир
→ Ссылка
Проблема в том, что вы пытаетесь отработать callback запрос - message_handler-ом.
Вот как нужно обрабатывать Inline кнопку:
@dp.callback_query_handler(text="temp")
async def temp(call: types.CallbackQuery):
weather = await client.get(city)
resp_msg = weather.nearest_area.name + ", " + weather.nearest_area.country + "\n"
resp_msg += f"Текущая температура: {weather.current.temperature}°"
await call.answer(resp_msg)
Вместо dp.message_handler()
мы пишем
@dp.callback_query_handler(text="callback_data которую вы указывали")
Этот вариант просто пример использования обработчиков callback