
Некоторое время назад я рассказывал про свой проект Не звони!, где при добавлении своего номера телефона в реестр необходимо подтвердить, что это твой номер.
Стандартные методы подтверждения — 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 на нашем сайте ne-zvoni.ru (проверил, по данному номеру «абонент не доступен», думаю, такого номера не существует). Для этого необходимо перейти по ссылке бота и на запрос номера отправить ему номер (916) 000-00-01 с вашим id.
Постоянной программы Bug Bounty у Telegram, как я понимаю, не существует, потому тот, кто справится, ничего особо не получит. Хотя, можно будет какую-нибудь информацию о ком-нибудь получить, например, в боте банка Тинькофф ;).
ссылка на оригинал статьи https://habrahabr.ru/post/328600/
Добавить комментарий