Добавить в корзинуПозвонить
Найти в Дзене
Записки сисадмина

Python. Telegram bot. Получаем контакты пользователя.

Если что-нибудь может пойти не так, оно обязательно пойдёт не так - закон Мерфи. Поэтому нужно быть готовым к любому неприятному исходу. Человеческой находчивости нет предела, поэтому, если с вашей системой активно работают обычные люди, вы практически никогда не избежите багов. С другой стороны, человек может дать обратную связь о проблеме, с которой столкнулся. Есть у меня один бот, с которым взаимодействуют клиенты. Если у них что-то не будет работать, я узнаю только по логам. А признайтесь честно: как часто вы просто так заходите почитать логи? Без конкретной задачи - никогда. Значит, нужно как-то дать пользователю возможность сообщить о проблеме. А как с человеком связаться? {'id': 111111111, 'type': 'private', 'title': None, 'username': 'nightfear_kael', 'first_name': 'Mikhail', 'last_name': None} Я урезал полученный json до необходимых нам полей. Окей, в настройках приватности у меня открыт мой username. Но это у меня. Что делать, если от человека мы получим только telegram id?

Если что-нибудь может пойти не так, оно обязательно пойдёт не так - закон Мерфи. Поэтому нужно быть готовым к любому неприятному исходу.

Человеческой находчивости нет предела, поэтому, если с вашей системой активно работают обычные люди, вы практически никогда не избежите багов.

С другой стороны, человек может дать обратную связь о проблеме, с которой столкнулся.

Есть у меня один бот, с которым взаимодействуют клиенты. Если у них что-то не будет работать, я узнаю только по логам. А признайтесь честно: как часто вы просто так заходите почитать логи? Без конкретной задачи - никогда.

Значит, нужно как-то дать пользователю возможность сообщить о проблеме.

А как с человеком связаться?

  • Давайте смотреть, что бот знает о пользователе, который ему написал:
-2
{'id': 111111111, 'type': 'private', 'title': None, 'username': 'nightfear_kael', 'first_name': 'Mikhail', 'last_name': None}

Я урезал полученный json до необходимых нам полей. Окей, в настройках приватности у меня открыт мой username. Но это у меня. Что делать, если от человека мы получим только telegram id?

Для обычного человека telegram id абсолютно бесполезен, этот параметр может использовать только бот.

Возникает вопрос: как связаться с пользователем? Можно попросить его контакты. Но мы ведь помним, что люди могут ошибиться и опечататься. Должен быть железно работающий способ. И он есть.

Вспоминаем, как мы создавали свои клавиатуры, но на этот раз погружаемся чуть глубже.

Оказывается, у кнопки KeyboardButton есть параметр request_cotact.

  • Давайте создадим нашу клавиатуру:
-3
kb = ReplyKeyboardMarkup(resize_keyboard=True)
kb.add(KeyboardButton(text='Отправить контакт', request_contact=True))
kb_rm = ReplyKeyboardRemove()
  • И сразу же добавим ее в сообщение, которое придет после нажатия на /help
-4
@bot.message_handler(commands=['help'])
def help_message(message):
bot.send_message(message.chat.id, 'Пожалуйста, поделитесь своим контактом, чтобы менеджер мог с вами связаться', reply_markup=kb)
-5

При нажатии на кнопку, пользователь отправит боту свой контакт. В карточке будет виден номер телефона, а если кликнуть по нему, можно написать человеку напрямую.

Вот только проблема: бот пока что не получает контакт, так как реагирует только на одну команду. Раньше я писал про различные типы сообщений, которые бот может принимать.

Пришло время использовать новый content_type - 'contact'.

  • Пишем обработчик сообщений с типом "контакт":
-6
  • На вывод мы получим:
{'phone_number': '+79999999999', 'first_name': 'Mikhail', 'last_name': None, 'user_id': 111111111, 'vcard': None}
  • А теперь добавим пересылку этого контакта в группу с нашими менеджерами:
-7
@bot.message_handler(content_types=['contact'])
def contact_message(message):
bot.send_message(message.chat.id, 'Благодарю, в ближайшее время с вами свяжутся', reply_markup=kb_rm)
managers_group_id = -123123123
bot.forward_message(chat_id=managers_group_id, from_chat_id=message.chat.id, message_id=message.id)

Теперь при нажатии на /help бот будет запрашивать у пользователя его контакт и пересылать полученное сообщение в группу с менеджерами.

Дополнительную логику вы можете добавить сами.

Весь код из статьи выложил здесь