47

電報ボットの準備が整いました。

Web ブラウザと Web サイトにたとえると、テレグラム クライアント アプリケーションはブラウザ クライアントに似ています。

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

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

電報ボットで同じ効果を得るにはどうすればよいですか?

ディープリンクが使えると言われました。説明はこちら

以下に再現します。

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

ステップ1のやり方は知っています。

残りを理解したい。

これは、ステップ 2 を解読しようとしたときに頭に浮かんだイメージです。

ここに画像の説明を入力してください

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

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

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

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

4

4 に答える 4

68

更新: 以下で説明する概念を説明するために、非常に単純な 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. 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 は '/start unique_code' として表示されず、'/start' のみとして表示されますが、ボットは引き続き '/start unique_code' を受け取ります。

于 2015-07-03T18:33:26.020 に答える
6

2018 年 2 月の時点で、Telegram ログイン ウィジェットを使用して、Telegram を通じて Web サイト上のユーザーを承認できます。

于 2018-02-27T08:14:40.323 に答える
5

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

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

また、ログインしたユーザーのみが電報を介して投票できない投票の例のデモもあります。

于 2016-02-03T18:34:07.110 に答える
4

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

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

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

于 2015-07-02T11:20:54.883 に答える