""" Implementación Bot Telegram API """ import configparser as cfg import logging #import os import fetchip import random import telegram.ext from telegram.ext import Updater, CommandHandler, MessageHandler, Filters # Credenciales desde archivo de configuración parser = cfg.ConfigParser() parser.read('./conf/config.cfg') token = parser.get('creds', 'token') user = parser.get('creds', 'user') # Creación objeto Updater updater = Updater(token=token, use_context=True) dispatcher = updater.dispatcher # Config. modulo de logging logging.basicConfig( filename='./conf/bot.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) # Funciónes 'callback' def start(update, context): """ Envía respuesta de texto (text=string) """ context.bot.send_message(chat_id=update.effective_chat.id, text="Hola hola pianola!!") def echo(update, context): """ Envía como respuesta el texto recibido """ context.bot.send_message(chat_id=update.effective_chat.id, text=update.message.text) def caps(update, context): """ Envia como respuesta el texto recibido, capitalizado """ text_caps = ' '.join(context.args).upper() context.bot.send_message(chat_id=update.effective_chat.id, text=text_caps) def huhuu(update, context): """ Envia respuesta de audio (archivo) """ context.bot.send_audio(chat_id=update.effective_chat.id, audio=open('./media/huhuu.wav', 'rb')) def desconocido(update, context): """ Envía respuesta de texto si no reconoce el comando recibido """ respuestas = [ 'No puedo ayudarte!', 'No entiendo lo que dices!', 'Mucho no bueno!', 'Un gran poder, conlleva una gran resposabilidad', 'QUITAN TRABAOhjOJOoOHHH!', 'For great justice', 'No siempre lloverá', 'mamá dice q la vida es como una caja de bombones ...', 'Mucho agradezco' ] resp_desc = random.choice(respuestas) context.bot.send_message(chat_id=update.effective_chat.id, text=resp_desc) def allyb(update, context): """ Envia img como respuesta """ context.bot.send_photo(chat_id=update.effective_chat.id, photo=open('./media/allyb.png', 'rb')) # Trabajo activado a petición def alarma(context: telegram.ext.CallbackContext): """ Envia txt como alarma """ context.bot.send_message(chat_id=context.job.context, text='BEEEEP!!') def timer_minuto(update: telegram.Update, context: telegram.ext.CallbackContext): """ Tarea corre un minuto despues de llamarla """ context.bot.send_message(chat_id=update.message.chat_id, text='TIMER Activado: ⏰️ 1 minuto') context.job_queue.run_once(alarma, 60, context=update.message.chat_id) # Creación de manejadores de funciones CallBack start_handler = CommandHandler('start', start) echo_handler = MessageHandler(Filters.text & (~Filters.command), echo) caps_handler = CommandHandler('caps', caps) huhuu_handler = CommandHandler('huhuu', huhuu) allyb_handler = CommandHandler('allyb', allyb) timer_handler = CommandHandler('timer', timer_minuto) descon_handler = MessageHandler(Filters.command, desconocido) # Agregar manejadores a dispatcher dispatcher.add_handler(start_handler) dispatcher.add_handler(echo_handler) dispatcher.add_handler(caps_handler) dispatcher.add_handler(huhuu_handler) dispatcher.add_handler(allyb_handler) dispatcher.add_handler(timer_handler) dispatcher.add_handler(descon_handler) # Cola de trabajos jobs = updater.job_queue # Trabajo cada minuto def cada_minuto(context: telegram.ext.CallbackContext): """ Ejemplo job cada 1 minuto """ context.bot.send_message(chat_id=user, text='test msg cada minuto') job_minuto = jobs.run_repeating(cada_minuto, interval=60, first=0) # Solo una vez, con desfase de 5 seg. def callback_5(context: telegram.ext.CallbackContext): """ Aviso inicio bot pasado 5 segundos """ context.bot.send_message(chat_id=user, text='BastardBot Iniciado') jobs.run_once(callback_5, 5) # Alerta cambio ip pública, cada 30 minutos def ip_alert(context: telegram.ext.CallbackContext): """ Alerta, registra e informa cambio de ip pública """ try: with open('./conf/last_ipp', 'r') as last_ipp_file: last_ipp = last_ipp_file.read() # No shell user # real_ipp = os.popen('curl -s ifconfig.me').readline() real_ipp = fetchip.get_public_ip() if real_ipp != last_ipp: context.bot.send_message(chat_id=user, text=real_ipp) with open('./conf/last_ipp', 'w') as archivo: archivo.write(real_ipp) except Exception as ex: report = 'Error IP-alert :' + ex context.bot.send_message(chat_id=user, text=report) job_ipp = jobs.run_repeating(ip_alert, interval=1800, first=0) # Deshabilitar tarea job_minuto.enabled = False # Remover tarea #job_minuto.schedule_removal() # Iniciar Bot updater.start_polling()