Skip to content

Instantly share code, notes, and snippets.

@marcoshipe
Created August 29, 2018 07:53
Show Gist options
  • Select an option

  • Save marcoshipe/f2a11bb36a9ec13523f0a8a3f3b8915a to your computer and use it in GitHub Desktop.

Select an option

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
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