from selenium import webdriver #导入selenium模块 from selenium.webdriver.common.by import By import time,os,json,os.path import pyinputplus as pyip #第三方包,为输入验证 from pathlib import Path from ansilib import ansi #这个模块可以省略(我自己写的一个函数) import hashlib #哈希加密 import shelve #二进制变量保存
1.第三方包的导入(需要先下载):在Windows的终端中输入以下代码
pip install pyinputplus,selenium
2.解释不同的包:
(1)selenium模块可让Python直接控制浏览器 (2)from selenium.webdriver.common.by import By 因为会从BY中去查找Webdriver对象中的属性(此代码是查找ID,因为ID属性具有唯一性) (3)json模块用来保存账号,密码(被加密过的密码),os.path模块中的getsize()方法来获取文件是否为空,若为空返回0,否则大于0 (4)pyinputplus模块用于输入验证(其实可用input代替)
二.功能实现
1.清屏操作:(适用于Windows系统,Linux和Macos系统将cls改为clear)
os.system("cls")
2.输入账号密码函数 user_name_password():会存在返回值,返回一个列表,包含你的id和密码
def user_name_password():#输入账号密码 user_id=pyip.inputInt(prompt="请输入你的用户名:") #pyip.inputInt()为pyinputplus内的一个输入验证函数,具体是只允许用户输入数字为用户名,若不是 #纯数字会让用户重新输入 user_password=pyip.inputStr(prompt="请输入你的密 码:") #pyip.inputStr()为输入字符串 user_massage=[user_id,user_password] return user_massage
3.加密密码函数 password_hexdigest(Password):采用了md5加密: md5加密网站:MD5在线加密/解密/破解—MD5在线 (sojson.com) 使用了hashlib中的md5加密方式,参数Password为你输入的密码
def password_hexdigest(Password):#md5加密 md5=hashlib.md5()#创建md5对象 Password_user=Password.encode(encoding="utf-8")#格式转化 md5.update(Password_user)#给入加密参数 userPassword=md5.hexdigest()#加密 password=[Password,userPassword] return password
4.保存和读取原来的密码函数:使用了shelve模块,因为我拿json文件来保存用户的id和密码,可以直接被点开查看,为了加强隐私,我就将真实密码使用二进制来保存,而你在json文件中看到的密码是经过md5加密后的,如果不需要加密可以看后面的源代码(简单的和复杂的)
def save_password(password):#保存原来真实的密码(二进制) shelffile=shelve.open("mm") # 相当于open()方法,返回了一个shelffile对象,没有就会创建三个文件(三个后缀名不一样的) #里面得数据为二进制数据 shelffile["password"]=password # shelve的对象类似与python中的字典和列表关系,这里采用了字典,shelffile["password"]中的 # password为键,后面的为输入的参数(为键password的值),此时数据转换成了二进制 shelffile.close() def read_password():#读取原来真实的密码 shelffile=shelve.open("mm") password=shelffile["password"] shelffile.close() return password
5.判断账号是否存在函数 user_exist():json,pathlib模块
def user_exist():#判断账号是否存在 with open("user.json","a",encoding="utf-8"): path=Path("user.json") pass #第一个打开user.json文件是以追加模式打开,如果文件不存在就创建,创建的文件为空 if os.path.getsize(path)==0: #判断文件是否为空,若为空执行下面操作 with open("user.json","w",encoding="utf-8") as fp: json.dump([],fp) #打开这个json文件,给这个文件加一个空列表进去(用来保存用户信息的列表,列表的元素为字典) id,Password=user_name_password()#调用了输入用户信息函数 password1,password2=password_hexdigest(Password)#1为未加密的密码,2为加密后的密码 save_password(password1)#保存真实密码 user={ f'{id}':f'{password2}', } user_list=[user] with open("user.json","w",encoding="utf-8") as fp: json.dump(user_list,fp) #将用户信息写入json文件中 with open("user.json","r",encoding="utf-8") as fp: list_dictionary=json.loads(fp.read()) dictionary=list_dictionary[0] #读取json文件中的数据 password1=read_password()#从shelve保存的二进制文件中得到真实密码 for i in dictionary.keys(): User=[i,password1] return User#返回一个id和真实密码的列表
6.登录用户函数 simulate(id,Password):使用selenium模块(爬虫)
里面ID所对应的数据均来源登录界面的抓包,如图为用户名属性ID对应的值为username
def simulate(id,Password):#模拟浏览器登录校园网 #不直接退出浏览器的方法 # option=webdriver.EdgeOptions() # option.add_experimental_option("detach",True) # browser=webdriver.Edge(options=option) #直接退出浏览器 browser=webdriver.Edge()#获得一个Webdriver对象(Edge为我的浏览器,跟据你的浏览器修改) browser.get("http://172.30.21.100/tpl/whut/login.html?acip=172.30.1.223&acname=WHUT-Bras-ME60-A&ip=10.84.131.112&nasId=52&userip=10.84.131.112&wlanacname=") #打开用户登录界面browser.get() #根据标签By.ID(找到<input>中去了)去查找ID的值value(即元素),返回一个WebElement对象,这个对象有一个click()方法,模拟鼠标在该元素上单击,Webdrive对象中的find_element()方法意思是在网页的源码中去查找属性 #ID具有唯一性 user_name=browser.find_element(by=By.ID,value="username") password=browser.find_element(by=By.ID,value="password") btn=browser.find_element(By.ID,"login-account") #给Web页面的文本字段发送按键事件信息。找到那个文本字段的<input>元素,send_keys("")方法为输入的按键消息 user_name.send_keys(id) password.send_keys(Password) #模拟单击(webelement的方法) btn.click() browser.close()
7.main函数和运行:
ansi.text_color(31),print("登录成功"),ansi.text_reset()的作用只是将输出的 登录成功字样变色,如果不需要直接删除ansi的这两个函数
def main(): user_massage=user_exist() id,Password=user_massage simulate(id,Password) os.system("cls") ansi.text_color(31) print("登录成功") ansi.text_reset() time.sleep(1) quit() if __name__=="__main__": main()
三.源代码
1.简单的
方法比较简单
from selenium import webdriver from selenium.webdriver.common.by import By import time,os os.system("cls") browser=webdriver.Edge() browser.get("http://172.30.21.100/tpl/whut/login.html?acip=172.30.1.223&acname=WHUT-Bras-ME60-A&ip=10.84.131.112&nasId=52&userip=10.84.131.112&wlanacname=") user_name=browser.find_element(by=By.ID,value="username") password=browser.find_element(by=By.ID,value="password") btn=browser.find_element(By.ID,"login-account") #输入你的用户名和密码,直接将下面的**改掉 user_name.send_keys("********") password.send_keys("*********") btn.click() time.sleep(2) browser.close()
2.复杂的
有个缺点:账号密码不能输入错误(只有第一次运行需要输入账号和密码),如果输入错误会一直登录不上,解决办法就是把运行代码产生的四个文件删除,再运行代码,重新输入即可
from selenium import webdriver from selenium.webdriver.common.by import By import time,os,json,os.path import pyinputplus as pyip from pathlib import Path from ansilib import ansi import hashlib import shelve os.system("cls") def user_name_password():#输入账号密码 user_id=pyip.inputInt(prompt="请输入你的用户名:") user_password=pyip.inputStr(prompt="请输入你的密 码:") user_massage=[user_id,user_password] return user_massage def password_hexdigest(Password):#md5加密 md5=hashlib.md5()#创建md5对象 Password_user=Password.encode(encoding="utf-8")#格式转化 md5.update(Password_user)#给入加密参数 userPassword=md5.hexdigest()#加密 password=[Password,userPassword] return password def save_password(password):#保存原来真实的密码(二进制) shelffile=shelve.open("mm") shelffile["password"]=password shelffile.close() def read_password():#读取原来真实的密码 shelffile=shelve.open("mm") password=shelffile["password"] shelffile.close() return password def user_exist():#判断账号是否存在 with open("user.json","a",encoding="utf-8"): path=Path("user.json") pass if os.path.getsize(path)==0: with open("user.json","w",encoding="utf-8") as fp: json.dump([],fp) id,Password=user_name_password() password1,password2=password_hexdigest(Password)#1为未加密的,2为加密后的密码 save_password(password1) user={ f'{id}':f'{password2}', } user_list=[user] with open("user.json","w",encoding="utf-8") as fp: json.dump(user_list,fp) with open("user.json","r",encoding="utf-8") as fp: list_dictionary=json.loads(fp.read()) dictionary=list_dictionary[0] password1=read_password() for i in dictionary.keys(): User=[i,password1] return User def simulate(id,Password):#模拟浏览器登录校园网 #不直接退出浏览器的方法 # option=webdriver.EdgeOptions() # option.add_experimental_option("detach",True) # browser=webdriver.Edge(options=option) browser=webdriver.Edge()#直接退出浏览器 browser.get("http://172.30.21.100/tpl/whut/login.html?acip=172.30.1.223&acname=WHUT-Bras-ME60-A&ip=10.84.131.112&nasId=52&userip=10.84.131.112&wlanacname=") #根据标签By.ID(找到<input>中去了)去查找ID的值value(即元素),返回一个WebElement对象,这个对象有一个click()方法,模拟鼠标在该元素上单击 #ID具有唯一性 user_name=browser.find_element(by=By.ID,value="username") password=browser.find_element(by=By.ID,value="password") btn=browser.find_element(By.ID,"login-account") #给Web页面的文本字段发送按键事件信息。找到那个文本字段的<input>元素,send_keys("")方法为输入的按键消息 user_name.send_keys(id) password.send_keys(Password) #模拟单击(webelement方法) btn.click() browser.close() def main(): user_massage=user_exist() id,Password=user_massage simulate(id,Password) os.system("cls") ansi.text_color(31) print("登录成功") ansi.text_reset() time.sleep(1) quit() if __name__=="__main__": main()
可以使用pyinstaller模块(需要使用pip下载)生成可执行文件 .exe,类似小软件
pyinstaller -onefile ****.py # **为你这个python文件的文件名
版权归原作者 CranGG 所有, 如有侵权,请联系我们删除。