用于解决个人使用的公网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.mzph.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…