1. Kami membuat bot telegram
Pertama, Anda perlu menulis bot yang akan melakukan ping ke ip yang diinginkan dan mengirim pesan ketika layanan yang diinginkan menghilang dari jaringan, dan kemudian muncul

Saya mengerti bahwa untuk sumber habr, artikelnya cukup sederhana, dan selain itu, saya tidak mencoba untuk melukis setiap baris kode, karena semua kode cukup sederhana untuk dipahami oleh pemula. Saya memutuskan untuk membagikan betapa mudahnya membuat bot Anda di buruh pelabuhan, yang akan melakukan pekerjaan yang bermanfaat.
1.1 Cara menyimpan konfigurasi
Saya memutuskan untuk menyimpan konfigurasi sebagai file yaml.
botid: userid: id_, hosts: - "8.8.8.8:Google DNS Server" - "yandex.ru:Yandex domain name"
Agar, botid adalah token yang @botfather masalah saat membuat bot baru.
userid adalah id dari pengguna telegram yang akan menerima pesan dari bot dalam obrolan. Dapat diperoleh menggunakan @userinfobot
host adalah layanan yang akan di-ping oleh bot. Anda dapat menentukan alamat ip dan nama domain. Komentar pada alamat ditunjukkan melalui titik dua, komentar ini akan diganti dalam pesan, bukan alamat.
1.2 Script itu sendiri
Pertama, buat kelas untuk host.
class address: def __init__ (self, address, comment): self.address = address self.comment = comment self.status = True
alamat adalah ip atau nama domain.
komentar - komentar dari file yaml.
status - host di jaringan atau tidak. Defaultnya adalah online.
Skrip
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()
Menyatukan gambar buruh pelabuhan
Cara menginstal docker dan docker-compose yang saya tulis di artikel
ini .
Perlu membuat buruh pelabuhan. Di sebelah folder kode, masukkan kode sumber bot.
FROM python:buster RUN pip3 install python-telegram-bot pythonping pyyaml WORKDIR /usr/src/app COPY ./code/. . ENTRYPOINT ["python"] CMD ["main.py"]
Kami menghubungkan gambar buruh pelabuhan dari repositori python resmi. Instal pustaka. Setel folder saat ini ke / usr / src / app. Salin kode ke folder ini. Utilitas yang dipanggil saat startup adalah python. CMD meneruskan parameter untuk dijalankan - main.py.
Selanjutnya, Anda perlu mengumpulkan gambar dan memasukkannya ke dalam repositori
docker build -t alsoeast/pingbot:1.0 . docker push alsoeast/pingbot:1.0
Untuk menjalankan gambar buruh pelabuhan, saya menggunakan buruh pelabuhan.
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
Gambar diambil dari repositori, file config.yaml di-mount sehingga skrip dapat menerima argumen. Tetap hanya berjalan
docker-compose up -d
Jika ada yang membutuhkannya, bot tersedia di hub buruh pelabuhan.
UPD: versi baru 1.1 atau gambar terbaru diunggah ke hub docker. Dalam file konfigurasi, parameter botid berubah menjadi botkey, parameter interval opsional ditambahkan