Telegram 憑證監控機器人實作 EP5 — 代碼優化

閱讀時間約 16 分鐘
raw-image


👨‍💻 簡介

在這篇文章中,我們將對 Telegram 憑證監控機器人的代碼進行優化。我們會新增一些簡單的指令,並且將部分變數改為從 yaml 檔案中讀取,而不是直接寫死在程式碼中。這些改進目的是提高可讀性和可維護性。

🛠️ 使用工具

  • Python 3.9.6
  • MongoDB
  • TG Bot

📝 功能需求

  • 新增 TG 指令 show_cert_info
  • 新增 TG 指令 help
  • 調整參數讀取

🎯Setup

1. 新增 TG 指令 show_cert_info

這裡會用到之前寫的 get_ssl_cert 函數,可以印出證書來看一下有什麼資訊:

{'subject': ((('countryName', 'US'),), (('stateOrProvinceName', 'California'),), (('localityName', 'San Francisco'),), (('organizationName', 'Wikimedia Foundation, Inc.'),), (('commonName', '*.wikipedia.org'),)), 'issuer': ((('countryName', 'US'),), (('organizationName', 'DigiCert Inc'),), (('commonName', 'DigiCert TLS Hybrid ECC SHA384 2020 CA1'),)), 'version': 3, 'serialNumber': '07419E39583A4C76CF1EA14347FA5F3A', 'notBefore': 'Oct 18 00:00:00 2023 GMT', 'notAfter': 'Oct 16 23:59:59 2024 GMT', 'subjectAltName': (('DNS', '*.wikipedia.org'), ('DNS', 'wikimedia.org'), ('DNS', 'mediawiki.org'), ('DNS', 'wikibooks.org'), ('DNS', 'wikidata.org'), ('DNS', 'wikinews.org'), ('DNS', 'wikiquote.org'), ('DNS', 'wikisource.org'), ('DNS',
....

將上述 SSL 證書資訊整理成列表形式:

  • subject:證書的主題,包含證書擁有者的詳細資訊,如國家名稱、省份名稱、地區名稱、組織名稱和通用名稱。
  • issuer:簽發者的資訊,包含簽發該 SSL 證書的機構的詳細資訊。
  • version:證書的版本號,目前有三個版本:v1、v2 和 v3。SSL/TLS 交易通常使用版本 3。
  • serialNumber:證書的序列號,簽發者賦予的唯一標識符。
  • notBefore:證書的生效日期,表示該證書在此日期之前不可用。
  • notAfter:證書的到期日期,表示該證書在此日期之後不再有效。
  • subjectAltName:主體別名,包括證書可以使用的其他域名列表,使一個證書可以對多個域名有效。
  • OCSP:在線證書狀態協定(Online Certificate Status Protocol)的網址,用於實時檢查 SSL 證書的撤銷狀態。
  • caIssuers:指向簽發此證書的 CA 證書的 URL,客戶端可以從這個位置獲取簽發者的證書。
  • crlDistributionPoints:指向證書撤銷列表(Certificate Revocation List, CRL)的 URL,客戶端可以從這些位置檢查證書是否被撤銷。

這個列表整理了 SSL 證書中的關鍵資訊,幫助理解和快速查找每個部分的功能和用途。

可以依照自己的需求看需要什麼資訊,這裡我新增一個新的函數,來解析取得的證書訊息:

def parse_ssl_cert_info(domain, cert):
issuer = dict(x[0] for x in cert["issuer"])
subject = dict(x[0] for x in cert["subject"])
issued_to = subject.get("commonName", subject.get("organizationName", ""))
issued_by = issuer.get("commonName", issuer.get("organizationName", ""))
valid_from = datetime.strptime(cert["notBefore"], "%b %d %H:%M:%S %Y %Z").strftime(
"%Y-%m-%d"
)
valid_until = datetime.strptime(cert["notAfter"], "%b %d %H:%M:%S %Y %Z").strftime(
"%Y-%m-%d"
)

cert_info = (
f"Domain: {domain}\n"
f"Issued To: {issued_to}\n"
f"Issued By: {issued_by}\n"
f"Valid From: {valid_from}\n"
f"Valid Until: {valid_until}"
)
return cert_info

主要作法是將憑證的資訊從字典中提取自己所需要的欄位,然後做一些格式上的轉換。

接著就可以到 TG Bot 來新增這條指令:

@bot.message_handler(commands=["cert_info"])
def send_cert_info(message):
_, get_domain = message.text.split(maxsplit=1)
cert = get_ssl_cert_info(get_domain, check_only=False)
cert_info = parse_ssl_cert_info(get_domain, cert)
bot.send_message(message.chat.id, cert_info)

如果解析失敗或是沒有輸入域名,也需要告訴使用者錯誤訊息:

@bot.message_handler(commands=["cert_info"])
def send_cert_info(message):
try:
_, get_domain = message.text.split(maxsplit=1)
except ValueError:
# 處理使用者沒有提供域名的情況
bot.send_message(message.chat.id, "請提供一個域名。例如:/cert_info example.com")
return
cert = get_ssl_cert_info(get_domain, check_only=False)
if cert is None or cert is False:
# 如果無法獲取證書,直接回傳錯誤訊息
error_message = f"域名錯誤: 無法獲取 {get_domain} 的 SSL 證書資訊。"
bot.send_message(message.chat.id, error_message)
else:
cert_info = parse_ssl_cert_info(get_domain, cert)
bot.send_message(message.chat.id, cert_info)

最後到 TG 輸入指令來確認一下:

raw-image

確認輸出的資訊符合自己所需。

2. 新增 TG 指令 help

當指令比較多時,需要一個 help 指令來幫助我了解每個指令的用途,因此也可以新增一個簡單的 help 指令:

@bot.message_handler(commands=["help"])
def send_help_message(message):
help_text = """
以下是可用的命令列表及其用途:

/cert_info <domain> - 獲取指定域名的 SSL 證書資訊。
/get_all - 從 MongoDB 獲取所有域名環境的資訊。
/get <env> <domain> - 獲取指定環境下域名的資訊。
/edit <env> <old_domain> <new_domain> - 更新指定環境下域名的資訊。
/add <env> <domain> - 向 MongoDB 添加一個新的域名及其環境。
/del <env> <domain> - 從 MongoDB 刪除指定環境下的域名。
/bulk_add <env> <domain1> <domain2> ... - 向 MongoDB 批量添加多個域名及其環境。

請根據需要使用上述命令。
"""
bot.send_message(message.chat.id, help_text)

執行後的輸出會長這樣:

raw-image

這樣當指令多時就可以比較方便顯示指令。

3. 調整參數讀取

這裡有兩種做法,一個是儲存到 config.yaml,然後進行讀取,另一個作法是寫成環境變數放在 docker-compose.yaml,然後透過啟動容器時映射到容器裡。

3-1. 透過 yaml 傳入參數 第一種做法比較直覺,把一些 Mongo 以及 TG 的相關參數放到 config.yaml,接著透過 yaml Library 進行讀取:

mongodb_uri: "mongodb://rootuser:rootpass@localhost:27017/mydatabase?authSource=admin"
telegram_bot_token: "<YOUR-BOT-TOKEN>"
platform: "gcp"
telegram_group_id: "<YOUR-CHAT-ID>"
# config_loader.py
import yaml

def load_config():
with open("config.yaml", "r") as file:
return yaml.safe_load(file)

def get_mongodb_uri():
config = load_config()
return config.get("mongodb_uri", None)

def get_telegram_config():
config = load_config()
return {
"telegram_bot_token": config.get("telegram_bot_token", None),
"platform": config.get("platform", None),
"telegram_group_id": config.get("telegram_group_id", None)
}

3–2. 透過環境變數傳入參數 直接在 docker-compose.yaml 添加 env:

services
telegram_bot:
build: .
container_name: telegram_bot_container
depends_on:
- mongodb
environment:
TELEGRAM_BOT_TOKEN: <YOUR-BOT-TOKEN>
TELEGRAM_GROUP_ID: <YOUR-CHAT-ID>
MONGODB_URI: mongodb://rootuser:rootpass@mongodb:27017/mydatabase?authSource=admin
command: python main.py
restart: always

然後使用 os Library 進行調用:

import os

def get_mongodb_uri():
return os.getenv('MONGODB_URI', 'mongodb://localhost:27017/mydatabase')

def get_telegram_config():
return {
"telegram_bot_token": os.getenv('TELEGRAM_BOT_TOKEN', ''),
"platform": os.getenv('PLATFORM', 'local'),
"telegram_group_id": os.getenv('TELEGRAM_GROUP_ID', '')
}

最後就能到 main.py 進行調用:

from config_loader import get_telegram_config

telegram_config = get_telegram_config()
telegram_bot_token = telegram_config["telegram_bot_token"]
platform = telegram_config["platform"]
telegram_group_id = telegram_config["telegram_group_id"]

以上就是目前的優化,之後有想到會再回來補充。 下一篇會開始進行容器化的部分~

如果想看完整程式碼可以參考這裡 🔗 專案 repo –> ep5-optimize

17會員
79內容數
golang
留言0
查看全部
發表第一個留言支持創作者!
wang alan的沙龍 的其他內容
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
本文介紹如何使用 TG Bot 來操作 MongoDB,包括讀取所有 domain、讀取特定 domain、新增 domain、批量新增 domain、修改 domain 和刪除 domain。透過 TG Bot 的指令操作,實現了自動化管理和多環境管理。
👨‍💻 簡介 今天這篇主要是帶大家快速建立屬於自己的 Telegram bot,申請 bot 的部分我會附上網址,請準備好之後再來開始。 🛠️ 使用工具 Python 3.9.6 TG Bot 📝 功能需求 輸入指令讓 TG Bot 回傳訊息 接受傳入參數並進行簡單回傳 設定
學習如何使用Python連接MongoDB進行憑證監控,包括建立MongoDB docker-compose、連接MongoDB、讀取yaml並寫入MongoDB、傳入env以及domain寫入MongoDB、讀取MongoDB、修改MongoDB、刪除MongoDB。
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
本文介紹如何使用 TG Bot 來操作 MongoDB,包括讀取所有 domain、讀取特定 domain、新增 domain、批量新增 domain、修改 domain 和刪除 domain。透過 TG Bot 的指令操作,實現了自動化管理和多環境管理。
👨‍💻 簡介 今天這篇主要是帶大家快速建立屬於自己的 Telegram bot,申請 bot 的部分我會附上網址,請準備好之後再來開始。 🛠️ 使用工具 Python 3.9.6 TG Bot 📝 功能需求 輸入指令讓 TG Bot 回傳訊息 接受傳入參數並進行簡單回傳 設定
學習如何使用Python連接MongoDB進行憑證監控,包括建立MongoDB docker-compose、連接MongoDB、讀取yaml並寫入MongoDB、傳入env以及domain寫入MongoDB、讀取MongoDB、修改MongoDB、刪除MongoDB。
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
你可能也想看
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
台股、美股近期明顯回檔,市場敘事發生改變,壞消息一樁接一樁出現,下一步該怎麼走呢?本文將探討近期的宏觀經濟事件,並分享個人的操作思考。
Thumbnail
本次更新了貼圖教學內容,包括靜態貼圖上傳、動態貼圖上傳、貼圖轉移教學、表情貼上傳、貼圖拼貼、群組機器人設定和頻道機器人設定教學。
Thumbnail
想了解如何製作適合自己的TG群組機器人來管理群組嗎? 以下將詳細的逐步教學。
Thumbnail
在最近的一系列訪談中,Telegram創始人Pavel Durov揭露了他在保護用戶隱私與安全方面所面臨的巨大壓力,這些壓力來自美國政府和科技巨頭。在與Tucker Carlson等媒體採訪中,他詳細描述了FBI訪問他家、派遣特工施壓他和團隊以及試圖向他的員工行賄的經歷。
Thumbnail
Telegram是全球極為注重隱私且功能優越的通訊應用程式,深受眾多商業從業者的喜愛。擁有越多的訂閱粉絲,相當於為你開創更多的業績和收入機會。你可以考慮採用一種更迅速的方式,就是Telegram頻道買粉絲,以加速頻道的成長與發展。
Thumbnail
本篇方法為使用網頁工具製作動態貼圖, 相較於下方的方式,也可使用Canva製作符合尺寸的3秒GIF動畫,並轉檔為Webm檔,即可上傳Telegram使用。
Thumbnail
Telegram的貼圖,可透過Line貼圖商店,複製貼圖網址後貼於TG機器人moe_stickers_bot即可,無論是靜態貼圖、動態貼圖皆可。
Thumbnail
本篇章講述的是透過Photoshop製作逐格動畫來製作動態貼圖,只是此製作方式所製作的貼圖缺點為若使用的張數若不夠多,動作較容易卡頓,如需製作更為順暢的動態貼圖,可利用其他工具製作三秒的GIF短影片,即可上傳製作成功更加順暢的動態貼圖。
Thumbnail
線上祈禱 + 抽牌分享! 線上禱告+抽牌分享!( 可以 祈禱基督✨、向天使請求✨) https://t.me/star_yuki1657 大家可以一起集氣(正能量), 冥想祈禱、抽牌分享祝福! * 這個頻道不分宗教類別,任何人皆可冥想祈禱、分享祝福!
Thumbnail
「更長的電報」是昧於中國強大崛起的真相,才制訂出的空泛教戰守則。而搞倒「他國領導人」的策略更幼稚到鼓勵媒體造謠抹黑的烏賊戰。拜登對習近平品頭論足的人身言論,多少受其影響。而較溫和「克制派」則考慮廢除或修訂「台灣關係法」或賣武器,武裝臺灣。
Thumbnail
歡迎大家加入交流喔! https://t.me/joinchat/Vfa3-B1A_Qjl-DYgyvNuIg?fbclid=IwAR2N6k9lE0HGQ3i4i3yf64qEmprsVXfrGqdTARJLv6HW-BBwLj9v8PjFSr8
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
台股、美股近期明顯回檔,市場敘事發生改變,壞消息一樁接一樁出現,下一步該怎麼走呢?本文將探討近期的宏觀經濟事件,並分享個人的操作思考。
Thumbnail
本次更新了貼圖教學內容,包括靜態貼圖上傳、動態貼圖上傳、貼圖轉移教學、表情貼上傳、貼圖拼貼、群組機器人設定和頻道機器人設定教學。
Thumbnail
想了解如何製作適合自己的TG群組機器人來管理群組嗎? 以下將詳細的逐步教學。
Thumbnail
在最近的一系列訪談中,Telegram創始人Pavel Durov揭露了他在保護用戶隱私與安全方面所面臨的巨大壓力,這些壓力來自美國政府和科技巨頭。在與Tucker Carlson等媒體採訪中,他詳細描述了FBI訪問他家、派遣特工施壓他和團隊以及試圖向他的員工行賄的經歷。
Thumbnail
Telegram是全球極為注重隱私且功能優越的通訊應用程式,深受眾多商業從業者的喜愛。擁有越多的訂閱粉絲,相當於為你開創更多的業績和收入機會。你可以考慮採用一種更迅速的方式,就是Telegram頻道買粉絲,以加速頻道的成長與發展。
Thumbnail
本篇方法為使用網頁工具製作動態貼圖, 相較於下方的方式,也可使用Canva製作符合尺寸的3秒GIF動畫,並轉檔為Webm檔,即可上傳Telegram使用。
Thumbnail
Telegram的貼圖,可透過Line貼圖商店,複製貼圖網址後貼於TG機器人moe_stickers_bot即可,無論是靜態貼圖、動態貼圖皆可。
Thumbnail
本篇章講述的是透過Photoshop製作逐格動畫來製作動態貼圖,只是此製作方式所製作的貼圖缺點為若使用的張數若不夠多,動作較容易卡頓,如需製作更為順暢的動態貼圖,可利用其他工具製作三秒的GIF短影片,即可上傳製作成功更加順暢的動態貼圖。
Thumbnail
線上祈禱 + 抽牌分享! 線上禱告+抽牌分享!( 可以 祈禱基督✨、向天使請求✨) https://t.me/star_yuki1657 大家可以一起集氣(正能量), 冥想祈禱、抽牌分享祝福! * 這個頻道不分宗教類別,任何人皆可冥想祈禱、分享祝福!
Thumbnail
「更長的電報」是昧於中國強大崛起的真相,才制訂出的空泛教戰守則。而搞倒「他國領導人」的策略更幼稚到鼓勵媒體造謠抹黑的烏賊戰。拜登對習近平品頭論足的人身言論,多少受其影響。而較溫和「克制派」則考慮廢除或修訂「台灣關係法」或賣武器,武裝臺灣。
Thumbnail
歡迎大家加入交流喔! https://t.me/joinchat/Vfa3-B1A_Qjl-DYgyvNuIg?fbclid=IwAR2N6k9lE0HGQ3i4i3yf64qEmprsVXfrGqdTARJLv6HW-BBwLj9v8PjFSr8