如何在电报机器人中获得身份验证?

2024-01-30

Telegram 机器人现已准备就绪。

如果我们使用网络浏览器和网站进行类比,那么电报客户端应用程序就像浏览器客户端。

Telegram 聊天室就像网站。

假设我们有一些信息,我们只想限制某些用户,在网站上,我们将进行身份验证。

我们如何在 Telegram 机器人上达到同样的效果?

有人告诉我可以使用深层链接。参见说明here https://core.telegram.org/bots#deep-linking

我将在下面重现它:

  1. 使用合适的用户名创建一个机器人,例如@ExampleComBot
  2. 为传入消息设置 Webhook
  3. 生成足够长度的随机字符串,例如$memcache_key =“vCH1vGWJxfSeofSAs0K5PA”
  4. 将带有 $memcached 键的值 123 放入 Memcache 中 3600 秒(一小时)
  5. 向我们的用户显示按钮https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA https://telegram.me/ExampleComBot?start=vCH1vGWJxfSeofSAs0K5PA
  6. 配置 Webhook 处理器以使用在以 /start 开头的传入消息中传递的参数查询 Memcached。 如果该密钥存在,则将传递给 webhook 的 chat_id 记录为 用户 123 的 telegram_chat_id。从 Memcache 中删除密钥。
  7. 现在,当我们想要向用户 123 发送通知时,检查他们是否具有字段 telegram chat_id。如果是,请使用 Bot API 中的 sendMessage 方法在 Telegram 中向他们发送消息。

我知道怎么做第 1 步。

我想了解其余的内容。

当我尝试解读步骤 2 时,我脑海中浮现出这样的画面。

因此,各种 Telegram 客户端在其应用程序上与 ExampleBot 通信时与 Telegram Server 进行通信。通信是双向的。

步骤 2 建议 Telegram 服务器通过 Webhook 更新 ExampleBot 服务器。 Webhook 只是一个 URL。

到目前为止,我的说法正确吗?

使用它进行身份验证的下一步是什么?


Update:我使用一个非常简单的 PHP 应用程序创建了一个 GitHub 存储库来说明下面解释的概念:

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


是否使用 webhook 实际上并不重要。 “深层链接”解释道:

  1. 让用户通过实际的用户名密码身份验证登录实际网站。
  2. 生成唯一的哈希码(我们将其称为 unique_code)
  3. 将 unique_code->username 保存到数据库或键值存储中。
  4. 向用户显示 URLhttps://telegram.me/YOURBOTNAME?start=unique_code 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 https://github.com/eternnoir/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)

注意:在 Telegram 客户端中,unique_code 不会显示为“/start unique_code”,而只会显示为“/start”,但您的机器人仍会收到“/start unique_code”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在电报机器人中获得身份验证? 的相关文章

随机推荐

  • 仅在反应本机 MapView 上设置初始区域

    使用案例 使用react native MapView 组件将注释显示在地图上 设置初始地图区域 以便所有注释都可见 注释正在移动 这会触发重新渲染 此外 用户应该能够平移 缩放地图 所以onRegionChange and onRegio
  • 使用 Leiningen 在 Raspberry Pi 上改进 Clojure REPL 的启动时间

    我获得了 Raspberry Pi 512MB 版本 2012 年末 并安装了适用于 ARM 的 Java SE 8 开发者预览版 https blogs oracle com java entry developer preview of
  • 无限循环 - 顶部还是底部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 本着这样的问题的精神您的循环是在顶部还是底部进行测试 https stackoverflow com questions 224059 do y
  • 当你是 git 中的原始仓库时,你如何进行本地拉取?

    我有一台服务器 我在其中设置了 Git 存储库 从我的客户那里 我可以执行 git拉原点 and git 推送原点 我的更改已正确推送 拉取到远程 Git 服务器 我还需要能够在服务器本身上签出项目 我没有使用初始化 裸露当我设置它时 因为
  • 如何在 Spark 2.0+ 中编写单元测试?

    我一直在尝试寻找一种合理的测试方法SparkSession使用 JUnit 测试框架 虽然似乎有很好的例子SparkContext 我不知道如何获得相应的示例SparkSession 即使它在内部的多个地方使用火花测试基地 https gi
  • AXIS-JAXB Unmarshal 不适用于除 jdk 1.8.077 之外的任何 JDK

    我已遵循以下程序 使用 WSDL Apache Axis 1 在 eclipse 中生成客户端文件 使用 JAXB 解组请求 XML 然后调用 Web 服务 如果我使用 JDK 1 8 077 则 XML 会成功解析 如果我使用任何其他 J
  • 在基于phonegap的应用程序上使用jspdf生成客户端pdf

    我尝试从本地数据生成pdf 我在使用 ArrayBuffer 和 Uint8Array 对象时遇到问题 解决方案是添加我在互联网上找到的 js 实现 现在这一行有一个错误 E Web Console 21515 Uncaught TypeE
  • 导入错误:没有名为 argparse 的模块

    我正在尝试运行 Python 程序 但出现错误 ImportError No module named argparse 我找到了问题 argparse cli 中的 Python 模块 https stackoverflow com qu
  • 在任何页面上设计注册表单

    我试图允许用户在我的主页 登陆页面上注册该网站 我已将设备注册表复制到我的登陆页面视图中 div br div div br div div div
  • Ruby,exec、system 和 %x() 或反引号之间的区别

    以下 Ruby 方法有什么区别 exec system and x or 反引号 我知道它们用于通过 Ruby 以编程方式执行终端命令 但我想知道为什么有三种不同的方法来执行此操作 system The system http www ru
  • dropzone.js 在没有 dropzone 的页面上给出错误“无效的 dropzone 元素”

    我正在使用 dropzone js 它在我需要 dropzone 的页面上运行得很好 在任何其他页面上 虽然它给了我一个 Invalid dropzone element 错误消息并导致我的其他 javascript 出现问题 我有一个自定
  • 区分 False 和 0

    假设我有一个包含不同值的列表 如下所示 1 2 3 b None False True 7 0 我想迭代它并检查每个元素是否不在某些禁止值列表中 例如 这个列表是 0 0 0 当我检查是否为 False 时 0 0 0 I get True
  • 为什么必须使用函数指针?

    什么情况下需要函数指针 标准答案似乎是回调 但为什么我们不能只传递一个函数呢 我正在阅读的关于 C 的书演示了将函数作为参数传递 并承认实际上编译器会将其转换为函数指针并传递它 因为函数不是实际对象 它显示了使用函数指针的等效代码 这稍微复
  • Ruby on Rails:默认情况下阻止选择列

    I have entries表与一个content可能包含大量文本的字段 在大多数情况下 我不需要访问该字段 因此每次从数据库加载大量未使用的数据 从 id 1 的条目中选择 似乎是对资源的巨大浪费 我如何指定default scope 除
  • 从 bash 输出中排除一个字符串

    我现在正在做一个项目 在这个项目中 由于某些原因 我需要从与模式匹配的输出 或文件 中排除第一个字符串 困难在于我只需要排除一个字符串 即流中的第一个字符串 例如 如果我有 1 abc 2 qwerty 3 open 4 abc 5 tal
  • 我怎样才能得到下面图片的黑白图像?

    我想将图片准确地转换为黑白图像 其中种子将由白色表示 背景为黑色 我想把它放在 python opencv 代码中 请帮帮我 I got good result for the above picture using the given c
  • Swift:UIDocumentInteractionController 不起作用?

    UIDocumentInteractionController 不适用于具有多个页面的大型 pdf 文件 在我的代码中 var docController UIDocumentInteractionController DispatchQu
  • 如何让文本区域占据 div 中的剩余高度?

    我有一组代码如下 要点是在 div 中放置一组图像 然后用文本区域填充 div 的其余部分 如果我设置 height 100 它将使其高度相同 这不是 div height images height 并使文本区域更长 w3c 上说的是in
  • 如何在不写入主目录的情况下运行 podman 和 buildah?

    我的主目录中几乎没有剩余磁盘空间 但是 我的目录中有很多磁盘空间 scratch tmp实验 该目录现在是空的 我想尝试一下命令podman and buildah 只是为了实验和学习 实验结束后我想删除该目录 scratch tmp实验
  • 如何在电报机器人中获得身份验证?

    Telegram 机器人现已准备就绪 如果我们使用网络浏览器和网站进行类比 那么电报客户端应用程序就像浏览器客户端 Telegram 聊天室就像网站 假设我们有一些信息 我们只想限制某些用户 在网站上 我们将进行身份验证 我们如何在 Tel