BotsTelegram_Python/01-blasterbot/blasterbot.py

137 lines
4.8 KiB
Python
Executable File

""" 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()