web-dev-qa-db-ja.com

テレグラムボットで認証を取得するにはどうすればよいですか?

テレグラムボットの準備ができました。

WebブラウザとWebサイトの類似性を使用する場合、電報クライアントアプリケーションはブラウザクライアントのようなものです。

テレグラムチャットルームはウェブサイトのようなものです。

特定のユーザーのみに制限したい情報があり、ウェブサイトで認証があるとします。

Telegram Botsで同じ効果を得るにはどうすればよいですか?

ディープリンクを使用できると言われました。説明を参照してください こちら

以下に再現します。

  1. 適切なユーザー名でボットを作成します。 @ExampleComBot
  2. 着信メッセージ用のWebhookをセットアップします
  3. 十分な長さのランダムな文字列を生成します。 $ memcache_key = "vCH1vGWJxfSeofSAs0K5PA"
  4. キー$ memcache_keyの値123をMemcacheに3600秒(1時間)入れます
  5. ユーザーにボタンを表示 https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA
  6. / startで始まる着信メッセージで渡されるパラメーターでMemcachedを照会するようにwebhookプロセッサーを構成します。キーが存在する場合、web123に渡されたchat_idをユーザー123のtelegram_chat_idとして記録します。Memcacheからキーを削除します。
  7. ここで、ユーザー123に通知を送信するときに、フィールドtelegram_chat_idがあるかどうかを確認します。はいの場合、Bot APIのsendMessageメソッドを使用して、Telegramでメッセージを送信します。

ステップ1の方法を知っています。

残りを理解したいです。

これは、ステップ2を解読しようとするときに心に留めておくイメージです。

Enter image description here

そのため、さまざまなテレグラムクライアントは、アプリケーションでExampleBotと通信するときにテレグラムサーバーと通信します。通信は双方向です。

ステップ2は、Telegram Serverがwebhookを介してExampleBotサーバーを更新することを示唆しています。 webhookは単なるURLです。

これまでのところ、私は正しいですか?

これを認証に使用するための次のステップは何ですか?

29
Kim Stacks

Update:非常に簡単なPHPアプリケーションを使用してGitHubリポジトリを作成し、以下に説明する概念を示します。

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


Webhookを使用するかどうかは、無関係です。「ディープリンク」の説明:

  1. ユーザーが実際のユーザー名とパスワードの認証を使用して実際のWebサイトにログインできるようにします。
  2. 一意のハッシュコードを生成します(unique_codeと呼びます)
  3. Unique_code-> usernameをデータベースまたはキーと値のストレージに保存します。
  4. ユーザーにURLを表示する https://telegram.me/YOURBOTNAME?start=unique_code
  5. ユーザーがTelegramでこのURLを開き、「開始」を押すとすぐに、ボットは「/ start unique_code」を含むテキストメッセージを受信します。unique_codeはもちろん実際のハッシュコードに置き換えられます。
  6. データベースまたはkey-valueストレージにunique_codeを照会して、ボットにユーザー名を取得させます。
  7. Chat_id-> usernameをデータベースまたはキーと値のストレージに保存します。

これで、ボットが別のメッセージを受信すると、データベース内の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)

注:unique_codeは、Telegramクライアントでは「/ start unique_code」として表示されず、「/ start」のみが表示されますが、ボットは引き続き「/ start unique_code」を受信します。

43
Pete

あなたは今のところ正しいです。

ただし、要件は少しあいまいです。別の方法で見てみましょう。制限された情報を特別なユーザーに送信する場合は、ユーザーにボットとの直接チャットを開始するか、単にgroupchatのユーザーchat_idを使用してメッセージの送信を開始するように依頼する必要があります。

ユーザーがボットのデフォルトモードである「プライバシーモード」でボットと通信する場合にのみ、ユーザーchat_idにアクセスできることに注意してください。

4
Vahid Mafi

2018年2月の時点で、 Telegram Login Widget を使用して、Telegramを介してWebサイトのユーザーを認証できます。

4
Groosha

認証ソリューションDjango のディープリンクを使用して実装しました。

このソリューションは、テレグラムチャットとDjangoユーザーを関連付ける認証トークンを生成します。一部のテレグラムユーザーが制限区域にアクセスしたい場合、Webにログインするためのリンクを含むテレグラムメッセージを受信します。ディープリンクを使用して、新しい認証済みチャットを開始するリンクを提供します。

また、ログインしたユーザーだけが電報で投票できない投票の例には、 デモ があります。

3
Juan Madurga