Seite 1 von 1

Telethon - Wartezeit zwischen den Nachrichten

Verfasst: Sonntag 29. Dezember 2019, 13:58
von rilc0n
Moin da draußen...

ich habe ein Problem. Ich versuche mit Telethon eine automatische Weiterleitung zu programmieren. Und zwar sollen alle Nachrichten aus bestimmten Telegram-Gruppen zu einen Andere weitergeleitet werden.

Aber ich möchte die Nachrichten nicht alle auf einmal weiterleiten lassen, sondern versetzt nach z.B. 10 Sekunden. Also wenn 100 Nachrichten ankommen, sollen nicht sofort alle 100 auf einmal weitergeleitet werden, sondern in Abstand von 10 Sekunden.

Aber ich bekomme es einfach nicht hin.

Als Grundlage-Code habe ich den Code von https://github.com/glogiotatidis/tg-relay genommen.

Hier ist mein Code:

Code: Alles auswählen

#!/usr/bin/env python
import asyncio
import logging
import datetime
import hashlib

from telethon import TelegramClient, events

import config

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

client = TelegramClient(config.SESSION_NAME, config.API_ID, config.API_HASH)
client.start()

RELAY_MAP = {}


async def setup():
    user = await client.get_me()
    logger.info(' Starte Server durch {}'.format(user.first_name))
    await client.get_dialogs()

    for x in config.RELAY_MAP.split(';'):
        if not x:
            return

        key, values = x.split(':', 1)
        values = values.split(',')
        RELAY_MAP[int(key)] = [int(x) for x in values]


@client.on(events.NewMessage)
async def my_event_handler(event):
    for chat_id, relays in RELAY_MAP.items():
        if event.chat and event.chat.id == chat_id:
            for relay in relays:

                # Prüfen ob die angekommene Nachricht überhaupt Text enthält...
                if event.raw_text == "":
                    print(
                        "🅾️ " + datetime.datetime.now().strftime('%X') + ": Nachricht enthält keinen Text...")

                # Sonst diese Benachrichtigung ausgeben und die Nachricht posten
                else:
                    print("✅ " + datetime.datetime.now().strftime(
                        '%X') + ": Nachricht '{}...' wurde von {} zu {} gesendet".format(event.raw_text[:50].replace("\n", " "), event.chat.id, relay))

                # Die Nachricht wird gepostet
                await client.send_message(relay, event.message)

                break


loop = asyncio.get_event_loop()
loop.run_until_complete(setup())
client.run_until_disconnected()
Kann mir vielleicht jemand bitte einen Tipp geben. Danke 😢

Re: Telethon - Wartezeit zwischen den Nachrichten

Verfasst: Sonntag 29. Dezember 2019, 17:10
von Sirius3
Du brauchst eine Queue, in die Du alle Nachrichten steckst und die Du nacheinander abarbeitest.

Benutze keine globalen Variablen. Warum benutzt Du mal Stringformatierung und dann stückelst Du in der gleichen Zeile Strings per + zusammen? Warum hast Du alle Konstanten nach config ausgelagert? Wird das wo anders auch benutzt?
hashlib wird importiert aber nirgends verwendet.

So könnte es aussehen:

Code: Alles auswählen

#!/usr/bin/env python3
import asyncio
import logging
import datetime
from telethon import TelegramClient, events
from functools import partial
import config

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

async def relay_event_handler(queue, relay_map, event):
    for chat_id, relays in relay_map.items():
        if event.chat and event.chat.id == chat_id:
            now = datetime.datetime.now()
            # Prüfen ob die angekommene Nachricht überhaupt Text enthält...
            if event.raw_text == "":
                print(f"🅾️ {now:%X}: Nachricht enthält keinen Text...")
            # Sonst diese Benachrichtigung ausgeben und die Nachricht posten
            else:
                raw = event.raw_text[:50].replace("\n", " ")
                print(f"✅ {now:%X}: Nachricht '{raw}...' wurde von {event.chat.id} zu {relays} gesendet")
                queue.put((relays, event.message))

async def send_messages(client, queue):
    while True:
        relays, message = await queue.get()
        for relay in relays:
            # Die Nachricht wird gepostet
            await client.send_message(relay, message)
        await asyncio.sleep(10)

async def main():
    client = TelegramClient(config.SESSION_NAME, config.API_ID, config.API_HASH)
    client.start()
    user = await client.get_me()
    logger.info(' Starte Server durch {}'.format(user.first_name))
    await client.get_dialogs()

    relay_map = {}
    for relay in config.RELAY_MAP.split(';'):
        if not relay:
            break
        key, values = relay.split(':', 1)
        relay_map[int(key)] = [int(k) for k in values.split(',')]
    
    queue = asyncio.Queue()
    asyncio.create_task(send_messages(client, queue))
    client.add_event_handler(partial(relay_event_handler, relay_map, queue), events.NewMessage)
    await client.run_until_disconnected()

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

Re: Telethon - Wartezeit zwischen den Nachrichten

Verfasst: Donnerstag 2. Januar 2020, 13:38
von rilc0n
Ok, danke für deine Hilfe. Ich werde es damit mal versuchen.
Benutze keine globalen Variablen. Warum hast Du alle Konstanten nach config ausgelagert? Wird das wo anders auch benutzt?
Globale Variablen und Config habe ich benutzt, weil es in dem Ursprung-Code so war. Habe es nur nicht verändert.
Warum benutzt Du mal Stringformatierung und dann stückelst Du in der gleichen Zeile Strings per + zusammen?
Ja das ist weil ich ein Anfänger bin 😂
hashlib wird importiert aber nirgends verwendet.
Da will ich noch was mit machen...