前言
因为我自己有个服务器放在家里面,老友们都知道我自己搭建的有个挂机平台,虽然也有在用代理IP,但是代理IP的质量不行,某些脚本还动不动就黑IP,因此就想办法来弄个定时断开拨号并连上IP的服务,本来想使用脚本精灵来执行这个任务,但是需要打开浏览器,太占用内存了,因此想用py语言来实现这个,试了一下,确实挺好用!
准备工作
首先你要有一台小米路由器和一台一直运行的支持搭建有python的服务器
可以是win服务器 也可以是刷了armbian的WiFi棒子或者刷机后的玩客云等设备
当然 软路由和刷了OpenWrt的路由器也行
然后根据你的路由器的IP和管理密码 修改以下代码
import requests import time # 路由器的IP地址和登录凭证 router_ip = "192.168.31.1" # 根据你的路由器IP地址进行调整 username = "admin" # 小米路由器只输入密码 这个是默认账号 不用动 password = "password" # 你的路由器管理密码 def login(): try: print("开始登录路由器...") login_url = f"http://{router_ip}/cgi-bin/luci/api/xqsystem/login" payload = { 'username': username, 'password': password } response = requests.post(login_url, data=payload) response.raise_for_status() token = response.json()['token'] print("登录成功,获取到token。") return token except requests.RequestException as e: print(f"登录失败: {e}") raise def get_current_ip(): try: response = requests.get("http://icanhazip.com") response.raise_for_status() ip = response.text.strip() return ip except requests.RequestException as e: print(f"获取当前IP地址失败: {e}") return None def reconnect(token): try: print("停止PPPoE连接...") stop_url = f"http://{router_ip}/cgi-bin/luci/;stok={token}/api/xqnetwork/pppoe_stop" response = requests.post(stop_url) response.raise_for_status() print("PPPoE连接已停止。") except requests.RequestException as e: print(f"停止PPPoE连接失败: {e}") raise try: print("启动PPPoE连接...") start_url = f"http://{router_ip}/cgi-bin/luci/;stok={token}/api/xqnetwork/pppoe_start" response = requests.post(start_url) response.raise_for_status() print("PPPoE连接已启动。") except requests.RequestException as e: print(f"启动PPPoE连接失败: {e}") raise def update_ddns(token): try: print("执行DDNS手动更新...") ddns_update_url = f"http://{router_ip}/cgi-bin/luci/;stok={token}/api/xqnetwork/ddns_reload" response = requests.get(ddns_update_url) response.raise_for_status() print("DDNS手动更新已执行。") except requests.RequestException as e: print(f"执行DDNS手动更新失败: {e}") raise def main(): try: print("重拨之前的IP地址: ") current_ip = get_current_ip() if current_ip: print(f"当前IP地址: {current_ip}") token = login() reconnect(token) # 等待5秒钟 print("等待5秒钟...") time.sleep(5) print("重拨之后的IP地址: ") time.sleep(5) # 再等待5秒钟 new_ip = get_current_ip() if new_ip: print(f"新的IP地址: {new_ip}") # 等待10秒钟再执行DDNS更新 print("等待10秒钟...") time.sleep(10) update_ddns(token) print("重拨和DDNS更新成功。") except Exception as e: print(f"重拨或DDNS更新失败: {e}") if __name__ == "__main__": main()
将以上代码保存为xiaomi.py 存放在你的服务器上 例如存放在/root里面 此时路径就是 /root/xiaomi.py
然后在定时任务里面添加这个脚本的运行规则 例如每小时的00执行该命令
linux环境
假如你将以上代码保存为xiaomi.py 存放在/root里面 此时该文件的路径就是 /root/xiaomi.py
然后在定时任务里面添加这个脚本的运行规则,例如每小时的00执行该命令,具体步骤如下
- 打开 crontab 编辑器:
crontab -e
- 在 crontab 编辑器中添加以下行:
0 * * * * /usr/bin/python3 /root/xiaomi.py
这行代码的含义是:每小时的第 00 分钟运行 /root/xiaomi.py 脚本。确保使用正确的 Python 路径,如果你的 Python 解释器路径是其他位置,请根据实际情况修改。例如,可以使用 which python3 命令查找 Python 的路径。
- 保存并退出编辑器。
解释 crontab 语法
0 * * * * /usr/bin/python3 /root/xiaomi.py 中的每个字段含义如下:
- 0: 分钟(0表示每小时的第 00 分钟)
- *: 小时(*表示每小时)
- *: 天(*表示每天)
- *: 月(*表示每月)
- *: 星期(*表示每周的每一天)
Windows环境
假如你把代码命名为xiaomi.py 并存放在C盘根目录,此时文件的路径就是 C:\xiaomi.py
具体教程如下
在 Windows 环境下,你可以使用任务计划程序 (Task Scheduler) 来定时运行你的 脚本。以下是详细的步骤:
- 打开任务计划程序 (Task Scheduler):
- 按 Win + R,输入 taskschd.msc 并按回车,或者从控制面板中找到任务计划程序。
- 创建一个基本任务:
- 在任务计划程序的右侧,选择“创建基本任务”。
- 设置任务名称和描述:
- 输入任务的名称和描述,然后点击“下一步”。
- 选择触发器:
- 选择“每日”并点击“下一步”。
- 设置开始日期和时间:
- 选择一个开始日期和时间。比如可以设置为当天的某个整点时间。点击“下一步”。
- 设置任务重复间隔:
- 选择“每天”重复任务,并设置为1天。点击“下一步”。
- 选择操作:
- 选择“启动程序”并点击“下一步”。
- 指定程序和脚本:
- 在“程序/脚本”框中,输入 Python 解释器的路径。例如:C:\Python39\python.exe(根据你实际安装的 Python 路径)。
- 在“添加参数”框中,输入你的 Python 脚本的路径。例如:C:\xiaomi.py。
- 在“起始于”框中,输入脚本所在目录。例如:C:\。
- 点击“下一步”。
- 完成任务创建:
- 点击“完成”按钮,任务即被创建。
设置每小时重复
如果你希望脚本每小时运行一次,还需要修改任务的属性:
- 在任务计划程序中找到你刚创建的任务,右键点击并选择“属性”。
- 在“触发器”选项卡中,选择你之前创建的触发器,然后点击“编辑”。
- 在“高级设置”中,勾选“重复任务间隔”,选择“每 1 小时”,并设置“持续时间”为“无限”。
- 点击“确定”保存设置,然后再次点击“确定”关闭任务属性窗口。
示例任务创建
假设 Python 解释器路径为 C:\Python39\python.exe,脚本路径为 C:\xiaomi.py:
- 程序/脚本: C:\Python39\python.exe
- 添加参数: C:\xiaomi.py
- 起始于: C:\
按照上述步骤,你的 Python 脚本将会在每小时的第 00 分钟运行。