我用两个不同的电报帐户加入了某个电报频道。我运行下面的代码来使用热解图启动两个会话并打印收到的消息。但我注意到,当电报频道收到一条消息时,只有其中一条被打印,而另一条则没有。但是,当我使用自己的测试电报通道进行测试时,我无法重现该问题,即两个会话都在测试通道上打印了消息。我不知道为什么其他频道会出现问题。这两个号码都订阅了该频道,并且在手机应用程序上,两部手机上都可以看到该消息。什么可能导致这种最奇怪的行为?
#!/usr/bin/python3
from pyrogram import Client, filters, idle
from pyrogram.handlers import MessageHandler
import config
from pytz import timezone
from datetime import datetime
import requests
import asyncio
CHANNEL_ID = -1000123456789
def india_number_handler(client, message):
message_handler('india_number', message)
def uk_number_handler(client, message):
message_handler('uk_number', message)
def message_handler(session_name, message):
if message.sender_chat is not None and message.sender_chat.id == CHANNEL_ID and message.text is not None:
print(datetime.now().strftime('%d-%m-%Y-%H:%M:%S-%f') + ': ' + session_name + ' received channel message: ' + message.text, flush = True
async def main():
app_india = Client("india_number", api_id=config.getEnv("api_id"), api_hash=config.getEnv("api_hash"))
app_uk = Client("uk_number", api_id=config.getEnv("api_id"), api_hash=config.getEnv("api_hash"))
app_india.add_handler(MessageHandler(india_number_handler))
app_uk.add_handler(MessageHandler(uk_number_handler))
await app_india.start()
await app_uk.start()
await idle()
await app.stop()
await app_uk.stop()
asyncio.run(main())
更新 1:我最终能够通过我的测试通道重现该问题,仅打印了印度会话,而英国会话没有打印任何内容。我注意到一些奇怪的事情 - 当我交换 start() 语句的顺序以便首先发生 app_uk.start() 时,然后英国会话开始打印,印度会话陷入沉默。这表明发生了与线程阻塞相关的错误,尽管令人困惑的是为什么两个会话在我的测试通道上成功接收事件的行为不一致。
更新 2:我修改了代码以仅处理 1 个会话,并从不同的终端运行脚本的两个实例,每个电报帐户一个,但即使现在只有其中一个正在接收消息,因此这对于任何终端都不是问题不正确的异步用法。此外,此设置适用于我的测试通道,但仅不适用于之前不起作用的同一通道。这真是令人沮丧。
在同一帐户上同时使用多个客户端 用户和机器人帐户都可以并行运行多个会话。但是,您不得同时在多个客户端中使用同一会话。在同一帐户上运行多个客户端的正确方法是每次从一开始就授权您的帐户(用户或机器人),并为每个并行客户端使用一个单独的会话。