如何使用线程运行具有多个用户帐户的热图用户机器人

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

我正在用pyrogram编写一个用户机器人,但我想使用不同的电报帐户运行多个客户端,但我被困在这里。 我想使用一个脚本在多个帐户上运行 userbot,如果我单独运行它,那么我必须托管它很多次,我想托管它一次并为我拥有的每个帐户运行。
我认为这将有助于理解我在说什么。


from pyrogram import Client, filters, handlers, idle
import threading
from pyrogram.handlers import MessageHandler

app1 = Client(
    session, api_hash, api_id)


app2 = Client(session,
              api_hash, api_id)


accounts = [app1, app2]


async def handlngmessage(client, message):
    print(message)
    print("\nstarted ")
    await client.send_message("me", "recived")


def runner(c):
    c.run()


for ac in accounts:
    ac.add_handler(handlers.MessageHandler(unmutedtest))
    t = threading.Thread(target=runner, args=(ac,))
    t.start()
    t.join()

当我运行这个时,我只是收到错误

输出

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.9/threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "/home/ak/Desktop/development/bots/pyrogramplugins/userbot/main.py", line 30, in runner
    c.run()
  File "/home/ak/.local/lib/python3.9/site-packages/pyrogram/methods/utilities/run.py", line 50, in run
    loop = asyncio.get_event_loop()
  File "/usr/lib/python3.9/asyncio/events.py", line 642, in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'Thread-1'.
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.9/threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "/home/ak/Desktop/development/bots/pyrogramplugins/userbot/main.py", line 30, in runner
    c.run()
  File "/home/ak/.local/lib/python3.9/site-packages/pyrogram/methods/utilities/run.py", line 50, in run
    loop = asyncio.get_event_loop()
  File "/usr/lib/python3.9/asyncio/events.py", line 642, in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'Thread-2'.
python-3.x multithreading telegram-bot pyrogram
2个回答
2
投票

使用 Pyrogram,您无需使用线程。内部代码已经完全异步,您可以一个接一个地启动客户端,然后调用

Client.idle()
让它们全部“存活”。

from pyrogram import Client

app1 = Client("first account")
app2 = Client("second account")

# You can either stack decorators ...
@app1.on_message()
@app2.on_message()
async def m_func(_, message):
    pass

# ... or use multiple add_handler calls
app1.add_handler(MessageHandler(m_func))
app2.add_handler(MessageHandler(m_func))

# Then start all Clients and call idle() to keep them running
app1.start()
app2.start()
Client.idle()
app1.stop()
app2.stop()

或者,这里有一个带有更多解释的要点。
https://gist.github.com/pokurt/96afa69e86725850b2101099461609ed


0
投票

pyrogram 提供

compose
功能。 来自文档:

import asyncio
from pyrogram import Client, compose


async def main():
    apps = [
        Client("account1"),
        Client("account2"),
        Client("account3")
    ]

    ...

    await compose(apps)


asyncio.run(main())

高温图撰写

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