Допустим, у Вас есть некий сервис, который предлагает пользователям вход через 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
Видим следующую картину:
Выходим из приложения:
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)
ibeatle
06.08.2015 20:59+4Очень плохой пример авторизации на базе Telegram.
Правильное решение — использовать Telegram Bots API. Он был создан как раз для подобных задач.
Автор явно не обратил внимание на раздел про Deep Linking. Этот механизм позволяет пользователю одним кликом на внешнем сайте открыть переписку с ботом в Telegram с передачей произвольного параметра.
Во-первых с точки зрения usability пользователю куда проще нажать на одну кнопку на сайте, чтобы перейти в Telegram сразу в нужное место.
Во-вторых подобный псевдо-пользователь, пишущий случайным пользователям первым, используя их username, для Telegram ничем не отличается от спам-бота, и следовательно, наверняка будет заблокирован.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 }
Вопрос: можно ли открыть эту сессию в отдельном окне чата?ibeatle
07.08.2015 16:28Что имеется ввиду под отдельным окном? У пользователя может быть установлен любой из клиентов, в т.ч. нативный.
el777
07.08.2015 16:51Отдельный чат с уникальным id и только своей историей.
Как именно это будет оформлено — отдельное окно, вкладки в браузере или будет какой-то особый способ выбора этого чата — не имеет значения.
Если я правильно понимаю, на уровне протокола это поддерживается — у каждого чата есть chat_id. Если общаешься с одним пользователем, то этот id совпадает с id пользователя, если группа — то у нее свой id.
Все, что нужно сделать — разрешить открывать отдельный чат.
ddumik
08.08.2015 02:19На storebot.me так реализована авторизация через deep linking.
SonkoDmitry
12.08.2015 14:39+1На нем же так реализовано и голосование за своих ботов. В своих ботах мы через аналогичное решение отслеживаем источники трафика. telegram.me/samplebot?start=from_vk, telegram.me/samplebot?start=from_tw
xakpc
07.08.2015 00:35+1у storebot.me — стора для ботов сделана авторизация через бота. в принципе придя с токеном в чат и получив в ответ chatid или username пользователя можно авторизовать. хотя конечно это экзотика имхо.
BuriK666
Мне кажется быстро забанят такой аккаунт.
dginz
Да вроде бы и не запрещено это явно: core.telegram.org/api/terms-of-use
Хотя…
BuriK666
Будет выглядеть очень странно, если один контакт пишет многим людям, а ему никто не отвечает.