function take url, phone, e-mail from users message
This commit is contained in:
parent
d4ad8d27c0
commit
5f587980e1
52
README.md
52
README.md
@ -200,6 +200,54 @@ async def cmd_hello(message: Message):
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
В примере выше конструкция **content.as_kwargs() вернёт аргументы text, entities, parse_mode и подставит их в вызов answer()
|
В примере выше конструкция ****content.as_kwargs()** вернёт аргументы **text, entities, parse_mode** и подставит их в вызов **answer()**
|
||||||
|
|
||||||
Упомянутый инструмент форматирования довольно комплексный, [официальная документация](https://core.telegram.org/bots/api#formatting-options) демонстрирует удобное отображение сложных конструкций
|
Упомянутый инструмент форматирования довольно комплексный, [официальная документация](https://core.telegram.org/bots/api#formatting-options) демонстрирует удобное отображение сложных конструкций
|
||||||
|
|
||||||
|
#### Сохранение форматирования
|
||||||
|
Представим, что бот должен получить форматированный текст от пользователя и добавить туда что-то своё, например, отметку времени.
|
||||||
|
|
||||||
|
Напишем простой код:
|
||||||
|
```py
|
||||||
|
# новый импорт!
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
@dp.message(F.text)
|
||||||
|
async def echo_with_time(message: Message):
|
||||||
|
# Получаем текущее время в часовом поясе ПК
|
||||||
|
time_now = datetime.now().strftime('%H:%M')
|
||||||
|
# Создаём подчёркнутый текст
|
||||||
|
added_text = html.underline(f"Создано в {time_now}")
|
||||||
|
# Отправляем новое сообщение с добавленным текстом
|
||||||
|
await message.answer(f"{message.text}\n\n{added_text}", parse_mode="HTML")
|
||||||
|
```
|
||||||
|
|
||||||
|
НО! ``message.text`` возвращает просто текст, без каких-либо оформлений.
|
||||||
|
Чтобы получить текст в нужном форматировании, воспользуемся альтернативными свойствами: ``message.html_text`` или ``message.md_text``.
|
||||||
|
|
||||||
|
#### Работа с entities
|
||||||
|
**Telegram** сильно упрощает жизнь разработчикам, выполняя предобработку сообщений пользователей на своей стороне. Например, некоторые сущности, типа **e-mail**, **номера телефона, юзернейма** и др. можно не доставать регулярными выражениями, а извлечь напрямую из объекта **Message** и поля **entities**, содержащего массив объектов типа [MessageEntity](https://core.telegram.org/bots/api#messageentity).
|
||||||
|
|
||||||
|
Здесь кроется важный подвох. *Telegram возвращает не сами значения, а их начало в тексте и длину*.
|
||||||
|
```py
|
||||||
|
@dp.message(F.text)
|
||||||
|
async def extract_data(message: Message):
|
||||||
|
data = {
|
||||||
|
"url": "<N/A>",
|
||||||
|
"email": "<N/A>",
|
||||||
|
"code": "<N/A>"
|
||||||
|
}
|
||||||
|
entities = message.entities or []
|
||||||
|
for item in entities:
|
||||||
|
if item.type in data.keys():
|
||||||
|
# Неправильно
|
||||||
|
# data[item.type] = message.text[item.offset : item.offset+item.length]
|
||||||
|
# Правильно
|
||||||
|
data[item.type] = item.extract_from(message.text)
|
||||||
|
await message.reply(
|
||||||
|
"Вот что я нашёл:\n"
|
||||||
|
f"URL: {html.quote(data['url'])}\n"
|
||||||
|
f"E-mail: {html.quote(data['email'])}\n"
|
||||||
|
f"Пароль: {html.quote(data['code'])}"
|
||||||
|
)
|
||||||
|
```
|
66
bot.py
66
bot.py
@ -46,6 +46,7 @@ async def cmd_start(message: types.Message):
|
|||||||
as_marked_section(
|
as_marked_section(
|
||||||
Bold("Я умею:"),
|
Bold("Я умею:"),
|
||||||
"/test1 - Отвечу Test1",
|
"/test1 - Отвечу Test1",
|
||||||
|
"/more - Еще больше возможностей!",
|
||||||
"/answer - Просто отвечу",
|
"/answer - Просто отвечу",
|
||||||
"/reply - Отвечу ответом",
|
"/reply - Отвечу ответом",
|
||||||
"/name - Поприветствую тебя по Имени и Фамилии",
|
"/name - Поприветствую тебя по Имени и Фамилии",
|
||||||
@ -68,6 +69,36 @@ async def cmd_start(message: types.Message):
|
|||||||
**content.as_kwargs()
|
**content.as_kwargs()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@dp.message(Command("more"))
|
||||||
|
async def cmd_more(message: types.Message):
|
||||||
|
# await message.answer("Привет! ")
|
||||||
|
content = as_list(
|
||||||
|
Text(
|
||||||
|
|
||||||
|
Bold(message.from_user.first_name),
|
||||||
|
" Еще я могу вот что: ",
|
||||||
|
),
|
||||||
|
as_marked_section(
|
||||||
|
Bold(""),
|
||||||
|
"Если ты напишешь в тексте ",
|
||||||
|
"адрес сайта,",
|
||||||
|
"e-mail,",
|
||||||
|
"Номер телефона,",
|
||||||
|
"Какой нибудь код или пароль",
|
||||||
|
"Я распознаю из и напишу что нашел",
|
||||||
|
"/dice - Подкину для тебя кубик, загадай число ;)",
|
||||||
|
marker="✅ ",
|
||||||
|
),
|
||||||
|
HashTag("#еще"),
|
||||||
|
# Text(
|
||||||
|
# "Номер телефона, ",
|
||||||
|
# Bold(message.contact.phone_number)
|
||||||
|
# )
|
||||||
|
)
|
||||||
|
await message.answer(
|
||||||
|
**content.as_kwargs()
|
||||||
|
)
|
||||||
|
|
||||||
# Хэндлер на команду /test1
|
# Хэндлер на команду /test1
|
||||||
@dp.message(Command("test1"))
|
@dp.message(Command("test1"))
|
||||||
async def cmd_test1(message: types.Message):
|
async def cmd_test1(message: types.Message):
|
||||||
@ -142,6 +173,41 @@ async def cmd_dice2(message: types.Message, bot: Bot):
|
|||||||
async def cmd_info(message: types.Message, started_at: str):
|
async def cmd_info(message: types.Message, started_at: str):
|
||||||
await message.answer(f"Бот запущен {started_at}")
|
await message.answer(f"Бот запущен {started_at}")
|
||||||
|
|
||||||
|
# сохраним формат введенного пользователем текста - после теста отключим хендлер
|
||||||
|
#@dp.message(F.text)
|
||||||
|
async def echo_with_time(message: Message):
|
||||||
|
# Получаем текущее время в часовом поясе ПК
|
||||||
|
time_now = datetime.now().strftime('%H:%M')
|
||||||
|
# Создаём подчёркнутый текст
|
||||||
|
added_text = html.underline(f"Написано в {time_now}")
|
||||||
|
not_anderstand = (message.from_user.first_name)
|
||||||
|
# Отправляем новое сообщение с добавленным текстом
|
||||||
|
await message.answer(f"{message.html_text}\n\n{not_anderstand}!!! Я не понимаю эту команду :(\nДля получения списка известных мне команд напиши /start \n{added_text}", parse_mode="HTML")
|
||||||
|
|
||||||
|
# Извлекаем из сообщений пользователя данные url, email, телефон и код
|
||||||
|
@dp.message(F.text)
|
||||||
|
async def extract_data(message: Message):
|
||||||
|
data = {
|
||||||
|
"url": "<N/A>",
|
||||||
|
"email": "<N/A>",
|
||||||
|
"phone_number": "<N/A>",
|
||||||
|
# "code": "<N/A>"
|
||||||
|
}
|
||||||
|
entities = message.entities or []
|
||||||
|
for item in entities:
|
||||||
|
if item.type in data.keys():
|
||||||
|
# Неправильно
|
||||||
|
# data[item.type] = message.text[item.offset : item.offset+item.length]
|
||||||
|
# Правильно
|
||||||
|
data[item.type] = item.extract_from(message.text)
|
||||||
|
await message.reply(
|
||||||
|
"Вот что я нашёл:\n"
|
||||||
|
f"URL: {html.quote(data['url'])}\n"
|
||||||
|
f"E-mail: {html.quote(data['email'])}\n"
|
||||||
|
f"Телефон: {html.quote(data['phone_number'])}\n"
|
||||||
|
# f"Пароль: {html.quote(data['code'])}"
|
||||||
|
)
|
||||||
|
|
||||||
# Запуск процесса поллинга новых апдейтов
|
# Запуск процесса поллинга новых апдейтов
|
||||||
async def main():
|
async def main():
|
||||||
# Регистрируем хэндлер cmd_test2 по команде /start
|
# Регистрируем хэндлер cmd_test2 по команде /start
|
||||||
|
Loading…
x
Reference in New Issue
Block a user