Подтвердить что ты не робот

Как получить аутентификацию в телеграмме?

Боты Telegram теперь готовы.

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

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

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

Как мы достигаем такого же эффекта для ботов Telegram?

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

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

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

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

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

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

Enter image description here

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

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

До сих пор я прав?

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

4b9b3361

Ответ 1

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

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


Если вы используете webhook или нет, это не имеет значения. "Глубокое связывание" объясняется:

  • Позвольте пользователю войти на реальный веб-сайт с фактической аутентификацией имени пользователя и пароля.
  • Создайте уникальный хэш-код (мы будем называть его unique_code)
  • Сохранить уникальное_код- > имя пользователя в базе данных или хранилище ключей.
  • Показать пользователю URL https://telegram.me/YOURBOTNAME?start=unique_code
  • Теперь, как только пользователь откроет этот URL-адрес в Telegram и нажмет "Старт", ваш бот получит текстовое сообщение, содержащее "/start unique_code" , где уникальный_код, конечно, заменяется фактическим хэш-кодом.
  • Позвольте боту получить имя пользователя, запросив базу данных или хранилище ключей для уникального_кода.
  • Сохраните имя пользователя 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" .

Ответ 2

Вы правы до сих пор.

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

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

Ответ 3

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

Ответ 4

Я только что внедрил решение для проверки подлинности, используя глубокую привязку для Django.

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

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