Eigener Telegramm-Bot zur Verfolgung der Verfügbarkeit seiner Server in Python und Docker

1. Wir machen einen Telegrammbot


Zuerst müssen Sie einen Bot schreiben, der die gewünschte IP anpingt und eine Nachricht sendet, wenn der gewünschte Dienst aus dem Netzwerk verschwindet und dann angezeigt wird



Ich verstehe, dass der Artikel für die Habr-Ressource recht einfach ist, und außerdem habe ich nicht versucht, jede Codezeile zu malen, da der gesamte Code für Anfänger einfach genug ist, um ihn zu verstehen. Ich habe beschlossen zu teilen, wie einfach es ist, Ihren Bot im Docker zu erstellen, was nützliche Arbeit leisten wird.

1.1 Speichern einer Konfiguration


Ich habe beschlossen, die Konfiguration als Yaml-Datei zu speichern.

botid:  userid: id_,    hosts: - "8.8.8.8:Google DNS Server" - "yandex.ru:Yandex domain name" 

In der Reihenfolge ist botid das Token, das @botfather beim Erstellen eines neuen Bots ausgibt.

Benutzer-ID ist die ID des Telegrammbenutzers, der im Chat Nachrichten vom Bot erhält. Kann mit @userinfobot erhalten werden

Hosts sind die Dienste, die der Bot anpingen wird. Sie können sowohl eine IP-Adresse als auch einen Domainnamen angeben. Der Kommentar zur Adresse wird durch einen Doppelpunkt angezeigt. Dieser Kommentar wird in der Nachricht anstelle der Adresse ersetzt.

1.2 Das Skript selbst


Erstellen Sie zunächst eine Klasse für den Host.

 class address: def __init__ (self, address, comment): self.address = address self.comment = comment self.status = True 

Adresse ist eine IP oder ein Domainname.
Kommentar - Kommentar aus der Yaml-Datei.
Status - Host im Netzwerk oder nicht. Der Standardwert ist online.

Skript

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

Das Docker-Image zusammenfügen


Wie installiere ich Docker und Docker-Compose? Ich habe in diesem Artikel geschrieben.

Müssen Sie eine Docker-Datei erstellen. Fügen Sie neben dem Codeordner den Quellcode des Bots ein.

 FROM python:buster RUN pip3 install python-telegram-bot pythonping pyyaml WORKDIR /usr/src/app COPY ./code/. . ENTRYPOINT ["python"] CMD ["main.py"] 

Wir verbinden das Docker-Image aus dem offiziellen Python-Repository. Installieren Sie die Bibliotheken. Stellen Sie den aktuellen Ordner auf / usr / src / app ein. Kopieren Sie den Code in diesen Ordner. Das beim Start aufgerufene Dienstprogramm ist Python. CMD übergibt den Parameter an run - main.py.

Als nächstes müssen Sie das Bild sammeln und in das Repository stellen

 docker build -t alsoeast/pingbot:1.0 . docker push alsoeast/pingbot:1.0 

Um Docker-Images auszuführen, verwende ich 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 

Das Image wird aus dem Repository entnommen, die Datei config.yaml wird gemountet, damit das Skript die Argumente empfangen kann. Es bleibt nur zu laufen

 docker-compose up -d 

Wenn jemand es braucht, ist der Bot auf dem Docker-Hub verfügbar.

UPD: Eine neue Version von 1.1 oder das neueste Image wird auf den Docker Hub hochgeladen. In der Konfigurationsdatei wurde der Parameter botid in botkey geändert, der optionale Intervallparameter wurde hinzugefügt

Source: https://habr.com/ru/post/de474434/


All Articles