Некоторое время назад я рассказывал про свой проект Не звони!, где при добавлении своего номера телефона в реестр необходимо подтвердить, что это твой номер.
Стандартные методы подтверждения — SMS или звонком довольно неплохи, но небесплатны. У используемого нами SMS.ru, например, одна SMS стоит 1,5 рубля («SMS за 25 копеек», что сказано у них на главной — это ложь, такого тарифа нет).
Какие бесплатные способы подтверждения номера есть? Мне в голову пришли следующие:
- Попросить пользователя отправить нам SMS со своего номера. Найти бесплатный российский номер, который бы принимал SMS и пересылал их, например, на почту — не удалось (раньше такая опция была у Zadarma). Использование нероссийского номера — отпугнуло бы пользователей. Альтернативное решение — личный номер, android и приложение типа SMS Gateway — не внушает доверия в плане надежности и пропускной способности.
- Попросить пользователя позвонить нам со своего номера. Еще более сложно реализуемый вариант.
- Проверка через Telegram.
Последний вариант показался интересным. Как это работает? Бот просит пользователя выбрать сайт для авторизации, а затем запрашивает номер телефона пользователя. Если пользователь свой номер телефона сообщает, то бот подтверждает номер телефона на выбранном сайте.
В Telegram Bot API можно запросить у пользователя его номер телефона:
>>> contact_keyboard = telegram.KeyboardButton(text="send_contact", request_contact=True)
>>> custom_keyboard = [[ contact_keyboard ]]
>>> reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard)
>>> bot.send_Message(chat_id=chat_id,
... text="Would you mind sharing your contact with me?",
... reply_markup=reply_markup)
Если пользователь соглашается отдать боту свой номер телефона, то бот получает следующее:
{
"update_id": 912872664,
"message": {
"message_id": 57,
"from": {
"id": 777777,
"first_name": "Ne Dimon",
"last_name": "On vam",
"username": "onvamnedimon"
},
"chat": {
"id": 777777,
"first_name": "Ne Dimon",
"last_name": "On vam",
"username": "onvamnedimon",
"type": "private"
},
"date": 1492274787,
"contact": {
"phone_number": "79160000001",
"first_name": "Ne Dimon",
"last_name": "On vam",
"user_id": 777777
}
}
}
Может ли пользователь прислать не свой номер телефона? Может. Пользователь вместо ответа «Да» боту может выслать любой другой контакт из своей телефонной книжки. Но при этом
contact/user_id
в этом случае не будут равны from/id
, и бот узнает, что ему прислали чужой контакт.Меня интересовал вопрос — можно ли используя модифицированный клиент Telegram отправить чужой номер телефона со своим id. @BotSupport Telegram утверждает, что это сделать нельзя (возможно, есть проверка на сервере). Но я им (особенно русскоязычной поддержке) не особо доверяю, потому предлагаю задачу — подтвердить номер
(916) 000-00-01
на нашем сайте (проверил, по данному номеру «абонент не доступен», думаю, такого номера не существует). Для этого необходимо перейти по ссылке бота и на запрос номера отправить ему номер (916) 000-00-01
с вашим id. Постоянной программы Bug Bounty у Telegram, как я понимаю, не существует, потому тот, кто справится, ничего особо не получит. Хотя, можно будет какую-нибудь информацию о ком-нибудь получить, например, в боте банка Тинькофф ;).