Propre bot Telegram pour suivre la disponibilité de ses serveurs en python et docker

1. Nous faisons un bot télégramme


Vous devez d'abord écrire un bot qui exécutera une requête ping sur l'IP souhaitée et enverra un message lorsque le service souhaité disparaît du réseau, puis apparaît



Je comprends que pour la ressource habr, l'article est assez simple, et d'ailleurs, je n'ai pas essayé de peindre chaque ligne de code, car tout le code est assez simple pour que les débutants puissent le comprendre. J'ai décidé de partager à quel point il est facile de faire votre bot dans le docker, qui fera un travail utile.

1.1 Comment stocker une config


J'ai décidé de stocker la config dans un fichier yaml.

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

Dans l'ordre, botid est le jeton émis par @botfather lors de la création d'un nouveau bot.

userid est l'identifiant de l'utilisateur du télégramme qui recevra les messages du bot dans le chat. Peut être obtenu en utilisant @userinfobot

les hôtes sont les services auxquels le bot va envoyer un ping. Vous pouvez spécifier à la fois une adresse IP et un nom de domaine. Le commentaire sur l'adresse est indiqué par deux points, ce commentaire sera substitué dans le message à la place de l'adresse.

1.2 Le script lui-même


Créez d'abord une classe pour l'hôte.

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

l'adresse est un ip ou un nom de domaine.
comment - commentaire du fichier yaml.
état - hôte sur le réseau ou non. La valeur par défaut est en ligne.

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

Assembler l'image du docker


Comment installer docker et docker-compose que j'ai écrit dans cet article.

Besoin de créer un dockerfile. À côté du dossier de code, mettez le code source du bot.

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

Nous connectons l'image docker à partir du référentiel officiel python. Installez les bibliothèques. Définissez le dossier actuel sur / usr / src / app. Copiez le code dans ce dossier. L'utilitaire appelé au démarrage sera python. CMD transmet le paramètre à run - main.py.

Ensuite, vous devez collecter l'image et la mettre dans le référentiel

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

Pour exécuter des images de docker, j'utilise 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 

L'image est extraite du référentiel, le fichier config.yaml est monté afin que le script puisse recevoir les arguments. Il ne reste plus qu'à courir

 docker-compose up -d 

Si quelqu'un en a besoin, le bot est disponible sur le hub docker.

UPD: une nouvelle version de 1.1 ou la dernière image est téléchargée sur le docker hub. Dans le fichier de configuration, le paramètre botid est devenu botkey, le paramètre d'intervalle facultatif a été ajouté

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


All Articles