在机器人启动时,在应用程序 build() 之后但在 run_polling() 之前从 Telegram 获取/发送一些信息?

问题描述 投票:0回答:1

我对此有点困惑,因为我是 python-telegram、-bot 的新手,而且大多数在线示例都没有反映更新程序和 asyncio 的 v20 更改。

相关代码片段是:

def main() -> None:
    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()
        )
    application.run_polling()

async def post_init_handler(application: Application) -> None:
    print("init")
    bot_id=application.bot.bot.id
    # Needed: Code snippet here (details below)
    # It produces a list, which is sent as a raw text private message to a static defined user_id

if __name__ == "__main__":
    main()

缺少的代码片段获取机器人所在的所有聊天(私人、群组、超级群组)的列表,以及每个聊天的一些关键信息(见下文),然后将该信息作为私人消息发送到特定的 user_id。在成功之前它不会进入轮询。它整理和发送的信息是:

(chat id,
 username/title of the chat,
 chat type (private, group etc),
 is the bot the owner of the chat? (if a group/channel),
 bot's admin rights in the chat (if a group/channel and admin)
)

因此发送的典型输出是:

123456,@fred99,private,(ignored),(ignored)
872981,@technogeek_chat,supergroup,True,(rights data)
(etc)

我无法找出在机器人启动时获取和发送此数据的正确方法。

  • 使用正确的 API 调用?
    我能找到的所有示例,假设它们的操作是在某个回调处理程序中根据轮询收到的更新而被动完成的,或者如果最初完成,则该示例使用较旧的 Updater/调度程序技术不适用于 v20。
    我*认为*从 v20 的过渡指南中,

    application.create_task
    可能是正确的答案,但如果是这样,我没有一个好的例子可以依赖,我将如何使用它。

  • API 调用/S 的正确位置?
    我尝试将代码移至

    application...build()
    之间和
    run_polling()
    之前,但分配
    bot_id=application.bot.bot.id
    失败,我无法使其正常工作。我认为它希望它被初始化,但我不确定什么是正确的,或者对于这个代码片段来说,两者中哪个位置更正确,并将其留在
    post_init_handler()
    中,至少 * 似乎 * 可以工作?

  • 获取呼叫/S 的数据?
    我试图找到代码来列出机器人所在的聊天。唯一的链接是示例“chatmemberbot.py”,并且该代码实际上并不能检测机器人的聊天内容它依赖于根据更新从手动维护的列表中添加和删除。在某些情况下(错误、持久存储已删除/损坏/旧存储已恢复、过去最终刷新之前关闭,...),这可能会与它所在的实际聊天不同步,并且机器人永远不会知道它的列表不是正确。

请问正确的做法是什么?是否有可能有一个实际的例子 - 如果更容易的话就简化 - 应该如何完成,因为我已经搜索了文档但无法从中找出答案?

非常感谢您的帮助,谢谢!!

python telegram python-telegram-bot
1个回答
0
投票

使用正确的 API 调用?

要简单地向 Telegram 发出请求,您只需要一个

Bot
实例。请查看 PTB Introduction 以获取一些示例。请注意,您已经通过
Bot
获得了一个
application.bot
实例,因此无需自己构建一个实例。您可以简单地通过例如使用它

async def post_init_handler(application):
    await application.bot.send_message(text="Hello World", chat_id=123)

Application.create_task
与向 Telegram 发出请求无关,但它是使用 PTB 进行异步编程的简单便捷功能。

API 调用/S 的正确位置?

post_init
是正确的地方。此回调正是为了在更新轮询开始之前运行自定义逻辑。
Application.run_polling

的文档中也对此进行了解释

获取通话数据?

我试图找到代码来列出机器人所在的聊天记录

这根本不存在于Bot API中,手动跟踪是唯一的选择。您已经发现的聊天成员更新是执行此操作的最可靠方法。


免责声明:我目前是

python-telegram-bot
的维护者。

© www.soinside.com 2019 - 2024. All rights reserved.