Как получить аутентификацию в телеграмме?
Боты 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-адрес.
До сих пор я прав?
Какой следующий шаг к использованию этого для аутентификации?
Ответы
Ответ 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. Когда какой-либо пользователь телеграммы хочет получить доступ к запрещенной зоне, он получает сообщение телеграммы со ссылкой для входа в сеть. Один зарегистрированный веб-сайт предоставляет ссылку для запуска нового аутентифицированного чата с использованием глубокой привязки.
Также есть демо для примера опросов, который только зарегистрированный пользователь не может проголосовать через телеграмму.