记录 制作校园网登陆脚本 python编写 附源码

‘’‘

首先我们分析一下

  1.需要本机的IP

    使用 socket 获取

  2.需要向服务器提交的数据

    构造请求数据 并分析数据可替换

  3.检测登陆成功

    检测登陆是否成功

’‘’

获取IP  这样会返回 本机IP

    def get_ip(self):
try:
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('8.8.8.8',80))
ip = s.getsockname()[0]
finally:
#关闭
s.close()
#返回IP
return ip

构造请求体

         b_data = {
'DDDDD':',0,'+us+codeinfo,
'upass':pa,
'para':'',
'0MKKey':'' } 9       #关于发送的请求内容 可以使用浏览器 F12 进行查看发送的数据信息

向服务器发送请求

        headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36',
'Upgrade-Insecure-Requests': '',
}
      #data为请求体 ip 为本机ip
url = requests.post('http://172.16.1.38:801/eportal/?c=ACSetting&a=Login&protocol=http:&hostname=172.16.1.38&iTermType=1&wlanuserip={}&wlanacip=null&wlanacname=null&mac=00-00-00-00-00-00&ip={}&enAdvert=0&queryACIP=0&jsVersion=2.4.3&loginMethod=1'.format(ip,ip),headers=headers,data=data)

#这样是一个简单的发送请求   但是如果别人想用的话每次更改不会很麻烦嘛?

更改后的全部源码  1 import requests  2  3 import socket  4

 import os
import re class AOA(object):
#获取本机IP
def get_ip(self):
try:
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('8.8.8.8',80))
ip = s.getsockname()[0]
finally:
#关闭
s.close()
#返回IP
return ip def open_msg(self,path_dirs):
'''
获取外部的text 文档 的账号密码
:return:
'''
if 'login_msg' in os.listdir(path_dirs): #如果login_msg文件 有的话 会 跳过 【如果登陆过一次的话 会生成文件】
pass
else:                      #没有login_msg文件的话 证明为第一次登陆
username = input('请输入账号')
password = input('请输入密码')
code = input('请选择运营商 1 = 移动 | 2 = 电信 | 3 = 联通')
print('正在进行保存')
with open('login_msg','w+',encoding='utf8') as o:
o.write('账号={},\r密码={},\r运营商={},\r#注意不要有空格'.format(username,password,code))  #进行保存文件处理 with open(os.path.join(path_dirs,'login_msg'),'r+',encoding='utf8') as f :    #打开文件

#获取文件的账号密码和运行商
          text = f.read()
username = re.findall(r'账号=(\d{10}),',text)[0] if re.findall(r'账号=(\d{10}),',text) else print('账号获取错误')
password = re.findall(r'密码=(.*?),',text)[0] if re.findall(r'密码=(.*?),',text) else print('密码获取错误')
login_code =re.findall(r'运营商=([1-3]),',text)[0] if re.findall(r'运营商=(.*?),',text)[0] else print('运营商获取错误')
msg = {
'username':username,
'password':password,
'login_code':login_code,
}
return msg    #形成字典形式返回数据 def extract_data(self,user_data):    #使数据进行组合处理
#拿出账号密码
us = user_data.get('username') #账号
pa = user_data.get('password') #密码
code = int(user_data.get("login_code")) #获取的为整数类型 if code == 1 :
codeinfo = "@cmcc" #移动
elif code == 2 :
codeinfo = "@telecom" #电信
elif code == 3:
codeinfo = "@unicom" #联通
else:
raise '请输入正确的'
b_data = {
'DDDDD':',0,'+us+codeinfo,
'upass':pa,
'para':'',
'0MKKey':'' }
return b_data
                #进行登陆处理
def login(self,data,ip): headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36',
'Upgrade-Insecure-Requests': '',
}
url = requests.post('http://172.16.1.38:801/eportal/?c=ACSetting&a=Login&protocol=http:&hostname=172.16.1.38&iTermType=1&wlanuserip={}&wlanacip=null&wlanacname=null&mac=00-00-00-00-00-00&ip={}&enAdvert=0&queryACIP=0&jsVersion=2.4.3&loginMethod=1'.format(ip,ip),headers=headers,data=data) def if_get(self):
code = requests.get('http://www.baidu.com')
if code.status_code ==200:
print('登陆成功')
else:
print('登陆失败') def main(self,):
#获取路径
LOCAL_PATH = os.path.abspath('')
ip = self.get_ip() #获取本机IP
user_data_str = self.open_msg(path_dirs=LOCAL_PATH) #获取账号密码信息 不做判断 和 数据整合
header_text = self.extract_data(user_data_str) #进行数据整合
self.login(data=header_text,ip=ip)
self.if_get() j = AOA()
j.main()
上一篇:Keil下载文件遇见Coterx M not found错误


下一篇:navicat的简单使用