簡體   English   中英

如何多次使用具有相同 session 的同一個電視節目客戶端

[英]How to use same telethon client with same session many times

我有這個 Telethon 代碼:

from telethon import TelegramClient
import asyncio

api_id = ""
api_hash = ""
session = "john"
username = 'Hello_World'   # For Example

async def main():
    client = TelegramClient(session, api_id, api_hash)
    await client.start()

    entity = await client.get_entity("https://t.me/ahsan_alhadeeth")
    search_user = await client.get_participants(entity, search=username)

    print(search_user)

def in_channel():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(main())

in_channel()
in_channel()

當我對in_channel()進行一次調用時,它會正常運行直到完成。

但是當使用兩個調用時它返回一個錯誤: sqlite3.OperationalError: database is locked

我想知道如何在不進行多次會話的情況下多次使用同一個客戶端。

請任何幫助。

我認為不可能在同一時間多次執行相同的任務。 由於這是 asyncio 函數,您可能希望等待第一個 in_channel() 完成,然后再執行下一個 in_channel。 database() 可能已被鎖定,因為客戶端已在使用中。

當您說多次使用同一個客戶端時,您的意思是多次運行 in_channel() 直到它完成,還是您的目標是同時運行多次 in_channel()?

我可能會幫助你,但我需要更多答案:-)

(對不起,這是一個“答案”。在我得到 50 分之前,我不允許發表評論。)

更好的是,您可以循環同一會話,但在 main 函數的末尾添加一個client.disconnect()

client = TelegramClient(session, api_id, api_hash)

TelegramClient 使用 Telegram 創建一個 session 並代表您的機器人或客戶端與 Telegram 的通信。 只是為了確保,這不是您與任何特定用戶(例如:約翰)的 session。 您可以根據需要與任何用戶進行交互,前提是有人發起了與您的對話或您的與憑據(api_id、api_hash)關聯的用戶/機器人被添加到相應的頻道/組。 您應該將此客戶端視為一個連接,可以在其中創建多個實例來負載平衡多個調用。

您的代碼可以修復如下:

from telethon import TelegramClient
import asyncio

class TClient:
    def __init__(self, session):
        api_id = ""
        api_hash = ""
        self.session = session

    async def init(self, username = 'Hello_World'):
        self.client = TelegramClient(session, api_id, api_hash)
        await self.client.start()

    async def main(self):
        entity = await client.get_entity("https://t.me/ahsan_alhadeeth")
        search_user = await client.get_participants(entity, search=username)

        print(search_user)

    def in_channel(self, callFn, args):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(callFn(args))

    in_channel()

if __name__ == '__main__':
    tc1 = TClient(session = "john1")
    tc1.in_channel(tc.init())
    tc1.in_channel(tc.main(username = 'Hello_World'))
    tc1.in_channel(tc.main(username = 'Hello_World2'))

    tc2 = TClient(session = "bot2")
    tc2.in_channel(tc.init(username = 'Hello_World'))))
    tc2.in_channel(tc.main(username = 'Hello_World2'))

以上內容使您能夠為多個用戶重復使用 session。 我對上面的內容做了 2 處修改。

  1. 我重構了代碼,以便可以使用具有不同 session id 的 Telegram 客戶端創建多個連接。
  2. 主 function 可以多次調用各種用戶名

PS - 我還沒有測試過上面的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM