pytelegrambotapi + pyrogram 实现 同步兼容异步 模式 完成双模式执行

349 阅读1分钟

有一个项目使用了pytelegrambotapi开发机器人,需要添加通知群组所有人功能。
pytelegrambotapi 无法获取群组所有人,需要加入pyrogram框架。
pyrogram 中的get_chat_members 是异步函数,尝试了很多办法(包括线程隔离)都没办法同时运行 pyrogram和pytelegrambotapi。

解决方案:
最后定义了一个pyrogram_worker同步函数对接pytelegrambotapi,在pyrogram_worker里定义 一个notify_all异步函数单独执行 pyrogram的函数

示例代码:

@bot.message_handler(func=lambda message: message.text == "通知所有人" and message.from_user.username in config.admin)
def pyrogram_worker(message):
    message_chat_id = message.chat.id

    async def notify_all():
        async with Client(config.bot_name, api_id=api_id, api_hash=api_hash, bot_token=config.botapi) as app:
            ret = ""
            async for member in app.get_chat_members(message_chat_id):
                if member.user.username:
                    ret += f"@{member.user.username} "
            await app.send_message(message_chat_id, ret)

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    # 在事件循环中运行Pyrogram异步操作
    loop.run_until_complete(notify_all())