通过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('<div class="pop_window_icon_help"></div>');
                $("#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!')

声明:Grows towards sunlight |版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 通过Python脚本实现电信天翼网关定时重启


Grows towards sunlight and Carpe Diem