telebot save user answerи им подобным. Решение есть в примерах библиотеки на ее гитхабе. Нужно просто приложить два грамма старания
*args, **kwargs
, так что все данные можно сохранять просто в словарь и передавать в register_next_step_handler
как еще один параметр imprort json
data = {"chat_id": chat_id, "text": text, "reply_markup": json.dumps(reply_markup)}
data = {"chat_id": chat_id, "text": text, "reply_markup": reply_markup}
requests.post(url, json=data)
@dp.message_handler(state=Form.button)
async def process_button(message: types.Message, state: FSMContext):
# ну и тут дальше, либо новые шаги, либо сразу публикация
inline_kb = InlineKeyboardMarkup()
inline_kb.add(InlineKeyboardButton('Ссылка на страницу', url=message.text))
return user1
@dp.message_handler(commands="ruletkaid")
async def inlinebtn(message: types.Message):
user1 = message.get_args()
user2 = message.from_user.username
keyboard = types.InlineKeyboardMarkup()
keyboard.add(types.InlineKeyboardButton(text="Принять", callback_data=f"accept_{user1}:{user2}"))
keyboard.add(types.InlineKeyboardButton(text="Не принимать", callback_data=f"decline_{user1}:{user2}"))
await message.answer(user1 + ', вас вызывает на дуэль ' + user2, reply_markup=keyboard)
@dp.callback_query_handler(lambda call: call.data.startswith('accept_'))
async def accept_duel(call: types.CallbackQuery):
user1, user2 = call.data.replace('accept_', '', 1).split(':')
if call.from_user.username != user1:
await call.answer(text="Не тебе адресовано.", show_alert=True)
get_chat_member
не выкинет исключение. Это справедливо для покинувших канал (были кикнуты или вышли сами). Так что нужно еще проверить статус на этот случай. По сути, нужных нам только два - left и kicked. Все статусы и типы описаны тут - https://core.telegram.org/bots/api#chatmemberdef is_subscribed(chat_id, user_id):
try:
user = bot.get_chat_member(chat_id, user_id)
if user.status in ('left', 'kicked'):
return False
return True
except ApiTelegramException as e:
if e.result_json['description'] == 'Bad Request: user not found':
return False
switch_inline_query
.@dp.message_handler()
async def echo(msg: types.Message):
if msg.is_forward():
await msg.delete()
edit_caption
bot.delete_webhook()
перед созданием нового хука.bot.register_next_step_handler_by_chat_id()
. Первым аргументом он принимает ID чата, в котором будет бот ждать сообщение. Соответственно, туда нужно засунуть ID пользователя. Итог:bot.register_next_step_handler(message, dogovor, userID)
на bot.register_next_step_handler_by_chat_id(userID, dogovor)
register_next_step_handler
. Рекомендую создать хотя бы словарь вида {'number': 123, 'surname': 'surname'}
.def dogovor(message): # получаем фамилию
num_dog = message.text
user_info = {'num_dog': num_dog}
bot.send_message(message.chat.id, 'Какая у тебя фамилия?')
bot.register_next_step_handler(message, get_surname, user_info)
def get_surname(message, user_info): # получаем фамилию
user_info['surname'] = message.text
print('Фамилия:', user_info['surname'], '. Номер договора:', user_info['dog_num'])