水星MW300R路由器实现自动重启

0 目录

  • 背景介绍
  • 分析路由器管理界面身份验证方式
  • 重启路由器的接口获取及测试
  • 用python脚本实现重启路由器
  • 开机自动运行重启脚本

1 背景介绍

最近我家里的路由器老是上不了网,每次重启一下又好了,可能确实是太老了,用了差不多有8年了吧
然后想着能不能设置个自动定时重启,再继续用个一两年
于是上网搜索了路由器设置自动重启的方法,有的说路由器管理页面的自动清理功能就是自动重启

然鹅我的路由器并没有这个设置,可能年代久远的路由器没有这个吧(我的是水星WM300R)
最后决定另辟蹊径,试试能不能通过发送http请求来重启路由器,然后编写成脚本实现自动重启

2 分析路由器管理界面身份验证方式

使用工具:

  • Firefox
  • Postman

首先,我这个路由器的管理页面是有重启路由器的功能的,所以只需要获取到这个重启路由器的api就可以了。

使用Firefox进入路由器管理页面的登录页,用Web开发者工具箱来开始监控网络请求
然后输入管理员密码进入路由器管理页面,来获取登录的http请求,因为可能要有身份权限才能进行后续操作
分析后发现并没有抓取到登录验证相关的http请求,点击登录之后直接就返回了管理员页面的html
通过分析页面的请求头,发现这个请求头带上了一个Cookie,看样子是用于身份验证的

然后打开Postman,将这个Cookie放进请求头里试着请求一下

然后发现提示没有权限,身份验证失败了

然后将所有请求都分析了一下发现他们的一个共同点:请求头里都带上了Referer,值都是请求地址本身

试着将这个Referer也放进请求头再试一下
居然就成功了

3 重启路由器的接口获取及测试

接着再管理页面使用重启功能重启一下路由器,获取到重启路由器的请求地址:http://192.168.2.1/userRpm/SysRebootRpm.htm
发送请求后发现,返回的是一个页面,路由器并没有重启
分析这个返回的页面发现,真正的重启路由器的请求地址应该是有参数的,而这个参数应该是“reboot=重启路由器”

将这个参数加上再试一次,搞定!

4 用python脚本实现重启路由器

参考资料:

Python HTTP请求的实现:https://blog.csdn.net/weixin_42734407/article/details/81162026
python 使用 requests 做 http 请求:https://www.cnblogs.com/snow-backup/p/11765578.html
requests--请求头设置:https://www.cnblogs.com/zouzou-busy/p/11407630.html
python txt文件常用读写操作:https://www.cnblogs.com/youyou0/p/8921719.html
Python获取当前时间及格式化:https://www.cnblogs.com/komean/p/10603518.html

首先
安装python的Requests库

pip install requests

安装完成之后,先用python编写测试脚本测试一下刚刚获取的请求url

import requests

url = 'http://192.168.2.1/userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7'
form_cookies = {'Authorization': 'xxx'}
form_header = {'Referer': 'http://192.168.2.1/userRpm/SysRebootRpm.htm'}
r = requests.post(url, cookies=form_cookies, headers=form_header)

if r.status_code == 200 and '操作成功' in r.text:
    print('操作成功')
elif r.status_code == 200 and '403' in r.text:
    print('error:403')
elif r.status_code != 200:
    print('error:' + r.status_code)

运行结果:

因为考虑到可能不是每次都能重启成功,所以将每次的请求结果储存为日志,方便遇到错误时进行错误定位
这里简单地用文本文件来储存就好了
日志测试脚本:

# 导入time模块
import time

# 优化格式化版本
nowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

with open('log.txt', 'a') as f:
    f.write('test!\t' + nowTime + '\n\n')

运行之后,与py文件同目录下出现一个log.txt文件,里面储存刚刚写入的系统时间

待测试完毕后,编写总的脚本,代码如下:

import time
import requests

# 延时1分钟执行
time.sleep(60)

# 重启路由器的api接口url
url = 'http://192.168.2.1/userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7'

# 用于身份验证的cookie
form_cookies = {'Authorization': 'xxx'}

# 用于欺骗路由器的请求来源地址
form_header = {'Referer': 'http://192.168.2.1/userRpm/SysRebootRpm.htm'}

# 执行post请求
r = requests.post(url, cookies=form_cookies, headers=form_header)

# 用于暂存请求结果的字符串
statusStr = ''

# 将请求结果存进字符串
if r.status_code == 200 and '操作成功' in r.text:
    statusStr = '路由器重启成功'
elif r.status_code == 200 and '403' in r.text:
    statusStr = 'Error403:身份验证失败'
else:
    statusStr = 'Error' + r.status_code + ':未知错误'

# 获取当前时间
nowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

# 储存日志文件
with open('E:\\Python\\rebootRouter\\log.txt', 'a') as f:
    f.write(nowTime + '\t' + statusStr + '\n\n')

5 开机自动运行重启脚本

参考资料

bat批处理执行python脚本:https://blog.csdn.net/barry_j/article/details/98079460
windows开机自动运行脚本和后台运行:https://blog.csdn.net/linxinfa/article/details/88633883

先创建一个bat批处理文件,用来执行重启路由器的py文件

然后将这个bat批处理文件复制到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp目录下

最终,电脑开机后,就会自动运行重启脚本,实现自动重启路由器

posted @ 2020-04-07 12:17  xiaowus  阅读(3757)  评论(0编辑  收藏  举报