Telegram 憑證監控機器人實作 EP3 - 整合 MongoDB

閱讀時間約 15 分鐘


raw-image

👨‍💻 簡介

這一部分主要讓 TG Bot 可以接收指令,對 MongoDB 進行增刪改查,讓我能夠透過 TG Bot 來新增、修改、刪除 domain,這樣就能夠做到自動化管理,而且可以做到多環境的管理。

🛠️ 使用工具

  • Python 3.9.6
  • MongoDB
  • TG Bot

📝 功能需求

  • 透過 TG Bot 讀取 MongoDB 所有 domain
  • 透過 TG Bot 讀取 MongoDB 特定 domain
  • 透過 TG Bot 新增 Domain 到 MongoDB
  • 透過 TG Bot 新增同一 env 底下多組 domain 到 MongoDB
  • 透過 TG Bot 修改 MongoDB Domain
  • 透過 TG Bot 刪除 MongoDB Domain

🎯Setup

  1. 透過 TG Bot 讀取 MongoDB 所有 domain

先將原本的 MongoDB 啟動起來,並放入值,接著來去呼叫 load_domain_envs_from_mongodb 這個 function

import telebot
from mongo import init_mongo_client, get_collection, load_domain_envs_from_mongodb

mongodb_uri = "mongodb://rootuser:rootpass@localhost:27017/mydatabase?authSource=admin"
TOKEN = "your-token"
bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=["get_all"])
def handle_get_all_command(message):
domain_data = load_domain_envs_from_mongodb(collection)
bot.send_message(message.chat.id, f"{domain_data}", parse_mode="Markdown")

if __name__ == "__main__":
client = init_mongo_client(mongodb_uri)
collection_name = "domains"
collection = get_collection(client, collection_name)
bot.infinity_polling()

接著就可以到 TG 輸入指令測試

raw-image

輸出的格式是 Python 物件,想要可讀性高一點可以使用 yaml Library 轉成 yaml 格式:

def convert_to_yaml(python_obj):
return yaml.dump(python_obj, allow_unicode=True)

@bot.message_handler(commands=["get_all"])
def handle_get_all_command(message):
domain_data = load_domain_envs_from_mongodb(collection)
yaml_domain_data = convert_to_yaml(domain_data)
bot.send_message(message.chat.id, f"{yaml_domain_data}", parse_mode="Markdown")

yaml.dump 可以很方便的將 Python 對象序列化為 yaml 格式的 string。

重新到 TG 輸入指令後結果會如圖:

raw-image

接下來就能進行第二步,讀取特定 domain。

2. 透過 TG Bot 讀取 MongoDB 特定 Domain

會需要這功能主要是為了之後整合監控憑證,會需要將特定 domain 查詢是否過期:

@bot.message_handler(commands=["get"])
def handle_get_command(message):
try:
# 從 message 中解析參數
_, get_env, get_domain = message.text.split(maxsplit=2)
except ValueError:
# 如果參數數量不正確,回復用戶正確的使用方式
bot.reply_to(
message,
"使用方式不正確。請按照以下格式輸入:\n/get <env> <domain>",
)
return

# 調用取得 domain MongoDB 的函數
get_result = get_domain_from_mongodb(collection, get_env, get_domain)
print("get result", get_result)
# 根據操作結果回復用戶
if get_result:
domain_info_yaml = convert_to_yaml(get_result)
bot.reply_to(message, f"{domain_info_yaml}", parse_mode="Markdown")
else:
bot.reply_to(message, f"在 {get_env} 環境中未找到域名 {get_domain} 的訊息。")

接著到 TG 輸入測試,結果如圖:

raw-image

以上就是查詢的部分,接著來做新增。

3. 透過 TG Bot 新增 Domain 到 MongoDB

新增需要傳入參數,因此會需要在 TG 的函數裡取得對應的參數,然後去呼叫 add_domain_to_mongodb 函數:

@bot.message_handler(commands=["add"])
def handle_add_command(message):
try:
# 從 message 中解析參數
_, env, domain = message.text.split(maxsplit=2)
except ValueError:
# 如果參數數量不正確,回復用戶正確的使用方式
bot.reply_to(
message, "使用方式不正確。請按照以下格式輸入:\n/add <env> <domain>"
)
return

# 調用添加域名到 MongoDB 的函數
add_successful = add_domain_to_mongodb(collection, env, domain)
# 根據操作結果回復用戶
if add_successful:
bot.reply_to(message, "域名添加成功。")
else:
bot.reply_to(message, "域名添加失敗,請檢查輸入的數據。")

接著去 TG 輸入測試:

raw-image

基本的新增這樣就完成了,但如果域名很多,會需要每次都輸入一次 env,因此新增一個 bulk_add 的功能,在每次要將多組域名放在同一個 env 底下時會很有用。

4. 透過 TG Bot 新增同一 env 底下多組 domain 到 MongoDB

這裡會使用到跟 add_domain_to_mongodb 一樣的功能,都是 addToSet,但差別在於會使用到 $each,這個操作符允許一次性向 MongoDB 添加多個唯一的元素:

def bulk_add_domains_to_mongodb(collection, env, domains):
# 使用 $addToSet 和 $each 來同時添加多個唯一的域名到相同的 env 中
result = collection.update_one(
{"env": env}, {"$addToSet": {"domains": {"$each": domains}}}, upsert=True
)
if result.matched_count > 0 or result.upserted_id is not None:
print("域名已成功批量添加或更新。")
return True
else:
print("域名批量添加或更新失敗。")
return False

接著到 main.py 新增指令:

@bot.message_handler(commands=["bulk_add"])
def handle_bulk_add_command(message):
# 將命令解析為 env 和多個 domain
parts = message.text.split()
if len(parts) < 3:
bot.reply_to(
message,
"使用方式不正確。請按照以下格式輸入:\n/bulk_add <env> <domain1> <domain2> ...",
)
return

env = parts[1]
domains = parts[2:]
# 調用批量添加域名到 MongoDB 的函數
success = bulk_add_domains_to_mongodb(collection, env, domains)
# 根據操作結果回傳給使用者
if success:
bot.reply_to(message, "域名批量添加成功。")
else:
bot.reply_to(message, "域名批量添加失敗,請檢查輸入的數據。")

最後試著在 TG 執行:

raw-image

這樣批量新增的部分就完成了,接下來是做修改。

5. 透過 TG Bot 修改 MongoDB Domain

修改會需要傳入三個參數,分別是 envorigin_domainnew_domain,因此跟新增一樣需要去取得傳入的參數並帶入 update_domain_in_mongodb 函數:

@bot.message_handler(commands=["edit"])
def handle_edit_command(message):
try:
# 從 message 中解析參數
_, update_env, origin_domain, new_domain = message.text.split(maxsplit=3)
except ValueError:
# 如果參數數量不正確,回覆用戶正確的使用方式
bot.reply_to(
message,
"使用方式不正確。請按照以下格式輸入:\n/edit <env> <old_domain> <new_domain>",
)
return

# 調用更新 MongoDB 的函數
update_result = update_domain_in_mongodb(
collection, update_env, origin_domain, new_domain
)
# 根據操作結果回覆用戶
if update_result:
bot.reply_to(message, "域名更新成功。")
else:
bot.reply_to(message, "域名更新失敗,請檢查輸入的數據。")

一樣到 TG 測試

raw-image

修改完成後,最後就剩刪除了

6. 透過 TG Bot 刪除 MongoDB Domain

刪除就簡單很多,傳入 env 以及 domain 並調用 delete_domain_in_mongodb 就好了:

@bot.message_handler(commands=["del"])
def handle_delete_command(message):
try:
# 從 message 中解析參數
_, env, domain = message.text.split(maxsplit=2)
except ValueError:
# 如果參數數量不正確,回覆用戶正確的使用方式
bot.reply_to(
message, "使用方式不正確。請按照以下格式輸入:\n/del <env> <domain>"
)
return

# 調用從 MongoDB 刪除域名的函數
delete_successful = delete_domain_in_mongodb(collection, env, domain)
# 根據操作結果回覆用戶
if delete_successful:
bot.reply_to(message, "域名刪除成功。")
else:
bot.reply_to(message, "域名刪除失敗,請檢查輸入的數據。")

以上這樣就完成了 TG Bot 與 MongoDB 的整合了。 下一篇文章會將原本使用 ssl Library 撈取過期時間的部分也進行整合。

如果想看完整程式碼可以參考這裡 🔗 專案 repo –> ep3-tg-with-mongo

17會員
81內容數
golang
留言0
查看全部
發表第一個留言支持創作者!
wang alan的沙龍 的其他內容
👨‍💻 簡介 今天這篇主要是帶大家快速建立屬於自己的 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 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
👨‍💻簡介 在當今的雲計算時代,容器化和微服務架構成為了重要趨勢。Kubernetes,作為領先的容器編排平台,提供了強大的功能來管理和部署應用程式。然而,隨著應用程式和用戶的增加,有效管理誰可以對 Kubernetes 集群執行何種操作變得至關重要。
👨‍💻簡介 terraform在每次執行terraform plan或terraform apply時,是如何知道應該要管理哪些資源? 其實就是透過在每次執行terraform時,將建立或要變更的資源都記錄在terraform.state這份狀態檔,預設檔案使用JSON格式。
👨‍💻 簡介 今天這篇主要是帶大家快速建立屬於自己的 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 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
👨‍💻簡介 在當今的雲計算時代,容器化和微服務架構成為了重要趨勢。Kubernetes,作為領先的容器編排平台,提供了強大的功能來管理和部署應用程式。然而,隨著應用程式和用戶的增加,有效管理誰可以對 Kubernetes 集群執行何種操作變得至關重要。
👨‍💻簡介 terraform在每次執行terraform plan或terraform apply時,是如何知道應該要管理哪些資源? 其實就是透過在每次執行terraform時,將建立或要變更的資源都記錄在terraform.state這份狀態檔,預設檔案使用JSON格式。
你可能也想看
Thumbnail
八十-二十法則提到,在多數生活的現象中,約80%的效果是來自於20%的原因,除了經濟學、學習理論外,這個法則同樣也可以應用在生活中的幸福感上。 我們需要認知到擁有的越多不一定會越快樂,反而有可能會因為無法專注在少數事物上而產生空虛、迷茫的感覺。「極簡」精神最重要的一點在於放下對於「多」的執著,將有
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
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
八十-二十法則提到,在多數生活的現象中,約80%的效果是來自於20%的原因,除了經濟學、學習理論外,這個法則同樣也可以應用在生活中的幸福感上。 我們需要認知到擁有的越多不一定會越快樂,反而有可能會因為無法專注在少數事物上而產生空虛、迷茫的感覺。「極簡」精神最重要的一點在於放下對於「多」的執著,將有
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
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