1. Hacemos un bot de telegramas
Primero debe escribir un bot que haga ping a la IP necesaria y envíe un mensaje cuando el servicio deseado desaparezca de la red, y luego aparezca

Entiendo que para el recurso habr, el artículo es bastante simple, y además, no traté de pintar cada línea de código, porque todo el código es lo suficientemente simple para que los principiantes lo entiendan. Decidí compartir lo fácil que es hacer tu bot en la ventana acoplable, lo que hará un trabajo útil.
1.1 Cómo almacenar una configuración
Decidí almacenar la configuración como un archivo yaml.
botid: userid: id_, hosts: - "8.8.8.8:Google DNS Server" - "yandex.ru:Yandex domain name"
En orden, botid es el token que emite @botfather al crear un nuevo bot.
userid es la identificación del usuario de telegrama que recibirá mensajes del bot en el chat. Se puede obtener usando @userinfobot
Los hosts son aquellos servicios que el bot hará ping. Puede especificar una dirección IP y un nombre de dominio. El comentario sobre la dirección se indica con dos puntos, este comentario se sustituirá en el mensaje en lugar de la dirección.
1.2 El guión en sí
Primero, cree una clase para el host.
class address: def __init__ (self, address, comment): self.address = address self.comment = comment self.status = True
dirección es una ip o nombre de dominio.
comentario: comentario del archivo yaml.
estado: host en la red o no. El valor predeterminado es en línea.
Guión
from telegram import Bot from pythonping import ping import time import yaml from libs.host import address def init(): """ , userid set_hosts """ global bot, userid with open('/usr/src/app/config.yaml') as f: try: docs = yaml.load_all(f, Loader=yaml.FullLoader) for doc in docs: for k, v in doc.items(): if k == "botid": bot = Bot(v) elif k == "userid": userid = v elif k == "hosts": set_hosts(v) except yaml.YAMLError as exc: print(exc) def set_hosts(hosts): """ """ global hosts_list hosts_list = [] for item in hosts: ac = item.split(":") hosts_list.append(address(ac[0], ac[1])) def send_message(message): """ """ bot.send_message(userid, message, parse_mode='HTML', disable_web_page_preview=True) def ping_host(address): """ . . , . , . """ if ping_url(address.address): if not address.status: address.status = True send_message(address.comment + " is up again") else: if (address.status): address.status = False send_message(address.comment + " is down") def ping_url(url): """ . Response list - ping. . , . """ i = 0; try: response_list = ping(url) for response in response_list: if (not response.success): i += 1 if (i == 4): return False else: return True except Exception as e: send_message(str(e)) def main(): """ . , . """ init() while True: for host in hosts_list: ping_host(host) time.sleep(30) if __name__ == '__main__': main()
Poniendo la imagen del acoplador juntos
Cómo instalar docker y docker-compose escribí en
este artículo.
Necesito crear un dockerfile. Al lado de la carpeta de código, coloque el código fuente del bot.
FROM python:buster RUN pip3 install python-telegram-bot pythonping pyyaml WORKDIR /usr/src/app COPY ./code/. . ENTRYPOINT ["python"] CMD ["main.py"]
Conectamos la imagen del acoplador desde el repositorio oficial de Python. Instala las bibliotecas. Establezca la carpeta actual en / usr / src / app. Copie el código a esta carpeta. La utilidad llamada al inicio será python. CMD pasa el parámetro a ejecutar - main.py.
A continuación, debe recopilar la imagen y ponerla en el repositorio.
docker build -t alsoeast/pingbot:1.0 . docker push alsoeast/pingbot:1.0
Para ejecutar imágenes de docker, uso docker-compose.
version: '3' networks: default: external: name: network services: pingbot: container_name: pingbot image: alsoeast/pingbot:1.0 restart: always volumes: - ./config.yaml:/usr/src/app/config.yaml
La imagen se toma del repositorio, el archivo config.yaml se monta para que el script pueda recibir los argumentos. Solo queda correr
docker-compose up -d
Si alguien lo necesita, el bot está disponible en el Docker Hub.
UPD: una nueva versión de 1.1 o la última imagen se carga en Docker Hub. En el archivo de configuración, el parámetro botid cambió a botkey, se agregó el parámetro de intervalo opcional