mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-10-25 05:01:13 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			101 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| """
 | |
| A example script to automatically send messages based on certain triggers.
 | |
| 
 | |
| This script assumes that you have certain files on the working directory,
 | |
| such as "xfiles.m4a" or "anytime.png" for some of the automated replies.
 | |
| """
 | |
| import os
 | |
| import sys
 | |
| import time
 | |
| from collections import defaultdict
 | |
| 
 | |
| from telethon import TelegramClient, events
 | |
| 
 | |
| import logging
 | |
| logging.basicConfig(level=logging.WARNING)
 | |
| 
 | |
| # "When did we last react?" dictionary, 0.0 by default
 | |
| recent_reacts = defaultdict(float)
 | |
| 
 | |
| 
 | |
| def get_env(name, message, cast=str):
 | |
|     if name in os.environ:
 | |
|         return os.environ[name]
 | |
|     while True:
 | |
|         value = input(message)
 | |
|         try:
 | |
|             return cast(value)
 | |
|         except ValueError as e:
 | |
|             print(e, file=sys.stderr)
 | |
|             time.sleep(1)
 | |
| 
 | |
| 
 | |
| def can_react(chat_id):
 | |
|     # Get the time when we last sent a reaction (or 0)
 | |
|     last = recent_reacts[chat_id]
 | |
| 
 | |
|     # Get the current time
 | |
|     now = time.time()
 | |
| 
 | |
|     # If 10 minutes as seconds have passed, we can react
 | |
|     if now - last < 10 * 60:
 | |
|         # Make sure we updated the last reaction time
 | |
|         recent_reacts[chat_id] = now
 | |
|         return True
 | |
|     else:
 | |
|         return False
 | |
| 
 | |
| 
 | |
| # Register `events.NewMessage` before defining the client.
 | |
| # Once you have a client, `add_event_handler` will use this event.
 | |
| @events.register(events.NewMessage)
 | |
| async def handler(event):
 | |
|     # There are better ways to do this, but this is simple.
 | |
|     # If the message is not outgoing (i.e. someone else sent it)
 | |
|     if not event.out:
 | |
|         if 'emacs' in event.raw_text:
 | |
|             if can_react(event.chat_id):
 | |
|                 await event.reply('> emacs\nneeds more vim')
 | |
| 
 | |
|         elif 'vim' in event.raw_text:
 | |
|             if can_react(event.chat_id):
 | |
|                 await event.reply('> vim\nneeds more emacs')
 | |
| 
 | |
|         elif 'chrome' in event.raw_text:
 | |
|             if can_react(event.chat_id):
 | |
|                 await event.reply('> chrome\nneeds more firefox')
 | |
| 
 | |
|     # Reply always responds as a reply. We can respond without replying too
 | |
|     if 'shrug' in event.raw_text:
 | |
|         if can_react(event.chat_id):
 | |
|             await event.respond(r'¯\_(ツ)_/¯')
 | |
| 
 | |
|     # We can also use client methods from here
 | |
|     client = event.client
 | |
| 
 | |
|     # If we sent the message, we are replying to someone,
 | |
|     # and we said "save pic" in the message
 | |
|     if event.out and event.is_reply and 'save pic' in event.raw_text:
 | |
|         reply_msg = await event.get_reply_message()
 | |
|         replied_to_user = await reply_msg.get_input_sender()
 | |
| 
 | |
|         message = await event.reply('Downloading your profile photo...')
 | |
|         file = await client.download_profile_photo(replied_to_user)
 | |
|         await message.edit('I saved your photo in {}'.format(file))
 | |
| 
 | |
| 
 | |
| client = TelegramClient(
 | |
|     os.environ.get('TG_SESSION', 'replier'),
 | |
|     get_env('TG_API_ID', 'Enter your API ID: ', int),
 | |
|     get_env('TG_API_HASH', 'Enter your API hash: '),
 | |
|     proxy=None
 | |
| )
 | |
| 
 | |
| with client:
 | |
|     # This remembers the events.NewMessage we registered before
 | |
|     client.add_event_handler(handler)
 | |
| 
 | |
|     print('(Press Ctrl+C to stop this)')
 | |
|     client.run_until_disconnected()
 |