引入
由于家宽公网 IPv4 每隔24~48小时,就会被运营商强制断线重连,导致CDN在回源时可能找不到源站。
尝试通过缩短A记录的TTL来缓解此现象,但是大陆的网络环境,各地运营商DNS层层缓存,这样没有作用
只能退而求其次,尽量控制让IP变动的时候在晚上,减少影响
本来可以通过软路由的定时任务来轻松解决的,但是我用于拨号的华为路由器没有这样的功能
因此,Vibe coding了一个脚本,适用于华为AX3 Pro路由器的自动重新拨号
这个脚本仅在 AX3 Pro 进行过测试,其他型号的同种控制台应该也能使用。可能需要修改脚本中的div id
分析
本希望通过抓包登录和重启路由器的接口,但华为路由器采用了SCRAM (Salted Challenge Response Authentication Mechanism,加盐挑战响应认证机制) 或类似的安全握手协议,而不是直接发送明文密码。
因此每次登录时 firstnonce、csrf_token 和计算出来的 clientproof 都是动态变化的
如果希望通过脚本完成加盐挑战响应,需要解析来自路由器网页的js,比较麻烦
也尝试了通过抓包重启光猫也能达到目的(请求体是简单的明文),但是重启光猫时会导致座机也重启,晚上会发出声响
最后决定使用 Playwright 无头浏览器自动化点击来重新拨号
1.安装依赖
pip install playwright
playwright install chromium
playwright install-deps
2.创建脚本
在第 15 行填入登录密码
from playwright.sync_api import sync_playwright
import time
def reboot_router():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
try:
print("Opening router dashboard...")
page.goto("http://192.168.3.1/")
page.wait_for_load_state('networkidle')
print("Logging in with password...")
page.fill('#userpassword_ctrl', '<PASSWORD>') # <--把此处改为你的登录密码
page.click('#loginbtn')
time.sleep(3)
print("Logged in,executing reconnecting action...")
page.click('#internet')
page.click('#internet_reconnect')
print("Success.The network is about to reconnect...")
time.sleep(2)
except Exception as e:
print(f"An error occurred: {e}")
finally:
browser.close()
if __name__ == "__main__":
reboot_router()
3.设置定时任务
通过cronjob设置
crontab -e
# 添加脚本路径,设置每天凌晨3点执行
0 3 * * * /bin/bash -c "cd /path/to/script && source venv/bin/activate && python main.py >> reboot.log 2>&1"
在1panel中设置
导航到 计划任务-创建
- 执行周期: 如
每天3 小时0 分钟 - 解释器:
python3 - 脚本内容:
路径选择,并填入脚本路径