Search code examples
python-3.xmultithreadingtelegram-botpyrogram

how to run pyrogram userbot with multiple user accounts using thread


I am coding a userbot in pyrogram but I want to run multiple Clients with different telegram account but I am stuck here. I want to run userbot on multiple accounts using one script if I will run it separately then I have to host it so many time I want to host it for one time and run for every account I have.
I think this will help to understand what I am saying.


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()

When I run this I am just getting error

Output:

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'.

Solution

  • With Pyrogram you don't need to use Threading. The internal code is already entirely asynchronous and you can just start the clients one after another, then call Client.idle() to keep them all "alive".

    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()
    

    Alternatively, here's a Gist with some more explanation.
    https://gist.github.com/pokurt/96afa69e86725850b2101099461609ed