1. Nós fazemos um bot de telegrama
Primeiro, você precisa escrever um bot que faça ping no ip necessário e envie uma mensagem quando o serviço desejado desaparecer da rede e depois aparecer

Entendo que, para o recurso habr, o artigo é bastante simples e, além disso, não tentei pintar todas as linhas de código, porque todo o código é simples o suficiente para os iniciantes entenderem. Decidi compartilhar como é fácil tornar seu bot na janela de encaixe, o que fará um trabalho útil.
1.1 Como armazenar uma configuração
Decidi armazenar a configuração como um arquivo yaml.
botid: userid: id_, hosts: - "8.8.8.8:Google DNS Server" - "yandex.ru:Yandex domain name"
Em ordem, botid é o token que o @botfather emite ao criar um novo bot.
userid é o ID do usuário de telegrama que receberá mensagens do bot no chat. Pode ser obtido usando @userinfobot
hosts são os serviços que o bot fará ping. Você pode especificar um endereço IP e um nome de domínio. O comentário no endereço é indicado por dois pontos; esse comentário será substituído na mensagem em vez do endereço.
1.2 O próprio script
Primeiro, crie uma classe para o host.
class address: def __init__ (self, address, comment): self.address = address self.comment = comment self.status = True
endereço é um nome de domínio ou ip.
comment - comentário do arquivo yaml.
status - host na rede ou não. O padrão é online.
Script
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()
Reunindo a imagem da janela de encaixe
Como instalar o docker e o docker-compondo que escrevi
neste artigo.
Precisa criar um arquivo docker. Ao lado da pasta de código, coloque o código fonte do bot.
FROM python:buster RUN pip3 install python-telegram-bot pythonping pyyaml WORKDIR /usr/src/app COPY ./code/. . ENTRYPOINT ["python"] CMD ["main.py"]
Conectamos a imagem do docker do repositório oficial do python. Instale as bibliotecas. Defina a pasta atual como / usr / src / app. Copie o código para esta pasta. O utilitário chamado na inicialização será python. O CMD passa o parâmetro para executar - main.py.
Em seguida, você precisa coletar a imagem e colocá-la no repositório
docker build -t alsoeast/pingbot:1.0 . docker push alsoeast/pingbot:1.0
Para executar imagens do docker, eu uso o 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
A imagem é obtida do repositório, o arquivo config.yaml é montado para que o script possa receber os argumentos. Resta apenas correr
docker-compose up -d
Se alguém precisar, o bot estará disponível no hub do docker.
UPD: uma nova versão da imagem 1.1 ou mais recente é carregada no docker hub. No arquivo de configuração, o parâmetro botid foi alterado para botkey, o parâmetro de intervalo opcional foi adicionado