 |

21.12.2022, 14:24
|
|
Участник форума
Регистрация: 23.05.2018
Сообщений: 258
С нами:
4197926
Репутация:
33
|
|
Как после нажатии кнопки(не inline) считать следующее сообщение пользователя. Библиотека aiogram(python)?
|
|
|

21.12.2022, 16:19
|
|
Участник форума
Регистрация: 23.12.2019
Сообщений: 155
С нами:
3363619
Репутация:
33
|
|
используй states
|
|
|

22.12.2022, 19:19
|
|
Участник форума
Регистрация: 21.12.2013
Сообщений: 181
С нами:
6522707
Репутация:
83
|
|
Python:
Код:
import
logging
import
aiogram
.
utils
.
markdown
as
md
from
aiogram
import
Bot
,
Dispatcher
,
types
from
aiogram
.
contrib
.
fsm_storage
.
memory
import
MemoryStorage
from
aiogram
.
dispatcher
import
FSMContext
from
aiogram
.
dispatcher
.
filters
import
Text
from
aiogram
.
dispatcher
.
filters
.
state
import
State
,
StatesGroup
from
aiogram
.
types
import
ParseMode
from
aiogram
.
utils
import
executor
logging
.
basicConfig
(
level
=
logging
.
INFO
)
API_TOKEN
=
'BOT TOKEN HERE'
bot
=
Bot
(
token
=
API_TOKEN
)
# For example use simple MemoryStorage for Dispatcher.
storage
=
MemoryStorage
(
)
dp
=
Dispatcher
(
bot
,
storage
=
storage
)
# States
class
Form
(
StatesGroup
)
:
name
=
State
(
)
# Will be represented in storage as 'Form:name'
age
=
State
(
)
# Will be represented in storage as 'Form:age'
gender
=
State
(
)
# Will be represented in storage as 'Form:gender'
@dp.message_handler
(
commands
=
'start'
)
async
def
cmd_start
(
message
:
types
.
Message
)
:
"""
Conversation's entry point
"""
# Set state
await
Form
.
name
.
set
(
)
await
message
.
reply
(
"Hi there! What's your name?"
)
# You can use state '*' if you need to handle all states
@dp.message_handler
(
state
=
'*'
,
commands
=
'cancel'
)
@dp.message_handler
(
Text
(
equals
=
'cancel'
,
ignore_case
=
True
)
,
state
=
'*'
)
async
def
cancel_handler
(
message
:
types
.
Message
,
state
:
FSMContext
)
:
"""
Allow user to cancel any action
"""
current_state
=
await
state
.
get_state
(
)
if
current_state
is
None
:
return
logging
.
info
(
'Cancelling state %r'
,
current_state
)
# Cancel state and inform user about it
await
state
.
finish
(
)
# And remove keyboard (just in case)
await
message
.
reply
(
'Cancelled.'
,
reply_markup
=
types
.
ReplyKeyboardRemove
(
)
)
@dp.message_handler
(
state
=
Form
.
name
)
async
def
process_name
(
message
:
types
.
Message
,
state
:
FSMContext
)
:
"""
Process user name
"""
async
with
state
.
proxy
(
)
as
data
:
data
[
'name'
]
=
message
.
text
await
Form
.
next
(
)
await
message
.
reply
(
"How old are you?"
)
# Check age. Age gotta be digit
@dp.message_handler
(
lambda
message
:
not
message
.
text
.
isdigit
(
)
,
state
=
Form
.
age
)
async
def
process_age_invalid
(
message
:
types
.
Message
)
:
"""
If age is invalid
"""
return
await
message
.
reply
(
"Age gotta be a number.\nHow old are you? (digits only)"
)
@dp.message_handler
(
lambda
message
:
message
.
text
.
isdigit
(
)
,
state
=
Form
.
age
)
async
def
process_age
(
message
:
types
.
Message
,
state
:
FSMContext
)
:
# Update state and data
await
Form
.
next
(
)
await
state
.
update_data
(
age
=
int
(
message
.
text
)
)
# Configure ReplyKeyboardMarkup
markup
=
types
.
ReplyKeyboardMarkup
(
resize_keyboard
=
True
,
selective
=
True
)
markup
.
add
(
"Male"
,
"Female"
)
markup
.
add
(
"Other"
)
await
message
.
reply
(
"What is your gender?"
,
reply_markup
=
markup
)
@dp.message_handler
(
lambda
message
:
message
.
text
not
in
[
"Male"
,
"Female"
,
"Other"
]
,
state
=
Form
.
gender
)
async
def
process_gender_invalid
(
message
:
types
.
Message
)
:
"""
In this example gender has to be one of: Male, Female, Other.
"""
return
await
message
.
reply
(
"Bad gender name. Choose your gender from the keyboard."
)
@dp.message_handler
(
state
=
Form
.
gender
)
async
def
process_gender
(
message
:
types
.
Message
,
state
:
FSMContext
)
:
async
with
state
.
proxy
(
)
as
data
:
data
[
'gender'
]
=
message
.
text
# Remove keyboard
markup
=
types
.
ReplyKeyboardRemove
(
)
# And send message
await
bot
.
send_message
(
message
.
chat
.
id
,
md
.
text
(
md
.
text
(
'Hi! Nice to meet you,'
,
md
.
bold
(
data
[
'name'
]
)
)
,
md
.
text
(
'Age:'
,
md
.
code
(
data
[
'age'
]
)
)
,
md
.
text
(
'Gender:'
,
data
[
'gender'
]
)
,
sep
=
'\n'
,
)
,
reply_markup
=
markup
,
parse_mode
=
ParseMode
.
MARKDOWN
,
)
# Finish conversation
await
state
.
finish
(
)
if
__name__
==
'__main__'
:
executor
.
start_polling
(
dp
,
skip_updates
=
True
)
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|