diff --git a/telethon_examples/print_updates.py b/telethon_examples/print_updates.py index ab7ba1d4..4c676a81 100755 --- a/telethon_examples/print_updates.py +++ b/telethon_examples/print_updates.py @@ -1,46 +1,36 @@ #!/usr/bin/env python3 # A simple script to print all updates received -from getpass import getpass from os import environ + # environ is used to get API information from environment variables # You could also use a config file, pass them as arguments, # or even hardcode them (not recommended) from telethon import TelegramClient -from telethon.errors import SessionPasswordNeededError + def main(): session_name = environ.get('TG_SESSION', 'session') - user_phone = environ['TG_PHONE'] client = TelegramClient(session_name, int(environ['TG_API_ID']), environ['TG_API_HASH'], proxy=None, - update_workers=4) + update_workers=4, + spawn_read_thread=False) - print('INFO: Connecting to Telegram Servers...', end='', flush=True) - client.connect() - print('Done!') - - if not client.is_user_authorized(): - print('INFO: Unauthorized user') - client.send_code_request(user_phone) - code_ok = False - while not code_ok: - code = input('Enter the auth code: ') - try: - code_ok = client.sign_in(user_phone, code) - except SessionPasswordNeededError: - password = getpass('Two step verification enabled. Please enter your password: ') - code_ok = client.sign_in(password=password) - print('INFO: Client initialized succesfully!') + if 'TG_PHONE' in environ: + client.start(phone=environ['TG_PHONE']) + else: + client.start() client.add_update_handler(update_handler) - input('Press Enter to stop this!\n') + print('(Press Ctrl+C to stop this)') + client.idle() + def update_handler(update): print(update) - print('Press Enter to stop this!') + if __name__ == '__main__': main() diff --git a/telethon_examples/replier.py b/telethon_examples/replier.py index 66026363..ed4cc2fa 100755 --- a/telethon_examples/replier.py +++ b/telethon_examples/replier.py @@ -9,17 +9,12 @@ file, including TG_API_ID, TG_API_HASH, TG_PHONE and optionally TG_SESSION. 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. """ -from getpass import getpass +import re from collections import defaultdict from datetime import datetime, timedelta from os import environ -import re - -from telethon import TelegramClient -from telethon.errors import SessionPasswordNeededError -from telethon.tl.types import UpdateNewChannelMessage, UpdateShortMessage, MessageService -from telethon.tl.functions.messages import EditMessageRequest +from telethon import TelegramClient, events, utils """Uncomment this for debugging import logging @@ -35,103 +30,57 @@ REACTS = {'emacs': 'Needs more vim', recent_reacts = defaultdict(list) -def update_handler(update): - global recent_reacts - try: - msg = update.message - except AttributeError: - # print(update, 'did not have update.message') - return - if isinstance(msg, MessageService): - print(msg, 'was service msg') - return +if __name__ == '__main__': + # TG_API_ID and TG_API_HASH *must* exist or this won't run! + session_name = environ.get('TG_SESSION', 'session') + client = TelegramClient( + session_name, int(environ['TG_API_ID']), environ['TG_API_HASH'], + spawn_read_thread=False, proxy=None, update_workers=4 + ) - # React to messages in supergroups and PMs - if isinstance(update, UpdateNewChannelMessage): - words = re.split('\W+', msg.message) + @client.on(events.NewMessage) + def my_handler(event: events.NewMessage.Event): + global recent_reacts + + # This utils function gets the unique identifier from peers (to_id) + to_id = utils.get_peer_id(event.message.to_id) + + # Through event.raw_text we access the text of messages without format + words = re.split('\W+', event.raw_text) + + # Try to match some reaction for trigger, response in REACTS.items(): - if len(recent_reacts[msg.to_id.channel_id]) > 3: + if len(recent_reacts[to_id]) > 3: # Silently ignore triggers if we've recently sent 3 reactions break if trigger in words: # Remove recent replies older than 10 minutes - recent_reacts[msg.to_id.channel_id] = [ - a for a in recent_reacts[msg.to_id.channel_id] if + recent_reacts[to_id] = [ + a for a in recent_reacts[to_id] if datetime.now() - a < timedelta(minutes=10) ] - # Send a reaction - client.send_message(msg.to_id, response, reply_to=msg.id) + # Send a reaction as a reply (otherwise, event.respond()) + event.reply(response) # Add this reaction to the list of recent actions - recent_reacts[msg.to_id.channel_id].append(datetime.now()) + recent_reacts[to_id].append(datetime.now()) - if isinstance(update, UpdateShortMessage): - words = re.split('\W+', msg) - for trigger, response in REACTS.items(): - if len(recent_reacts[update.user_id]) > 3: - # Silently ignore triggers if we've recently sent 3 reactions - break + # Automatically send relevant media when we say certain things + # When invoking requests, get_input_entity needs to be called manually + if event.out: + if event.raw_text.lower() == 'x files theme': + client.send_voice_note(event.message.to_id, 'xfiles.m4a', + reply_to=event.message.id) + if event.raw_text.lower() == 'anytime': + client.send_file(event.message.to_id, 'anytime.png', + reply_to=event.message.id) + if '.shrug' in event.text: + event.edit(event.text.replace('.shrug', r'¯\_(ツ)_/¯')) - if trigger in words: - # Send a reaction - client.send_message(update.user_id, response, reply_to=update.id) - # Add this reaction to the list of recent reactions - recent_reacts[update.user_id].append(datetime.now()) + if 'TG_PHONE' in environ: + client.start(phone=environ['TG_PHONE']) + else: + client.start() - # Automatically send relevant media when we say certain things - # When invoking requests, get_input_entity needs to be called manually - if isinstance(update, UpdateNewChannelMessage) and msg.out: - if msg.message.lower() == 'x files theme': - client.send_voice_note(msg.to_id, 'xfiles.m4a', reply_to=msg.id) - if msg.message.lower() == 'anytime': - client.send_file(msg.to_id, 'anytime.png', reply_to=msg.id) - if '.shrug' in msg.message: - client(EditMessageRequest( - client.get_input_entity(msg.to_id), msg.id, - message=msg.message.replace('.shrug', r'¯\_(ツ)_/¯') - )) - - if isinstance(update, UpdateShortMessage) and update.out: - if msg.lower() == 'x files theme': - client.send_voice_note(update.user_id, 'xfiles.m4a', reply_to=update.id) - if msg.lower() == 'anytime': - client.send_file(update.user_id, 'anytime.png', reply_to=update.id) - if '.shrug' in msg: - client(EditMessageRequest( - client.get_input_entity(update.user_id), update.id, - message=msg.replace('.shrug', r'¯\_(ツ)_/¯') - )) - - -if __name__ == '__main__': - session_name = environ.get('TG_SESSION', 'session') - user_phone = environ['TG_PHONE'] - client = TelegramClient( - session_name, int(environ['TG_API_ID']), environ['TG_API_HASH'], - proxy=None, update_workers=4 - ) - try: - print('INFO: Connecting to Telegram Servers...', end='', flush=True) - client.connect() - print('Done!') - - if not client.is_user_authorized(): - print('INFO: Unauthorized user') - client.send_code_request(user_phone) - code_ok = False - while not code_ok: - code = input('Enter the auth code: ') - try: - code_ok = client.sign_in(user_phone, code) - except SessionPasswordNeededError: - password = getpass('Two step verification enabled. ' - 'Please enter your password: ') - code_ok = client.sign_in(password=password) - print('INFO: Client initialized successfully!') - - client.add_update_handler(update_handler) - input('Press Enter to stop this!\n') - except KeyboardInterrupt: - pass - finally: - client.disconnect() + print('(Press Ctrl+C to stop this)') + client.idle()