как сделать чтобы функции пошли дальше?
делаю телеграм бота и не могу понять почему он тормозит на функции name_news()
а дальше не идет
@bot.message_handler(commands=['new_news'])
def new_news(message):
name_text_photos = []
bot.send_message(message.from_user.id, 'Напишите название новости:')
@bot.message_handler(content_types=['text'])
def news_name(message):
print(message.text)
name_text_photos.append(message.text)
names_all_news.append(message.text)
@bot.message_handler(content_types=['text'])
def news_text(message):
bot.send_message(message.from_user.id, 'Напишите текст новости:')
print(message.text)
name_text_photos.append(message.text)
и еще вопрос: как можно сохранять фотографии которые скинет человек для последующей работы с ними?
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
Вообще в телеботе есть свои стейты, но мне было лень вспоминать как их юзать, потому сделал так.
# делаем словарь с юзерами
users = {}
# делаем парочку функций для удобной работы с стейтами
def reset_state(user_id: int, with_data=True):
if with_data:
users[user_id] = {"state": None}
else:
users[user_id]["state"] = None
def set_state(user_id: int, new_state: str):
users.setdefault(user_id, {"state": None})
users[user_id]["state"] = new_state
def get_state(user_id: int):
users.setdefault(user_id, {"state": None})
return users[user_id].get("state")
# при старте делаете запись юзера в словарь, и с ключом state
@bot.message_handler(commands=['start'])
def start(message: types.Message):
users.setdefault(message.from_user.id, {"state": None})
...
@bot.message_handler(commands=['new_news'])
def new_news(message: types.Message):
bot.send_message(message.from_user.id, 'Напишите название новости')
# делаете запуск стейта с именем name_news
set_state(message.from_user.id, "name_news")
# делаем хендлер который срабатывает только при стейте name_news
@bot.message_handler(func=lambda msg: get_state(msg.from_user.id) == "name_news")
def news_name(message: types.Message):
# записываем в словарь с юзером введенные данные от юзера
users[message.from_user.id]["news_name"] = message.text
bot.send_message(message.from_user.id, 'Напишите текст новости')
# запсускаем следующий стейт
set_state(message.from_user.id, "text_news")
# аналогично
@bot.message_handler(func=lambda msg: get_state(msg.from_user.id) == "text_news")
def news_text(message: types.Message):
users[message.from_user.id]["text_news"] = message.text
# выводим данные
bot.send_message(
message.from_user.id,
f'Заголовок: {users[message.from_user.id]["news_name"]}\n'
f'Текст: {users[message.from_user.id]["text_news"]}')
# reset_state сбрасывает стейт, если нужно
reset_state(message.from_user.id)
UPD.1
О, я забыл про register_next_step_handler в телеботе. Можете весь код выше заменить на вот такое
@bot.message_handler(commands=['new_news'])
def new_news(message: types.Message):
bot.send_message(message.from_user.id, 'Напишите название новости')
# делаете запуск стейта с именем name_news
bot.register_next_step_handler(message, news_name)
def news_name(message: types.Message):
bot.send_message(message.from_user.id, 'Напишите текст новости')
bot.register_next_step_handler(message, news_text, message.text)
def news_text(message: types.Message, name: str):
bot.send_message(message.from_user.id, f'Заголовок: {name}\nТекст: {message.text}')
