水星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目錄下

最終,電腦開機后,就會自動運行重啟腳本,實現自動重啟路由器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM