В данном топике хочу описать дополнительный, а для некоторых сервисов возможно и основной способ авторизации и регистрации пользователя через Telegram, подобно OAuth авторизации через социальные сети и web-сервисы.

Допустим, у Вас есть некий сервис, который предлагает пользователям вход через Telegram. На странице авторизации пользователю предлагается ввести его Username в Telegram. После ввода Username, на аккаунт пользователя приходит сообщение с кодом подтверждения, который он вводит на странице авторизации.

В первую очередь нам потребуется «живой» аккаунт в Telegram, то есть аккаунт который зарегистрирован на мобильный номер телефона. В данном случае боты не подходят для данной задачи, так как боты не могут писать сообщения первыми.

Теперь что касается серверной стороны.

На странице приложений Telegram есть не официальное приложение telegram-cli. Оно и будет выполнять функцию приложения которое будет взаимодействовать с сервером Telegram.

Для упрощения примера telegram-cli будем ставить в каталог /usr/local/src/:
cd /usr/local/src/

Клонируем репозиторий:
git clone --recursive <a href="https://github.com/vysheng/tg.git">https://github.com/vysheng/tg.git</a> && cd tg

Ставим необходимые пакеты:
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev python-dev

Собираем telegram-cli:
./configure make

При первом запуске, приложение попросит ввести номер телефона нашего «живого» аккаунта. После ввода номера, будет выслан код подтверждения по смс или в приложение если данный аккаунт сейчас активен на другом устройстве. После подтверждения, в вашем домашнем каталоге будет создана директория ".telegram-cli" в которой будут хранится файлы конфигураций для указанного аккаунта.

Запускаем:
/usr/local/src/tg/bin/telegram-cli -k /usr/local/src/tg/tg-server.pub

Видим следующую картину:
image

Выходим из приложения:
quit

Запускаем приложение как демон например на порту 8089:
/usr/local/src/tg/bin/telegram-cli --json -k /usr/local/src/tg/tg-server.pub -W -d -P 8089 &

Теперь нам необходим скрипт который будет взаимодействовать с telegram-cli.

По ключевым словам(telegram-cli php client) на GitHub было найдено готовое решение на PHP.

Установка:
git clone https://github.com/zyberspace/php-telegram-cli-client
cd php-telegram-cli-client
curl -sS https://getcomposer.org/installer | php
php composer.phar install

Создаем файл tg.php со следующим содержанием:
<?php

	require('vendor/autoload.php');
	$telegram = new \Zyberspace\Telegram\Cli\Client('tcp://localhost:8089');

	$USERNAME = '';

	if($user = $telegram->exec("resolve_username {$USERNAME}")){

		if($user->type == 'user'){

			$code = mt_rand(10000, 99999);
			$message = "Hi {$user->first_name}! Your code: {$code}";
			if($telegram->exec("msg user#{$user->id} {$message}")){
				echo "Send message: Success\r\n";
			} else {
				echo "Send message: Error\r\n";
			}
		}

	} else {
		echo "User {$USERNAME} not found.\r\n";
	}

В переменную $USERNAME вписываем username пользователя которому будет отправлено сообщение с кодом подтверждения.

Запускаем скрипт:
php tg.php
Если все прошло успешно, пользователю будет отправлено сообщение с кодом.

На базе данного примера можно легко реализовать регистрацию/авторизацию пользователей через Telegram.

Спасибо за внимание!

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


  1. BuriK666
    06.08.2015 17:39

    Мне кажется быстро забанят такой аккаунт.


    1. dginz
      06.08.2015 19:20

      Да вроде бы и не запрещено это явно: core.telegram.org/api/terms-of-use

      Хотя…

      In case you want a real Terms of Use, complete with lawyer-speak and all — we don't have that yet, sorry. But we may be adding it in the future.


      1. BuriK666
        06.08.2015 19:29

        Будет выглядеть очень странно, если один контакт пишет многим людям, а ему никто не отвечает.


  1. ibeatle
    06.08.2015 20:59
    +4

    Очень плохой пример авторизации на базе Telegram.

    Правильное решение — использовать Telegram Bots API. Он был создан как раз для подобных задач.

    Автор явно не обратил внимание на раздел про Deep Linking. Этот механизм позволяет пользователю одним кликом на внешнем сайте открыть переписку с ботом в Telegram с передачей произвольного параметра.

    Во-первых с точки зрения usability пользователю куда проще нажать на одну кнопку на сайте, чтобы перейти в Telegram сразу в нужное место.

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


    1. el777
      07.08.2015 10:47

      Читал про этот Deep Linking. Действительно можно легко передать данные боту. Например даешь ссылку на
      telegram.me/TheBot?start=QQ

      А в боте получаешь:

      {
         "result" : [
            {
               "message" : {
                  "text" : "/start QQ",     //    <--------
                  "date" : 1438985300,
                  "message_id" : 16,
                  "from" : {
                     "first_name" : "Habra",
                     "id" : 110304546,
                     "last_name" : "User"
                  },
                  "chat" : {
                     "id" : 110304546,
                     "first_name" : "Habra",
                     "last_name" : "User"
                  }
               },
               "update_id" : 10336636
            }
         ],
         "ok" : true
      }
      


      Вопрос: можно ли открыть эту сессию в отдельном окне чата?


      1. ibeatle
        07.08.2015 16:28

        Что имеется ввиду под отдельным окном? У пользователя может быть установлен любой из клиентов, в т.ч. нативный.


        1. el777
          07.08.2015 16:51

          Отдельный чат с уникальным id и только своей историей.

          Как именно это будет оформлено — отдельное окно, вкладки в браузере или будет какой-то особый способ выбора этого чата — не имеет значения.
          Если я правильно понимаю, на уровне протокола это поддерживается — у каждого чата есть chat_id. Если общаешься с одним пользователем, то этот id совпадает с id пользователя, если группа — то у нее свой id.
          Все, что нужно сделать — разрешить открывать отдельный чат.


          1. ibeatle
            07.08.2015 16:55

            Нет, такой возможности не предусмотрено и вряд ли стоит её ожидать в ближайшем будущем.


            1. el777
              07.08.2015 17:25

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


    1. ddumik
      08.08.2015 02:19

      На storebot.me так реализована авторизация через deep linking.


      1. SonkoDmitry
        12.08.2015 14:39
        +1

        На нем же так реализовано и голосование за своих ботов. В своих ботах мы через аналогичное решение отслеживаем источники трафика. telegram.me/samplebot?start=from_vk, telegram.me/samplebot?start=from_tw


  1. xakpc
    07.08.2015 00:35
    +1

    у storebot.me — стора для ботов сделана авторизация через бота. в принципе придя с токеном в чат и получив в ответ chatid или username пользователя можно авторизовать. хотя конечно это экзотика имхо.