Telethon Event Listener + Asyncio hängt sich sporadisch auf

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mail1q2w
User
Beiträge: 1
Registriert: Montag 26. Oktober 2020, 14:13

Hallöchen :ugeek:

ich bin am verzweifeln und brauche eure Hilfe. Ich habe einen Event-Listener gebaut, der Telegram ausließt und Dinge abarbeitet.
In unbestimmten Intervallen hört der Loop einfach auf zu arbeiten und arbeitet erst dann weiter, wenn ich Strg+C drücke.
Ich habe nun versucht zu filtern, ob der Client vielleicht nicht mehr verbunden ist oder andere Probleme vorliegen - aber sehe, dass der Loop einfach aufhört zu arbeiten und einfriert.
Gibt's diese Erfahrung schon? Ggf. eine Lösung dazu?
Es ist übrigens unerheblich, ob ich Asyncio verwende oder die Telethon eigene Funktion runUntilDisconnected(), um den Loop zu steuern.

Code: Alles auswählen


import configparser
import json
import asyncio
import mysql.connector
import re
import time
import threading
import sys
from datetime import datetime  
from datetime import timedelta  
import time
from telethon.sync import TelegramClient
from telethon import TelegramClient, events
from telethon.errors import SessionPasswordNeededError
from telethon.tl.functions.channels import GetParticipantsRequest
from telethon.tl import types, functions
from telethon.tl.types import InputPeerUser
from telethon.tl.functions.messages import SendMessageRequest
from telethon.tl.functions.messages import GetHistoryRequest
from telethon.tl.types import (
PeerChannel
)

# Reading Configs
config = configparser.ConfigParser()
config.read("config.ini")

# Setting configuration values
api_id = config['Telegram']['api_id']
api_hash = config['Telegram']['api_hash']
api_hash = str(api_hash)
phone = config['Telegram']['phone']
username = config['Telegram']['username']


def OpenDbConnection():
    #create mysql connection
    mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    password="*****",
    database="*****"
    )
    print("database **** connected")
    return mydb
    
def CloseDbConnection(_mydb):
    _mydb.close()
    print("database **** disconnected")
    

# Create the client and connect
client = TelegramClient(username, api_id, api_hash)
client.start()
print("Client started")


@client.on(events.NewMessage(chats=(1332361311)))
async def normal_handler(event):
     bla bla

@client.on(events.NewMessage(chats=(1150597976)))
async def normal_handler(event):
	bla bla

@client.on(events.NewMessage(chats=(1369125754)))
async def normal_handler(event):
   bla bla
   
                          
async def run():
    while 1:
        print(f"time: {time.strftime('%X')}")
        if not await client.is_user_authorized():
            await client.send_code_request(phone)
            try:
                await client.sign_in(phone, input('Enter the code: '))
            except SessionPasswordNeededError:
                await client.sign_in(password=input('Password: '))
            print("User is not authorized")
        else:
            print("User is authorized")
        
        if not client.is_connected():
            await client.connect() 
            print("Client not connected")
        else:
            print("Client connected")
        await asyncio.sleep(240)
        sys.stdout.flush()
             
loop = asyncio.get_event_loop()
loop.run_until_complete( run() )
print("After")
            

Es bleibt nicht in der Bearbeitung der Nachrichten hängen stehen - der Loop wird zu ZP x einfach nicht mehr ausgeführt und die Zeit nicht mehr ausgegeben.
Bei Strg+C wird der ganze Buffer dann runtergerasselt - der Loop mithin beendet.
Was mache ich falsch?

Ich danke für alle hilfreichen Antworten!

:ugeek:
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt schon den genauen Fehler anschauen, an welcher Stelle es tatsächlich hängt.

Da wird einiges importiert, was dann nicht gebraucht wird. Einige Zeilen lassen sich auch zusammenfassen.
Auf oberster Ebene sollte kein Code stehen. api_hash sollte schon ein String sein. Die Handler sollten nicht alle normal_handler heißen. Funktionsnamen schreibt man wie Variablennamen komplett klein. Das my in mydb ist unsinnig. Und der Unterstrich in _mydb sogar falsch.
maximilian98
User
Beiträge: 1
Registriert: Samstag 3. April 2021, 09:09

Hallo,
ich habe genau das selbe Problem. Code läuft manchmal für Minuten, Stunden, Tage ohne Probleme. Dann passiert nichts mehr.
Hast du entzwischen eine Lösung gefunden für dein Problem?

Code: Alles auswählen

#!/usr/bin/python3
import asyncio
import logging
import sys
from telethon import TelegramClient,events,sync

logging.basicConfig(format='[%(levelname) 5s/%(asctime)s] %(name)s: %(message)s',level=logging.WARNING)
api_id = 123456
api_hash = '1234567890123456789012345678901'
chatid1=1234567890
chatid2=1234123450

tgclientid='tgclient01'
client = TelegramClient(tgclientid, api_id, api_hash)

@client.on(events.NewMessage(chatid1))
async def my_event_handlerchatid1(event):
    if 'hello' in event.raw_text.lower():
      await client.send_message(chatid1,'Hello! ID1')

@client.on(events.NewMessage(chatid2))
async def my_event_handlerchatid2(event):
    if 'hello' in event.raw_text.lower():
      await client.send_message(chatid2,'Hello! ID2')

client.start()
client.run_until_disconnected()
print("END")
Wenn ich Strg+C drücke folgende Ausgabe:
# handling updates, performing I/O, etc.
File "/usr/lib/python3.8/asyncio/base_events.py", line 603, in run_until_complete
self.run_forever()
File "/usr/lib/python3.8/asyncio/base_events.py", line 570, in run_forever
self._run_once()
File "/usr/lib/python3.8/asyncio/base_events.py", line 1823, in _run_once
event_list = self._selector.select(timeout)
File "/usr/lib/python3.8/selectors.py", line 468, in select
fd_event_list = self._selector.poll(timeout, max_ev)
KeyboardInterrupt
wäre toll wenn mir da jemand weiterhelfen könnte. Vielen Dank im voraus!
Antworten