Как получить аутентификацию в боте Telegram?

Боты Telegram готовы.

Если мы используем аналогию с веб-браузером и веб-сайтами, клиентские приложения Telegram похожи на клиентов браузера.

Чаты Telegram похожи на веб-сайты.

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

Как добиться того же эффекта на ботов Telegram?

Мне сказали, что я могу использовать глубокие ссылки. См. Описание здесь

Я воспроизведу это ниже:

  1. Создайте бота с подходящим именем пользователя, например @ExampleComBot
  2. Настройте веб-перехватчик для входящих сообщений
  3. Сгенерируйте случайную строку достаточной длины, например $ memcache_key = "vCH1vGWJxfSeofSAs0K5PA"
  4. Поместите значение 123 с ключом $ memcache_key в Memcache на 3600 секунд (один час)
  5. Покажите нашему пользователю кнопку https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA
  6. Настройте обработчик веб-перехватчиков для запроса Memcached с параметром, который передается во входящих сообщениях, начиная с / start. Если ключ существует, запишите chat_id, переданный веб-перехватчику, как telegram_chat_id для пользователя 123. Удалите ключ из Memcache.
  7. Теперь, когда мы хотим отправить уведомление пользователю 123, проверьте, есть ли у него поле telegram_chat_id. Если да, используйте метод sendMessage в API ботов, чтобы отправить им сообщение в Telegram.

Я знаю, как сделать шаг 1.

Остальное хочу понять.

Это образ, который я имею в виду, когда пытаюсь расшифровать шаг 2.

Введите описание изображения здесь

Таким образом, различные клиенты Telegram взаимодействуют с сервером Telegram, когда разговаривают с ExampleBot в своих приложениях. Связь двусторонняя.

Шаг 2 предполагает, что сервер Telegram обновит сервер ExampleBot через веб-перехватчик. Веб-перехватчик - это просто URL-адрес.

Пока я прав?

Каков следующий шаг к использованию этого для аутентификации?


person Kim Stacks    schedule 25.06.2015    source источник


Ответы (4)


Обновление: я создал репозиторий GitHub с очень простым приложением PHP, чтобы проиллюстрировать концепцию, описанную ниже:

https://github.com/pevdh/telegram-auth-example


Независимо от того, используете вы веб-перехватчик или нет, не имеет значения. Внутренняя ссылка объясняет:

  1. Позвольте пользователю войти в систему на реальном веб-сайте с фактической аутентификацией по имени пользователя и паролю.
  2. Сгенерируйте уникальный хэш-код (мы назовем его unique_code)
  3. Сохраните unique_code- ›имя пользователя в базе данных или в хранилище ключей.
  4. Показать пользователю URL https://telegram.me/YOURBOTNAME?start=unique_code
  5. Теперь, как только пользователь откроет этот URL-адрес в Telegram и нажмет «Старт», ваш бот получит текстовое сообщение, содержащее «/ start unique_code», где unique_code, конечно, заменяется фактическим хэш-кодом.
  6. Позвольте боту получить имя пользователя, запросив в базе данных или хранилище значений ключей unique_code.
  7. Сохраните chat_id- ›имя пользователя в базе данных или хранилище ключей.

Теперь, когда ваш бот получает другое сообщение, он может запросить message.chat.id в базе данных, чтобы проверить, пришло ли сообщение от этого конкретного пользователя. (И обработать соответственно)

Некоторый код (с использованием pyTelegramBotAPI):

import telebot
import time

bot = telebot.TeleBot('TOKEN')

def extract_unique_code(text):
    # Extracts the unique_code from the sent /start command.
    return text.split()[1] if len(text.split()) > 1 else None

def in_storage(unique_code): 
    # Should check if a unique code exists in storage
    return True

def get_username_from_storage(unique_code): 
    # Does a query to the storage, retrieving the associated username
    # Should be replaced by a real database-lookup.
    return "ABC" if in_storage(unique_code) else None

def save_chat_id(chat_id, username):
    # Save the chat_id->username to storage
    # Should be replaced by a real database query.
    pass

@bot.message_handler(commands=['start'])
def send_welcome(message):
    unique_code = extract_unique_code(message.text)
    if unique_code: # if the '/start' command contains a unique_code
        username = get_username_from_storage(unique_code)
        if username: # if the username exists in our database
            save_chat_id(message.chat.id, username)
            reply = "Hello {0}, how are you?".format(username)
        else:
            reply = "I have no clue who you are..."
    else:
        reply = "Please visit me via a provided URL from the website."
    bot.reply_to(message, reply)

bot.polling()

while True:
    time.sleep(0)

Примечание: уникальный_код не будет отображаться как /start unique_code, только /start в клиенте Telegram, но ваш бот все равно получит /start unique_code.

person Pete    schedule 03.07.2015
comment
OP не хочет, чтобы пользователи общались через их приложение telgram. так что этот ответ не имеет значения, поскольку он полагается на /start - person supermario; 31.01.2016

С февраля 2018 года вы можете использовать виджет входа в Telegram для авторизации людей на своем веб-сайте через Telegram.

person Groosha    schedule 27.02.2018

Я только что реализовал решение для аутентификации с использованием глубинных ссылок для Django.

Это решение генерирует токены аутентификации для связывания чатов Telegram и пользователей Django. Когда какой-то пользователь Telegram хочет получить доступ к закрытой области, он получает сообщение Telegram со ссылкой для входа в Интернет. Один зарегистрированный веб-сайт предоставляет ссылку для начала нового аутентифицированного чата с использованием глубинных ссылок.

Также есть демонстрация для примера опроса, который может только авторизованный пользователь » t проголосовать через телеграмму.

person Juan Madurga    schedule 03.02.2016
comment
Интересно. Однако я не мог понять, как использовать его для аутентификации пользователей. Очень признателен, если вы можете предоставить полный пример аутентификации. - person supermario; 07.02.2016

Пока вы правы.

Однако ваши требования немного расплывчаты. Давайте посмотрим на это с другой стороны. Если вы хотите отправить ограниченную информацию специальным пользователям, вы должны попросить пользователя начать прямой чат с вашим ботом или просто использовать chat_id пользователей в групповом чате, чтобы начать отправлять им сообщение.

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

person Vahid Mafi    schedule 02.07.2015
comment
Я думал о какой-то аутентификации по логину и паролю. Или с помощью 6-значного телефонного пин-кода. - person Kim Stacks; 03.07.2015