0

0

Telegram Bot v20:启动时获取与发送聊天信息指南

聖光之護

聖光之護

发布时间:2025-10-11 14:33:01

|

704人浏览过

|

来源于php中文网

原创

Telegram Bot v20:启动时获取与发送聊天信息指南

Telegram Bot v20 启动时逻辑处理概述

在开发 telegram 机器人时,有时需要在机器人开始接收并处理用户更新之前执行一些初始化任务,例如发送欢迎消息、加载配置或收集特定信息。python-telegram-bot v20 版本引入了 applicationbuilder 和异步机制,使得这类启动时逻辑的处理方式与旧版本有所不同。本文将详细指导如何在 post_init_handler 中安全、高效地实现这些功能。

正确的API调用方式

在 python-telegram-bot v20 中,要进行 Telegram API 调用,最核心的组件是 Bot 实例。在 Application 对象构建完成后,您可以通过 application.bot 属性轻松访问到它。这意味着您无需手动创建 Bot 实例,直接利用 application.bot 即可发起各种 API 请求。

例如,要在启动时向特定用户发送一条消息,您可以在 post_init_handler 中使用 await application.bot.send_message():

from telegram import Application
from telegram.ext import ApplicationBuilder, PicklePersistence

async def post_init_handler(application: Application) -> None:
    """
    在机器人启动后,开始接收更新前执行的初始化逻辑。
    """
    print("post_init_handler 已执行")
    target_user_id = 123456789  # 替换为实际的用户ID

    # 使用 application.bot 发送消息
    await application.bot.send_message(
        chat_id=target_user_id,
        text="机器人已成功启动并执行了初始化逻辑!"
    )
    print(f"已向用户 {target_user_id} 发送启动消息。")

def main() -> None:
    # 假设 bot_token 和 persistent_data_file_path 已定义
    bot_token = "YOUR_BOT_TOKEN"
    persistent_data_file_path = "bot_data.pkl"

    persistence_object = PicklePersistence(filepath=persistent_data_file_path)
    application = (
        ApplicationBuilder()
        .token(bot_token)
        .persistence(persistence=persistence_object)
        .post_init(post_init_handler)  # 注册 post_init_handler
        .build()
    )

    # 机器人将在此处开始轮询更新
    application.run_polling()

if __name__ == "__main__":
    main()

需要注意的是,Application.create_task 是 python-telegram-bot 提供的一个便利函数,用于在应用程序的事件循环中创建和管理异步任务,它主要用于通用的异步编程场景,而非直接发起 Telegram API 请求。进行 API 请求时,直接使用 application.bot 即可。

API调用的正确放置位置

post_init_handler 是执行启动时 API 调用的理想位置。这个回调函数在 Application 对象构建完成之后、但在 application.run_polling() 开始监听并处理更新之前被调用。它的设计目的正是为了让开发者能够在机器人正式投入运行前,执行任何必要的自定义逻辑或初始化操作。

在 post_init_handler 内部,application.bot 实例已经完全可用,包括获取 bot.id 等属性。因此,将所有需要在机器人启动时执行的 API 调用或数据处理逻辑放入 post_init_handler 是最符合框架设计的方式。

获取机器人所在聊天的数据

一个常见的需求是获取机器人当前所在的所有聊天(包括私聊、群组、超级群组和频道)的列表及其详细信息。然而,Telegram Bot API 本身并没有提供一个直接的 API 调用来获取机器人所加入的所有聊天的完整列表。 这是 Bot API 的一个设计限制。

这意味着,您不能像查询用户或特定聊天信息那样,通过一个简单的 get_chats 或类似方法来获取这些数据。唯一可靠的方式是手动跟踪

推荐方案:通过 chat_member 更新手动维护列表

Otter.ai
Otter.ai

一个自动的会议记录和笔记工具,会议内容生成和实时转录

下载

要维护机器人所在聊天的列表,最可靠的方法是利用 Telegram 发送的 chat_member 更新。当机器人被添加到一个聊天、从一个聊天中移除,或者其在聊天中的成员状态发生变化时,Telegram 都会发送相应的 chat_member 更新。

您需要:

  1. 注册 ChatMemberHandler: 监听 ChatMember 更新。
  2. 处理更新: 当收到 chat_member 更新时,根据更新内容(例如,机器人被添加或移除)来更新您本地维护的聊天列表。
  3. 数据持久化: 将这个聊天列表持久化存储(例如,使用 PicklePersistence 或数据库),以便在机器人重启后能够恢复。

通过这种方式,您可以逐步构建和维护一个相对准确的机器人所在聊天列表。虽然这需要一些额外的工作,但它是目前唯一官方推荐且可靠的方案。

综合示例:启动时发送模拟聊天信息

由于无法直接在启动时获取所有聊天列表,下面的示例将演示如何在 post_init_handler 中,结合 application.bot,将一个模拟的聊天列表信息格式化并发送给一个指定的管理员用户。这假设您已经通过手动跟踪并持久化存储的方式,获得了一个聊天列表。

from telegram import Application, ChatMember, Chat, BotCommandScopeChat
from telegram.ext import ApplicationBuilder, PicklePersistence, ChatMemberHandler
import asyncio

# 假设这是一个通过持久化存储加载的模拟聊天列表
# 实际应用中,这个列表会通过 ChatMemberHandler 动态维护
MOCKED_CHATS_DATA = [
    (123456, "@user_private_chat", Chat.PRIVATE, False, "N/A"),
    (-100123456789, "@my_supergroup", Chat.SUPERGROUP, True, "can_post_messages, can_delete_messages"),
    (-100987654321, "Team Discussion", Chat.GROUP, False, "can_send_messages"),
    (-100555444333, "Announcements Channel", Chat.CHANNEL, True, "can_edit_messages, can_delete_messages")
]

async def post_init_handler(application: Application) -> None:
    """
    在机器人启动后执行的初始化逻辑,包括发送模拟聊天信息。
    """
    print("post_init_handler 已执行")
    admin_user_id = 123456789  # 替换为接收通知的管理员用户ID

    bot_id = application.bot.id
    print(f"机器人 ID: {bot_id}")

    # 格式化聊天信息
    chat_info_messages = ["机器人当前已知的聊天信息列表:"]
    for chat_id, chat_name, chat_type, is_owner, admin_rights in MOCKED_CHATS_DATA:
        info_line = (
            f"ID: {chat_id}, 名称/标题: {chat_name}, 类型: {chat_type}, "
            f"是否所有者: {is_owner}, 机器人权限: {admin_rights}"
        )
        chat_info_messages.append(info_line)

    # 将所有信息合并成一条消息发送
    full_message = "\n".join(chat_info_messages)

    try:
        await application.bot.send_message(
            chat_id=admin_user_id,
            text=full_message
        )
        print(f"已向管理员 {admin_user_id} 发送启动时的聊天信息汇总。")
    except Exception as e:
        print(f"发送启动信息失败: {e}")

async def chat_member_update_handler(update, context):
    """
    处理 chat_member 更新,用于维护聊天列表。
    (此处的实现仅为示例,实际应用中需更复杂地更新 MOCKED_CHATS_DATA)
    """
    new_chat_member = update.chat_member.new_chat_member
    old_chat_member = update.chat_member.old_chat_member
    chat = update.effective_chat

    if new_chat_member.user.id == context.bot.id and new_chat_member.status == ChatMember.MEMBER:
        print(f"机器人被添加到聊天: {chat.title} ({chat.id})")
        # 在这里更新 MOCKED_CHATS_DATA 或持久化存储
    elif old_chat_member and old_chat_member.user.id == context.bot.id and new_chat_member.status == ChatMember.LEFT:
        print(f"机器人离开了聊天: {chat.title} ({chat.id})")
        # 在这里从 MOCKED_CHATS_DATA 或持久化存储中移除

def main() -> None:
    bot_token = "YOUR_BOT_TOKEN"  # 替换为您的机器人Token
    persistent_data_file_path = "bot_data.pkl"

    persistence_object = PicklePersistence(filepath=persistent_data_file_path)
    application = (
        ApplicationBuilder()
        .token(bot_token)
        .persistence(persistence=persistence_object)
        .post_init(post_init_handler)
        # .post_stop(post_stop_handler) # 如果有停止时的处理函数
        .build()
    )

    # 注册 chat_member 更新处理器
    application.add_handler(ChatMemberHandler(chat_member_update_handler, chat_member_types=ChatMemberHandler.MY_CHAT_MEMBER))

    application.run_polling()

if __name__ == "__main__":
    main()

注意: 上述示例中的 MOCKED_CHATS_DATA 仅用于演示如何格式化和发送数据。在实际应用中,您需要通过 ChatMemberHandler 动态地捕获 chat_member 更新,并将其持久化存储,而不是使用硬编码的模拟数据。

注意事项与最佳实践

  1. 异步操作 (await): post_init_handler 是一个异步函数 (async def),所有在其内部进行的 Telegram API 调用都必须使用 await 关键字。
  2. 错误处理: 在 post_init_handler 中执行的任何 API 调用都应包含适当的错误处理机制(例如 try-except 块),以防止初始化逻辑失败导致机器人无法正常启动或进入轮询状态。
  3. 数据持久化: 对于像聊天列表这样需要在机器人重启后仍然保留的数据,务必使用 PicklePersistence 或其他数据库方案进行持久化存储。python-telegram-bot 的 ApplicationBuilder 允许您直接配置持久化对象。
  4. 避免长时间阻塞: post_init_handler 的执行会阻塞机器人进入 run_polling() 状态。因此,确保其中的逻辑尽可能高效,避免执行长时间运行或可能无限等待的操作。

总结

在 python-telegram-bot v20 中,利用 ApplicationBuilder 的 post_init_handler 回调函数是处理机器人启动时自定义逻辑的关键。通过 application.bot 实例,您可以方便地进行各种 Telegram API 调用。然而,需要明确的是,Telegram Bot API 不提供直接获取机器人所有聊天列表的功能;维护此类列表需要通过监听 chat_member 更新并进行持久化存储来实现。遵循这些指导原则和最佳实践,可以帮助您构建一个健壮、功能完善的 Telegram 机器人。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

390

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2112

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

359

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

420

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

480

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

231

2023.10.19

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号