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

留言
avatar-img
留言分享你的想法!
avatar-img
Alan的開發者天地
18會員
83內容數
golang
Alan的開發者天地的其他內容
2024/09/15
本文介紹如何使用 MongoDB 的命令行工具 Mongorestore 將先前備份的資料還原到資料庫中。Mongorestore 支援資料庫的整體恢復、特定集合的恢復,以及從遠端伺服器進行恢復等功能。無論是初學者還是有經驗的使用者,都能夠快速掌握如何使用 Mongorestore 工具。
Thumbnail
2024/09/15
本文介紹如何使用 MongoDB 的命令行工具 Mongorestore 將先前備份的資料還原到資料庫中。Mongorestore 支援資料庫的整體恢復、特定集合的恢復,以及從遠端伺服器進行恢復等功能。無論是初學者還是有經驗的使用者,都能夠快速掌握如何使用 Mongorestore 工具。
Thumbnail
2024/09/08
👨‍💻簡介 在資料庫管理和系統維護中,備份是非常重要的一環。對於使用 MongoDB 的開發者和資料庫管理員來說,mongodump 是一個非常實用的命令行工具,能夠快速且輕鬆地完成資料庫的備份和恢復。無論是進行資料遷移、系統升級,還是面對突發的故障,mongodump 都能提供穩定的資料保護
Thumbnail
2024/09/08
👨‍💻簡介 在資料庫管理和系統維護中,備份是非常重要的一環。對於使用 MongoDB 的開發者和資料庫管理員來說,mongodump 是一個非常實用的命令行工具,能夠快速且輕鬆地完成資料庫的備份和恢復。無論是進行資料遷移、系統升級,還是面對突發的故障,mongodump 都能提供穩定的資料保護
Thumbnail
2024/06/04
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
Thumbnail
2024/06/04
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
提供一條簡單公式、一套盤點思路,幫助你快速算出去日本自助旅遊需要準備多少日幣現金!
Thumbnail
提供一條簡單公式、一套盤點思路,幫助你快速算出去日本自助旅遊需要準備多少日幣現金!
Thumbnail
想發簡訊給自己經營的電商會員時,可以直接用大量簡訊平台一次發送。 但目前因為詐騙簡訊"盛行"的關係,申請這類平台的規則也變嚴格了,連自己的個資也要上繳給這些平台做身份驗證,所以還是找一些安全、有信譽的廠商,免得把自己的個資賣掉外,自己會員的個資也賣了。
Thumbnail
想發簡訊給自己經營的電商會員時,可以直接用大量簡訊平台一次發送。 但目前因為詐騙簡訊"盛行"的關係,申請這類平台的規則也變嚴格了,連自己的個資也要上繳給這些平台做身份驗證,所以還是找一些安全、有信譽的廠商,免得把自己的個資賣掉外,自己會員的個資也賣了。
Thumbnail
在行動裝置安全日益嚴峻的環境下,保護手機資料至關重要。使用者除了養成良好的使用習慣之外,也需要定期更新手機OS系統來提升資料安全防護力,而企業端也可以透過APP加殼加密的方式,讓APP達到更高水平的防護。
Thumbnail
在行動裝置安全日益嚴峻的環境下,保護手機資料至關重要。使用者除了養成良好的使用習慣之外,也需要定期更新手機OS系統來提升資料安全防護力,而企業端也可以透過APP加殼加密的方式,讓APP達到更高水平的防護。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
Thumbnail
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
Thumbnail
1. 如何分辨詐騙、避免被詐騙 2. 掃毒、增強帳號安全、多段驗證、安全金鑰 3.快速取回帳號
Thumbnail
1. 如何分辨詐騙、避免被詐騙 2. 掃毒、增強帳號安全、多段驗證、安全金鑰 3.快速取回帳號
Thumbnail
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
Thumbnail
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
Thumbnail
高科技的迷湯「一切都是為你好」 今天,要跟各位來談談行動自由的重要性,以及世界深層政府如何利用各種「高科技」來迷惑人民,讓他們自願放棄難能可貴的自由人權。
Thumbnail
高科技的迷湯「一切都是為你好」 今天,要跟各位來談談行動自由的重要性,以及世界深層政府如何利用各種「高科技」來迷惑人民,讓他們自願放棄難能可貴的自由人權。
Thumbnail
前幾天看到一則標題『貼牌的中國製智慧門鈴內含安全漏洞』,讓我想到以前寫過類似的故事,關於小型資訊公司與貼牌軟體漏洞的故事,也想重新整理思路當面對類似問題無論是開發公司或是購買軟體的公司該如何面對。
Thumbnail
前幾天看到一則標題『貼牌的中國製智慧門鈴內含安全漏洞』,讓我想到以前寫過類似的故事,關於小型資訊公司與貼牌軟體漏洞的故事,也想重新整理思路當面對類似問題無論是開發公司或是購買軟體的公司該如何面對。
Thumbnail
大數據時代下,Log的多元應用至關重要。Log生成龐大,格式各異,特別金融業需合規。探討Log廣泛應用、資訊安全、IT管理和商業決策。建立Log管理系統核心深入法規,強化IT治理、權限控管。一站式Log管理平台,確保資訊安全合規。
Thumbnail
大數據時代下,Log的多元應用至關重要。Log生成龐大,格式各異,特別金融業需合規。探討Log廣泛應用、資訊安全、IT管理和商業決策。建立Log管理系統核心深入法規,強化IT治理、權限控管。一站式Log管理平台,確保資訊安全合規。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News