function take url, phone, e-mail from users message

This commit is contained in:
vasilytray 2025-03-10 09:45:07 +07:00
parent d4ad8d27c0
commit 5f587980e1
2 changed files with 116 additions and 2 deletions

View File

@ -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) демонстрирует удобное отображение сложных конструкций
#### Сохранение форматирования
Представим, что бот должен получить форматированный текст от пользователя и добавить туда что-то своё, например, отметку времени.
Напишем простой код:
```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
View File

@ -46,6 +46,7 @@ async def cmd_start(message: types.Message):
as_marked_section(
Bold("Я умею:"),
"/test1 - Отвечу Test1",
"/more - Еще больше возможностей!",
"/answer - Просто отвечу",
"/reply - Отвечу ответом",
"/name - Поприветствую тебя по Имени и Фамилии",
@ -68,6 +69,36 @@ async def cmd_start(message: types.Message):
**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
@dp.message(Command("test1"))
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):
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():
# Регистрируем хэндлер cmd_test2 по команде /start