Created
August 29, 2018 07:53
-
-
Save marcoshipe/f2a11bb36a9ec13523f0a8a3f3b8915a to your computer and use it in GitHub Desktop.
Pruebas sobre bots de telegram en python y su interaccion con grupos. Libreria utilizada: https://github.com/python-telegram-bot/python-telegram-bot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import getpass | |
| import logging | |
| from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, BaseFilter | |
| # Clase que se utiliza para filtar los mensajes y que solo sean validos los que implican | |
| # que un usuario nuevo entro en el grupo (puede ser un usuario comun o un bot) | |
| class FilterNewMembers(BaseFilter): | |
| def filter(self, message): | |
| return bool(message.new_chat_members) | |
| class TelegramBot: | |
| def __init__(self, token, white_list_user_ids=None, white_list_groups_ids=None): | |
| # Inicializo listas blancas para no contestar mensajes a todos o en todos los grupos | |
| if white_list_user_ids is None: | |
| self.white_list_user_ids = [] | |
| else: | |
| self.white_list_user_ids = white_list_user_ids | |
| if white_list_groups_ids is None: | |
| self.white_list_groups_ids = [] | |
| else: | |
| self.white_list_groups_ids = white_list_groups_ids | |
| self.logger = logging.getLogger('TelegramBot') | |
| self.logger.setLevel('DEBUG') | |
| console_handler = logging.StreamHandler() | |
| self.logger.addHandler(console_handler) | |
| self.updater = Updater(token=token) | |
| dispatcher = self.updater.dispatcher | |
| # Inicializacion de los handlers | |
| # Cuando entra un mensaje, lo agarra SOLO el PRIMER handler en el que el filtro | |
| # devuelve True | |
| # El CommandHandler responde a mensajes del tipo /<comando> <arg1> <arg2> ... | |
| # Los argumentos estan separados por espacios y no encontre forma de | |
| # que un argumento contenga espacios (poniendo comillas o escapando el espacio por ejemplo) | |
| echo_handler = CommandHandler('echo', self._echo_handler, pass_args=True) | |
| dispatcher.add_handler(echo_handler) | |
| # El filtro que definimos, es necesario instanciarlo, no puede pasarsele la clase | |
| # directamente | |
| filter_new_members = FilterNewMembers() | |
| group_welcome_handler = MessageHandler(filter_new_members, self._group_welcome_handler) | |
| dispatcher.add_handler(group_welcome_handler) | |
| get_sticker_id_handler = MessageHandler(Filters.sticker, self._get_sticker_id_handler) | |
| dispatcher.add_handler(get_sticker_id_handler) | |
| group_handler = MessageHandler(Filters.group, self._group_handler) | |
| dispatcher.add_handler(group_handler) | |
| general_handler = MessageHandler(Filters.all, self._general_handler) | |
| dispatcher.add_handler(general_handler) | |
| self.updater.start_polling() | |
| def delete_and_cleenup(self): | |
| self.updater.stop() | |
| # Responde a mensajes del tipo /echo <palabra> con un mensaje que es <palabra> | |
| # Funciona tanto para un usuario particular como en un grupo y no es necesario desactivar | |
| # el privacy mode | |
| def _echo_handler(self, bot, update, args): | |
| chat_id = str(update.message.chat_id) | |
| # Solo hacemos echo a un mensaje mandado desde un usuario conocido o a un grupo conocido | |
| # Si lo manda un conocido a un grupo desconocido, no se responde tampoco (porque se | |
| # utiliza el chat_id y no el from_id | |
| if chat_id not in (self.white_list_user_ids + self.white_list_groups_ids): | |
| return | |
| # Controlo la cantidad de argumentos (esto en realidad no tiene sentido en un echo, | |
| # pero si en otro tipo de comandos) | |
| # No tiene sentido, pero limita el echo a una sola palabra, sino manda mensaje de error | |
| if len(args) != 1: | |
| bot.send_message(chat_id=chat_id, text="numero incorrecto de parametros. " | |
| "echo solo admite 1") | |
| return | |
| bot.send_message(chat_id=chat_id, text=args[0]) | |
| # Da la bienvenida a los usuarios que se suman a un grupo | |
| # No es necesario desactivar el privacy mode | |
| def _group_welcome_handler(self, bot, update): | |
| chat_id = str(update.message.chat_id) | |
| # Solo hacemos echo a un mensaje mandado desde un usuario conocido o a un grupo conocido | |
| if chat_id not in (self.white_list_user_ids + self.white_list_groups_ids): | |
| return | |
| # Habria que hacer mas pruebas sobre como funciona este parametro, porque es una lista | |
| # supongo que se debe a que un administrador puede invitar simultaneamente a mas de un | |
| # usuario. Asi que escribimos un mensaje por cada uno | |
| for new_member in update.message.new_chat_members: | |
| bot.send_message(chat_id, text='Todos denle la bienvenida a ' + new_member.username) | |
| # Metodo que sirve para saber los ids de los stickers y para despues poder mandarlo | |
| # Ademas de enviar el codigo al usuario, tambien mando el sticker asi se ve como se hace | |
| def _get_sticker_id_handler(self, bot, update): | |
| chat_id = str(update.message.chat_id) | |
| # Solo hacemos echo a un mensaje mandado desde un usuario conocido o a un grupo conocido | |
| if chat_id not in (self.white_list_user_ids + self.white_list_groups_ids): | |
| return | |
| sticker_file_id = update.message.sticker.file_id | |
| bot.send_message(chat_id=chat_id, text=sticker_file_id) | |
| bot.send_sticker(chat_id=chat_id, sticker=sticker_file_id) | |
| # Metodo de debugging | |
| # Tener en cuenta que solo entra si no entro en los handlers anteriores | |
| # Y no se aplica a mensajes mandados al grupo si el privacy mode esta activado | |
| # Pero si se aplica a mensajes por ejemplo de un usuario que deja a un grupo | |
| def _group_handler(self, bot, update): | |
| self.logger.debug('GROUP HANDLER') | |
| self.logger.debug(update) | |
| self.logger.debug(bot) | |
| # Metodo de debugging | |
| # Tener en cuenta que solo entra si no entro en los handlers anteriores | |
| def _general_handler(self, bot, update): | |
| self.logger.debug('GENERAL HANDLER') | |
| self.logger.debug(update) | |
| self.logger.debug(bot) | |
| if __name__ == '__main__': | |
| print('Ingrese el token del bot de telegram:') | |
| token = getpass.getpass() | |
| white_list_user_ids = input('Ingrese los ids de los usuarios que van a estar en la whitelist ' | |
| 'separados por espacios:') | |
| white_list_group_ids = input('Ingrese los ids de los grupos que van a estar en la whitelist ' | |
| 'separados por espacios:') | |
| telegram_bot = TelegramBot(token, white_list_user_ids.split(), white_list_group_ids.split()) | |
| print('Bot en ejecucion') | |
| print('Presione ENTER para desconectar el bot y terminar el programa') | |
| input() | |
| telegram_bot.delete_and_cleenup() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment