有一个项目使用了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())