本方案适合拨号宽带网络环境,当检测到公网IP地址变更时,可联动自动触发MQTT消息推送或邮件通知,实现动态IP的实时监控与告警。
0x01 代码
python
import re
import time
import requests
def extract_ip(html):
"""用正则提取 IP(兼容各种格式)"""
ip_match = re.search(r'\b(?:\d{1,3}\.){3}\d{1,3}\b', html)
return ip_match.group(0) if ip_match else None
def get_public_ipv4_ip():
try:
# 设置伪装请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive'
}
response = requests.get("https://httpbin.org/ip", headers=headers)
print(response.text)
ipv4 = extract_ip(response.text)
return ipv4
except Exception as e:
print(e)
return None
def get_public_ipv6_ip():
try:
# 使用多个IP查询API(防止单个API失效)
services = [
'https://ident.me',
'https://api.ipify.org',
'https://ifconfig.me/ip',
]
for url in services:
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
print("fsdfsfs", response.content)
return response.text.strip()
except requests.RequestException:
continue
return "Failed to get IP"
except Exception as e:
return f"Error: {e}"
def monitor_ip(interval=60):
"""定时检查IP变化(同时监控IPv4和IPv6)"""
last_ips = {'v4': None, 'v6': None}
while True:
current_ips = {
'v4': get_public_ipv4_ip(),
'v6': get_public_ipv6_ip()
}
for ip_type in ['v4', 'v6']:
current_ip = current_ips[ip_type]
last_ip = last_ips[ip_type]
if current_ip and current_ip != last_ip:
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] IPv{ip_type} Changed: {current_ip}")
last_ips[ip_type] = current_ip
time.sleep(interval)
if __name__ == "__main__":
print(f"Current Public IP: {get_public_ipv4_ip()} {get_public_ipv6_ip()} ")
# 开启IP变化监控(每60秒检查一次)
monitor_ip(interval=60)
0x02 运行效果:

0x99 参考:
Python 爬虫:requests 和 selenium 伪装 headers 和代理应对反爬机制 | XinanCSD.github.io