Некоторое время назад я рассказывал про свой проект Не звони!, где при добавлении своего номера телефона в реестр необходимо подтвердить, что это твой номер.

Стандартные методы подтверждения — SMS или звонком довольно неплохи, но небесплатны. У используемого нами SMS.ru, например, одна SMS стоит 1,5 рубля («SMS за 25 копеек», что сказано у них на главной — это ложь, такого тарифа нет).

Какие бесплатные способы подтверждения номера есть? Мне в голову пришли следующие:

  1. Попросить пользователя отправить нам SMS со своего номера. Найти бесплатный российский номер, который бы принимал SMS и пересылал их, например, на почту — не удалось (раньше такая опция была у Zadarma). Использование нероссийского номера — отпугнуло бы пользователей. Альтернативное решение — личный номер, android и приложение типа SMS Gateway — не внушает доверия в плане надежности и пропускной способности.
  2. Попросить пользователя позвонить нам со своего номера. Еще более сложно реализуемый вариант.
  3. Проверка через 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, как я понимаю, не существует, потому тот, кто справится, ничего особо не получит. Хотя, можно будет какую-нибудь информацию о ком-нибудь получить, например, в боте банка Тинькофф ;).
Поделиться с друзьями
-->

Комментарии (23)


  1. alexyr
    22.05.2017 21:09

    может выслать любой другой контакт

    Не нажимая на кнопку, просто выбрав как attachment?


    1. and7ey
      22.05.2017 21:19

      Да (только attachment = Contact, а не File)


  1. TimsTims
    22.05.2017 23:05
    -3

    > думаю, такого номера не существует
    Существует. Это абонент Билайна, имя называть не буду.


    1. and7ey
      23.05.2017 20:31

      Почему Билайна? Код — от МТС.


      1. TimsTims
        23.05.2017 21:36

        Проверил на qiwi — он умеет определять оператора по номеру ;)
        П.с.: имя не назову, потому что не знаю)


      1. Erelecano
        24.05.2017 14:17

        Потому что MNP и код не указывает на оператора уже не один год.
        У меня вот при коде 906 Мегафон на одном из номеров, хотя раньше это были емкости только Пчилайна.


        1. and7ey
          24.05.2017 14:23

          MNP — это понятно. Но насколько MNP применим для несуществующего номера? ;)


  1. aol-nnov
    22.05.2017 23:51
    +7

    в одном забугорном сервисе я видал просто гениальный способ подтверждения номера:
    «мы вам прямо сейчас позвоним, только вы не отвечайте — всё равно не успеете. а теперь введите в это текстовое поле номер, с которого был пропущенный звонок»
    а тут телеграмы, вайбиры… фи!.. ;)


    1. slutsker
      23.05.2017 11:57

      Указанный метод используется в аэропорту Санкт-Петербурга


    1. and7ey
      23.05.2017 12:11

      Если телефонов, с которых звонят, немного, то через некоторое количество попыток эти телефоны станут известны


      1. aol-nnov
        23.05.2017 13:08

        на кредитке пин трехзначный, однако, все пины до сих пор не подобраны. понимаешь, о чем я? :)


        1. QDeathNick
          23.05.2017 13:37

          Достаточно предлагать в списке выбрать номер с которого звонили или последние цифры номера.


          1. and7ey
            23.05.2017 17:14

            Предлагать список возможных номеров? И тем самым сделать подбор ещё более простым? Зачем?


            1. QDeathNick
              23.05.2017 17:42

              Затем чтобы упростить. Во многих случаях такой защиты будет достаточно. С первого(второго) раза не угадал, до свиданья, вводи другой номер, явно подбирают.
              Если надо наоборот усложнить, попросите несколько раз ввести номер с которого позвонили.
              Например в вашем "Не звони!" мне кажется достаточным и предложенного мной варианта. Никто не будет злоупотреблять и пытаться угадать номер. Тем более владельцу номера может показаться и подозрительным, что на его номер постоянно кто-то прозванивается и он может выйти на вас введя в поиске номер определившегося телефона.


              1. and7ey
                23.05.2017 20:32

                В целом — да, такой вариант возможен. Только нужно где-то взять множество номеров.


        1. and7ey
          23.05.2017 17:13

          На кредитка не PIN, а CVV или CVC. Вариантов там 1000. Номеров телефонов для звонков вряд ли столько же. + У карт есть другие методы защиты — например, 3D Secure. Или владелец карты узнает о транзакции — тут такого ничего нет (и даже задержки/блокировки в переборе со стороны сервера не особо помогут).


          1. QDeathNick
            23.05.2017 17:53

            3D secure совсем не защита, она же не обязательна, деньги можно снять и без неё.


            Владелец телефона то как раз узнает. что кто-то перебирает его номер, если кто-то начнёт перебирать, звонки же владельцу пойдут.


            1. and7ey
              23.05.2017 20:34

              Для снятия денег нужен ПИН. 3 неверных попытки ввести ПИН и банкомат карту забирает — ПИНы особо не сможешь перебрать.

              Касательно звонков — да, верно, не подумал об этом почему-то.


  1. alexsibtone
    23.05.2017 05:27

    Как вариант — на сайте показать пользователю какое либо число и номер телефона по которому сделать дозвон.
    Есть сигнализация preanswer — во время нее тарификация не идет (проверял на mtt, таймаут ~ 18 сек), можно абоненту проиграть сообщение и получить от него тоновый DTMF набор цифр, которые мы на сайте ему показали.


    1. and7ey
      23.05.2017 20:34

      Зачем просить код? Ведь достаточно самого факта звонка (если АОН работает корректно).


      1. Gorodnya
        24.05.2017 10:24

        aol-nnov написал реальный пример. А вот ещё один, который Приват в Украине ранее реализовывал: для подтверждения на ваш номер звонит автоответчик, и нужно указать часть номера телефона входящего звонка.


        1. and7ey
          24.05.2017 11:06

          Это немного разные варианты. Выше писали про входящие звонки, тут речь про исходящий звонок.


          1. Gorodnya
            24.05.2017 12:55

            У них были разные варианты. Некоторое время было, что сам клиент для авторизации должен был позвонить на тот номер, который указывает банк в данный момент на странице.
            Потом, после недовольства общественности, этот вариант сменили на «введите последние 4 цифры номера звонящего».