用于解決個人使用的公網ip動態變化問題的解決方案

解決方案

  • 靜態ip(放棄)
    • 申請一個靜態ip
    • 價格較貴,只有公司可以申請
  • 使用DDNS(放棄)
    • 通過域名解析到公網ip
    • 通過域名訪問設備
    • 官方光貓不支持DDNS
  • 使用腳本(采用)
    • 通過腳本獲取公網ip
    • 通過腳本發送到郵箱
    • 通過腳本配置DDNS

我的方案

在服務器上部署一個腳本,每隔一段時間登陸本地網關控制網站爬取公網ip信息,如果發生變化,就通過郵箱發送給我。
我設想的進一步是發生變化就自動配置DDNS,但是由于我暫未使用域名,所以暫時沒完成這個功能。
我的網關是TP-Link電信的,可能對于不同平臺的網關設備的管理界面,需要特定的爬取方法,請更具自己的設備做個性化調整。

動態ip解決腳本

一個從網關管理界面拉取信息的工具

  • 爬取ip信息
    • 每隔1小時爬取一次
  • 發送到對應設備
    • 使用郵箱發送通知
  • DDNS配置(未完成)
    • 使用阿里云的DDNS服務
    • 通過腳本配置DDNS
    • 通過腳本修改域名解析

遇到的問題

我在windows上很快完成了這個腳本,但是在linux上卻遇到了很多問題
首先是selenium的chrome驅動問題,它無法自動下載
于是我手動下載了對應的驅動,寫明了路徑,解決此問題

systemctl服務配置問題,原先ai說需要使用虛擬屏幕環境,但是實際不需要。只需要把selenium的配置添加–headless參數即可

源碼

import sys # 導入sys模塊以獲取命令行參數import requests # 導入requests庫用于發送HTTP請求
from bs4 import BeautifulSoupfrom selenium import webdriver # 導入selenium庫用于自動化瀏覽器操作
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Optionsimport timeimport traceback  # 導入traceback模塊以獲取完整的錯誤信息import smtplib # 導入smtplib庫用于發送電子郵件
from email.mime.text import MIMEText
from email.utils import formataddrROUTER_IP = "your_router_ip"  # 替換為路由器IP地址
USERNAME = "your_username"  # 替換為路由器登錄用戶名
PASSWORD = "your_password"  # 替換為路由器登錄密碼
WANIP = "0.0.0.0"  # 初始WAN IP地址CHECK_GAP = 60 * 60  # 檢查間隔時間(秒),1小時SENDER_EMAIL = "your_email@example.com"  # 替換為發送通知的郵箱
QQ_EMAIL_PASSWORD = "your_email_password"  # 替換為郵箱的授權碼或密碼
TARGET_EMAIL = "target_email@example.com"  # 替換為目標郵箱ChromeDriverPath = "/path/to/chromedriver"  # 替換為ChromeDriver的路徑def selenium_login():# 配置Chrome選項(可選)chrome_options = webdriver.ChromeOptions()chrome_options.add_argument('--headless')  # 無頭模式必須chrome_options.add_argument("--no-sandbox")  # Linux 必加chrome_options.add_argument('--disable-dev-shm-usage')chrome_options.add_argument("--disable-blink-features=AutomationControlled")service = webdriver.ChromeService(executable_path=ChromeDriverPath)  # 修改為你的路徑driver = webdriver.Chrome(service=service, options=chrome_options)#driver = webdriver.Chrome(options=chrome_options)try:driver.get(f"http://{ROUTER_IP}/cgi-bin/luci")# 關鍵修復:等待元素可交互(最多等10秒)wait = WebDriverWait(driver, 3)# 方法1:直接移除disabled屬性(更可靠)driver.execute_script("""document.getElementById("login_username").removeAttribute("disabled");document.getElementById("login_password").removeAttribute("disabled");""")# 方法2:傳統等待方式username_field = wait.until(EC.element_to_be_clickable((By.ID, "login_username")))password_field = wait.until(EC.element_to_be_clickable((By.ID, "login_password")))# 輸入憑據username_field.clear()username_field.send_keys(USERNAME)password_field.send_keys(PASSWORD)# 提交登錄submit_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type='submit']")))submit_button.click()# 驗證登錄time.sleep(3)if "/cgi-bin/luci/" in driver.current_url:print("? 登錄成功")return driver;else:print("? 登錄失敗,當前URL:", driver.current_url)driver.save_screenshot("login_fail.png")except Exception as e:print("\n? 完整錯誤信息:")print(traceback.format_exc())  # 關鍵修改:打印完整錯誤
def get_ip_from_html(driver):try:driver.get(f"http://{ROUTER_IP}/cgi-bin/luci/admin/settings/info")time.sleep(1.5)  # 等待頁面加載完成html = driver.page_sourcesoup = BeautifulSoup(html, "html.parser")# 解析IP地址ip_element = soup.find("span", id="WANIP")if ip_element:wan_ip = ip_element.text.strip()return wan_ipelse:print("? 無法找到WAN IP元素")return Noneexcept Exception as e:print("\n? 完整錯誤信息:")raise
def send_notification_by_email(ip, sender_email, password, target_email):try:content = f"新的WAN IP地址是 {ip}"msg = MIMEText(content, "plain", "utf-8")msg["Subject"] = "WAN IP地址變化通知"msg["From"] = formataddr(("IP監控系統", sender_email))msg["To"] = formataddr(("管理員", target_email)) with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:server.login(sender_email, password)server.sendmail(sender_email, [target_email], msg.as_string())print("? 郵件發送成功(即使可能報錯,但郵件已送達)")except smtplib.SMTPResponseException as e:# 忽略SMTP關閉時的異常(如果郵件已發送成功)print(f"?? SMTP服務器返回異常,但郵件可能已發送: {e}")except Exception as e:print(f"? 郵件發送失敗: {e}")raise
def check_ip():"""檢查IP地址是否變化變化返回True,否則返回False"""driver = selenium_login()global WANIPif driver:newWANIP = get_ip_from_html(driver)if newWANIP == WANIP:print("? WAN IP 沒有變化",time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))driver.quit()return False;else:print("? WAN IP 發生變化:", newWANIP,"當前查詢時間為:" ,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))WANIP = newWANIPdriver.quit()return True;else:print("? 無法獲取新的WAN IP, 請檢查登錄是否成功")driver.quit()return False;   if __name__ == "__main__":print("Start")while True:if(check_ip()):print("ready to send email")send_notification_by_email(WANIP, SENDER_EMAIL, QQ_EMAIL_PASSWORD, TARGET_EMAIL)time.sleep(CHECK_GAP)  # 等待指定的檢查間隔時間

常用命令

sudo journalctl -u 服務名.service -n 50  # 查看最近 50 行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900285.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900285.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900285.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring / Spring Boot 的@MapperScan 和 @Repository

MapperScan 和 Repository 是兩個與數據訪問層相關的注解,它們在功能上有一定的聯系,但也有明顯的區別。 一、相同點 1. 都與數據訪問層相關 MapperScan:用于掃描 MyBatis 的 Mapper 接口。MyBatis 是一個流行的持久層框架,Mapp…

全星 研發項目管理APQP 軟件:驅動汽車及制造業研發升級的數字化引擎

全星 APQP 軟件:驅動汽車及制造業研發升級的數字化引擎 在汽車及制造業競爭白熱化的當下,如何高效推進研發項目,同時確保嚴格合規,成為企業亟待解決的難題。 全星研發項目管理 APQP 軟件系統,憑借卓越的功能與顯著優勢…

cadence17.4和16.6同時安裝無法使用的問題

最近在搞這個兩個版本的軟件安裝,針對網上的一些說法: 方法一:先裝17.4再裝16.6,文件放在一個文件夾,打不開,兩個版本都無法使用 方法二:分別安裝,文件路徑放在不同的文件 方案三:修改環境變量,直接使用17.4的 License Manager 這個也無法解決問題。 經過對報錯的問…

(三)鏈式工作流構建——打造智能對話的強大引擎

上一篇:(二)輸入輸出處理——打造智能對話的靈魂 在前兩個階段,我們已經搭建了一個基礎的智能對話,并深入探討了輸入輸出處理的細節。今天,我們將進入智能對話的高級階段——鏈式工作流構建。這一階段的目…

【MATLAB定位例程】TDOA(到達時間差)的chan-tylor,三維環境,附完整代碼

該代碼實現了基于三維空間的動態目標TDOA定位,結合了Chan算法(解析解)與Taylor級數展開法(迭代優化)的雙重優勢。 文章目錄 運行結果MATLAB代碼代碼講解代碼功能概述核心算法原理代碼結構解析可視化與結果分析運行結果 定位示意圖: 三軸狀態曲線: 三軸誤差曲線: MA…

Golang的文件同步與備份

Golang的文件同步與備份 一、Golang介紹 也稱為Go語言,是谷歌開發的一種編程語言,具有高效的并發編程能力和出色的內存管理。由于其快速的編譯速度和強大的標準庫,Golang在網絡應用、云平臺和大數據等領域得到了廣泛應用。 二、文件同步與備份…

ARXML文件解析-2

目錄 1 摘要2 常見ARXML文件注意事項以及常見問題2.1 注意事項2.2 常見問題2.3 答疑 3 ARXML解讀/編輯指南3.1 解讀ARXML文件的步驟3.2 編輯ARXML文件的方法3.3 驗證與調試 4 總結 1 摘要 本文主要對ARXML文件的注意事項、常見問題以及解讀與編輯進行詳細介紹。 上文回顧&…

3535 數組分割

3535 數組分割 ??難度:困難 🌟考點:2023、省賽、動態規劃 📖 📚 import java.util.*;public class Main {static int MOD 1000000007;static int N 1005;public static void main(String[] args) {Scanner sc …

Git操作指南

Git操作指南 1.安裝并配置Git Git官網:https://git-scm.com/downloads 安裝完成后,打開Git Bash,配置Git: git config --global user.email "emailexample.com" git config --global user.name "Your Name&quo…

Linux常用基礎命令應用

目錄 一、文件與目錄操作(12個核心命令)?? ??1. pwd - 顯示當前路徑?? ??2. ls - 查看目錄內容?? ??3. cd - 切換目錄?? ??4. mkdir - 創建目錄?? ??5. touch - 創建文件?? ??6. cp - 復制文件/目錄?? ??7. mv - 移動…

zookeeper基本概念和核心作用

圖片來源: 02-Zookeeper概念_嗶哩嗶哩_bilibili02-Zookeeper概念是黑馬程序員Zookeeper視頻教程,快速入門zookeeper技術的第2集視頻,該合集共計24集,視頻收藏或關注UP主,及時了解更多相關視頻內容。https://www.bilib…

關于HikariDataSource (null)的誤解,順帶提出一種mybaits-Plus mapper映射失敗的容易被忽視的原因

首先探究此問題并無什么實際意義,純屬是個人好奇使然,也順帶熟悉了一下Springboot 數據庫連接的相關問題,本人純小白說的不對的地方懇請大佬指正!! 關于HikariDataSource (null)的誤解 問題的發現 Value("${myba…

Centos7上安裝docker - yum在線的方式

步驟一 : 安裝 yum-utils yum install -y yum-utils步驟二 : 替換docker 的國內的源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo執行完成后,會在 /etc/yum.repos.d/ 目錄下 新增 doc…

250405-VSCode編輯launch.json實現Debug調試Open-WebUI

A. 最終效果 根據__init__.py配置launch.json 根據中utils/chat.py中form_data的messages [{role: user, content: 唐老鴨}],可以找到用戶輸入,進而通過關鍵詞或模型調用的方式,對敏感問題進行特殊處理。 B. 文件配置 launch.json // { // /…

①(PROFINET 轉 Modbus TCP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP協議互轉工業串口網關

型號 協議轉換通信網關 PROFINET 轉 Modbus TCP MS-GW35 概述 MS-GW35 是 PROFINET 和 Modbus TCP 協議轉換網關,為用戶提供一種 PLC擴展的集成解決方案,可以輕松容易將 Modbus TCP 網絡接入 PROFINET 網絡中,方便擴展,不受限制…

分治-歸并排序-逆序對問題

目錄 1.升序(以右邊的合并組為基準) 2.降序(以左邊的合并組為基準) 3.逆對序--固定下標 1.升序(以右邊的合并組為基準) 找出左邊有多少個數比我(nums[right])大 應該在每一次合并之前,進行…

(四)數據檢索與增強生成——讓對話系統更智能、更高效

上一篇:(三)鏈式工作流構建——打造智能對話的強大引擎 在前三個階段,我們已經搭建了一個基礎的智能對話,并深入探討了輸入輸出處理和鏈式工作流構建的細節。今天,我們將進入智能對話系統的高級階段——數…

JVM虛擬機篇(二):深入剖析Java與元空間(MetaSpace)

這里寫目錄標題 JVM虛擬機篇(二):深入剖析Java與元空間(MetaSpace)一、引言二、全面認識Java2.1 Java的起源與發展歷程2.2 Java的特性2.2.1 簡單性2.2.2 面向對象2.2.3 平臺無關性2.2.4 健壯性2.2.5 安全性2.2.6 多線程…

如何查看 MySQL 的磁盤空間使用情況:從表級到數據庫級的分析

在日常數據庫管理中,了解每張表和每個數據庫占用了多少磁盤空間是非常關鍵的。這不僅有助于我們監控數據增長,還能為性能優化提供依據。 Google Gemini中國版調用Google Gemini API,中國大陸優化,完全免費!https://ge…