获取Ap终端接入信息的脚本

Zss 发表于:

工作中需要获取Ap的接入的sta的信息来测试最小snr值功能的准确性,所以写一个定时记录ap中的sta的信息依次来判断此功能的准确性

1.首先ap的web界面是需要登陆的,所以中间涉及到了cookies及token值

获取到这两个信息有几种办法,一种是使用selenium来操作浏览器模拟登陆,另外一种是使用requests来模拟请求获取

当然第一种的方式不需要分析请求的结构内容,比较方便,配合无头浏览器直接获取到,但是实际使用时速度比较慢

第二种方式就需要分析http中的请求,并且自己来构造这些请求来获取,相对来说速度很快,但是分析时较麻烦点,需要抓包,自己再构造包

且在我测试时发现中间登陆的时候是一个重定向的过程,所以一个不小心可能根本获取不到,下面这个就是取消重定向,因为requests会自动处理重定向的问题

rsp = requests.post(url=url,data=data,allow_redirects=False)

2.当我获取到cookies及其token后,意味着我已经模拟登陆成功了,之后可以使用cookies来做我想做的,也就是把cookies加入到请求中,去请求sta信息的接口

当获取到这个接口所返回的所有的sta信息,可以使用xpath来获取每个sta的信息,实际上每次的刷新的sta个数可能是会发生变化的,所以使用一个方法来解决

首先统计sta的总数,然后依次循环来获取每个sta的信息

 

#coding:gbk
import requests,time,os
from lxml import etree

class Ap_info():
    def login(self,ap_ip):
        url = 'http://%s/cgi-bin/luci'%(ap_ip)
        data = {
            'username':'admin',
            'password':'admin'
        }
        rsp = requests.post(url=url,data=data,allow_redirects=False)
        #print(rsp.headers['Set-Cookie'])
        cookie1 = rsp.headers['Set-Cookie']  #获取到cookies
        cookie = cookie1.split(';')
        sysauth = cookie[0]+';'+cookie[2].split(',')[1]         #获取到sysauth
        path = (cookie[1]+';'+cookie[2].split(',')[0])[6:]
        return (sysauth,path)

    def get_5g_sta_info(self,ap_ip,token,path):
        #print(token)
        url = 'http://%s%s/admin/status/radio1/assolist_refresh'%(ap_ip,token[1])
        headers = {
            'Cookie': '{}'.format(token[0]),
            'Host': '%s'%(ap_ip),
            'Proxy-Connection': 'keep-alive',
            'Referer': 'http://%s%s/admin/status/radio1/ap_assolist/'%(ap_ip,token[1])
        }
        rsp = requests.get(url=url,headers=headers)
        xml = etree.HTML(rsp.content)
        stanumber = xml.xpath('//*[@id="cbi-table-1-num_station"]/text()')   #获取sta的总数
        if stanumber == []:
            print('5G暂时没有sta接入')
            with open(path,'a+') as f:
                f.write('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> ')
                f.write('5G暂时没有sta接入'.format(str(stanumber[0])))
                f.write('\n')
        else:
            print('5G总共{}个终端接入'.format(str(stanumber[0])))
            with open(path,'a+') as f:
                f.write('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> ')
                f.write('5G总共{}个终端接入'.format(str(stanumber[0])))
                f.write('\n')
            for i in range(1,int(stanumber[0])+1):
                mac = xml.xpath('//*[@id="cbid.{}.sta_mac_address"]/text()'.format(str(i)))[0].strip()
                ip = xml.xpath('//*[@id="cbid.{}.sta_ip_address"]/text()'.format(str(i)))[0]
                snr = xml.xpath('//*[@id="cbid.{}.ap_received_sta_snr"]/text()'.format(str(i)))[0]
                rssi = xml.xpath('//*[@id="cbid.{}.rx_ss"]/text()'.format(str(i)))[0]
                info = 'NO.{}   Mac:{}  Ip:{}  Snr:{}   Rssi:{}'.format(i,mac,ip,snr,rssi)
                with open(path,'a+') as f:
                    f.write(info)
                    f.write('\n')
                print(info)

    def get_2g_sta_info(self,ap_ip,token,path):
        #print(token)
        url = 'http://%s%s/admin/status/radio0/assolist_refresh?_=0.4147148153134872'%(ap_ip,token[1])
        headers = {
            'Cookie': '{}'.format(token[0]),
            'Host': '%s'%(ap_ip),
            'Proxy-Connection': 'keep-alive',
            'Referer': 'http://%s%s/admin/status/radio0/ap_assolist/'%(ap_ip,token[1])
        }
        rsp = requests.get(url=url,headers=headers)
        xml = etree.HTML(rsp.content)
        stanumber = xml.xpath('//*[@id="cbi-table-1-num_station"]/text()')   #获取sta的总数
        if stanumber[0] == '0':
            print('2G暂时没有sta接入')
            with open(path,'a+') as f:
                f.write('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> ')
                f.write('2G暂时没有sta接入'.format(str(stanumber[0])))
                f.write('\n')
        else:
            print(stanumber)
            print('2G总共{}个终端接入'.format(str(stanumber[0])))
            with open(path,'a+') as f:
                f.write('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> ')
                f.write('2G总共{}个终端接入'.format(str(stanumber[0])))
                f.write('\n')
            for i in range(1,int(stanumber[0])+1):
                mac = xml.xpath('//*[@id="cbid.{}.sta_mac_address"]/text()'.format(str(i)))[0].strip()
                ip = xml.xpath('//*[@id="cbid.{}.sta_ip_address"]/text()'.format(str(i)))[0]
                snr = xml.xpath('//*[@id="cbid.{}.ap_received_sta_snr"]/text()'.format(str(i)))[0]
                rssi = xml.xpath('//*[@id="cbid.{}.rx_ss"]/text()'.format(str(i)))[0]
                info = 'NO.{}   Mac:{}  Ip:{}  Snr:{}   Rssi:{}'.format(i,mac,ip,snr,rssi)
                with open(path,'a+') as f:
                    f.write(info)
                    f.write('\n')
                print(info)

def new_folder():
    path = '%s\Sta_info'%(os.getcwd())
    if os.path.exists(path) == False:
        os.makedirs(path)
    else:pass
    path = path + '\sta_info_{}.log'.format(time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime()))
    return path

def main():
    ap = Ap_info()
    print('---------------------------------------------------------- ')
    print('     说明:STA信息将存放在脚本同一目录Sta_info文件夹下')
    print('       格式:Radio AP_IP地址 记录次数 刷新间隔时间 ')
    print('例:2.4 192.168.99.88 200 0.5  或者 5 192.168.99.88 10 1')
    print('             例:all 192.168.99.88 200 0.5')
    print('----------------------------------------------------------')
    args = raw_input('\n').split()
    file_path = new_folder()
    token = ap.login(args[1])
    if args[0] == '5':
        for i in range(1,int(args[2])+1):
            print('第{}次刷新   ---->>>   ---->>>  ---->>>'.format(str(i)))
            time.sleep(float(args[3]))
            ap.get_5g_sta_info(args[1],token,file_path,)
            print('\n')
    elif args[0] == '2.4':
        for i in range(1,int(args[2])+1):
            print('第{}次刷新   ---->>>   ---->>>  ---->>>'.format(str(i)))
            time.sleep(float(args[3]))
            ap.get_2g_sta_info(args[1],token,file_path,)
            print('\n')
    elif args[0] == 'all':
        for i in range(1,int(args[2])+1):
            print('第{}次刷新   ---->>>   ---->>>  ---->>>'.format(str(i)))
            print('----------   2.4   --------')
            time.sleep(float(args[3]))
            ap.get_2g_sta_info(args[1],token,file_path,)
            print('----------    5    --------')
            ap.get_5g_sta_info(args[1],token,file_path,)
            print('\n')
if __name__ == '__main__':
    main()