通过Python脚本实现电信天翼网关定时重启
编写脚本实现定时重启天翼网关2021.8.10电信送的光猫长期使用，不重启性能堪忧，本文通过抓包分析，编写脚本实现定时重启网关拨号，优化网络质量。代码分析function realRestart() { showOrHidePopWindowFromIframe("hide"); //执行重启 (new XHR()).post('/cgi-bin/luci/admin/reboot', // Suroy: 异步请求，继续翻 { token: '37b37e2d5d79ec966ec035748f7981ce' }, // Suroy: 好家伙，真不把用户当外人的，淦！ function(x){ parent.location = "/cgi-bin/luci"; }); } function doRestart() { cleanPopWindowContent(); //填充内容 $("#pop_window_title").html("重启确认"); $("#pop_window_icon").html(' '); $("#pop_window_message").html("您真的要重启您的网关吗？"); //更改确认操作函数 var eid = document.getElementById("confirm"); eid.onclick = function() { realRestart() }; showOrHidePopWindow("show"); } this.post = function(url,data,callback) { this.reinit(); var xhr = this._xmlHttp; var code = this._encode(data); // Suroy: 关键代码，封装post数据，相关函数已经贴到下放 xhr.onreadystatechange = function() { if (xhr.readyState == 4) callback(xhr); } xhr.open('POST', url, true); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.send(code); } this._encode = function(obj) { obj = obj ? obj : { }; obj['_'] = Math.random(); // Suroy: 加了一个参数 _ 值是随机数，经测试不做校验可以随便填 if (typeof obj == 'object') { var code = ''; var self = this; for (var k in obj) code += (code ? '&' : '') + k + '=' + encodeURIComponent(obj[k]); return code; } return obj; }正片Python程序# -*- encoding:utf-8 -*- """ @author: @Suroy @site: https://suroy.cn/ @email: suroy@qq.com @time: 2021/8/12 10:48 上午 """ import requests, re # 登陆 def login(): url = "http://192.168.1.1/cgi-bin/luci" payload='username=useradmin&psd=xxxx' # 用户名密码 headers = { 'Host': '192.168.1.1', 'Content-Length': '28', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': '1', 'Origin': 'http://192.168.1.1', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Referer': 'http://192.168.1.1/cgi-bin/luci', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive' } try: response = requests.request("POST", url, headers=headers, data=payload, allow_redirects=False) # 禁止自动重定向,以便于获取cookies cookies = response.cookies cookie = requests.utils.dict_from_cookiejar(cookies) response = requests.request("POST", url, headers=headers, data=payload, cookies = cookie) except Exception as err: print('获取数据失败：\n{0}'.format(err)) # print(response.text) matchObj = re.search(r'([a-z]|[0-9]){32}', str(response.text)) if matchObj: return matchObj.group(), cookies['sysauth'] else: return False # 重启 def reboot(token, cookie): url = "http://192.168.1.1/cgi-bin/luci/admin/reboot" payload='token=' + str(token) + '&t=123' headers = { 'content-type': 'application/x-www-form-urlencoded', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': '1', 'Origin': 'http://192.168.1.1', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Referer': 'http://192.168.1.1/cgi-bin/luci', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Cookie': 'sysauth=' + str(cookie) } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) if __name__ == '__main__': token, cookie = login() reboot(token, cookie) print('Reboot Success!')