简体   繁体   中英

Watchdog and sending messages with Telethon

I would like to observe file system changes with watchdog and additionally send a message via telethon with the following code:

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from telethon import TelegramClient, sync, events

api_id = 0000000
api_hash = '*'

client = TelegramClient('Name', api_id, api_hash)
client.start()

class OnMyWatch:
    # Set the directory on watch
    watchDirectory = "/Users/UserID/Desktop/"

    def __init__(self):
        self.observer = Observer()

    def run(self):
        event_handler = Handler()
        self.observer.schedule(event_handler, self.watchDirectory, recursive=True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print("Observer Stopped")

        self.observer.join()


class Handler(FileSystemEventHandler):
    @staticmethod
    def on_any_event(event):
        if event.event_type == 'created':
            # Sending a message to myself 
            client.send_message('me', 'A file was created!'),


if __name__ == '__main__':
    watch = OnMyWatch()
    watch.run()

Unfortunately it throws the following error:

File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/telethon/sync.py", line 35, 
in syncified
loop = asyncio.get_event_loop()

File "/Library/Frameworks/Python.framework/Versions/3.9/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'.*

I was trying to understand how to make use of Asyncio with Telethon but couldn't fix it so I'm seeking to get some valuable hints here.

I have met the same problem and from Asyncio with Telethon I saw

It just means you didn't create a loop for that thread

So I have added two lines before client construction.

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
client = TelegramClient('Name', api_id, api_hash)

And it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM