利⽤pythonselenium+cv2破解qq空间登录滑动验证码(⽆法
获得完整图情况)(上)
之前动⼿⽤python写了⼀个qq空间⾃动点赞的脚本,登录⽅法采⽤的是selenium获取⽹页截图然后返回⼆维码截图,⽤⼿机qq扫⼀扫进⾏登录.
然后⼜⽤flask简单的写成了⽹页,放到了⾃⼰的服务器上,这样每次只需要输⼊⽹址就会弹出⼆维码,⼿机qq扫⼀扫便可以登录,⼗分⽅便.
但由于qq空间的机制,cookie有效期为48⼩时.因此就必须每两天进⾏⼀次登录(有邮箱提醒).虽然还算⽐较⽅便,但是对于程序猿来说这些还不够完美.
以上为另⼀种思路,供⼤家参考,接下来我将讲述我如何利⽤cv2实现破解滑动验证码
1.⾸先,下载cv2库
根据python官⽅⽂档
我选择了
pip install opencv-contrib-python
2.通过selenium获取⼀定数量的验证码,看看有没有共同的规律
直接放代码,但我不知道为什么每次只能获取4次,然后就停⽌了.可能是tx的某种反爬侦测.
selenium怎么使用from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import requests
url='i.qq/'
username=123456789#其实内容⽆所谓因为不滑动验证码是不会post账号密码的
password=123456789
opt=Options()
opt.add_argument('--headless')
driver=webdriver.Chrome(chrome_options=opt)
i=13
while i<30:
<(url)
login_frame=driver.find_element_by_id('login_frame')
driver.switch_to_frame(login_frame)
driver.find_element_by_xpath('/html/body/div[1]/div[9]/a[1]').click()
nameI=driver.find_element_by_xpath('/html/body/div[1]/div[5]/div/div[1]/div[3]/form/div[1]/div/input').send_keys(username) pwdI=driver.find_element_by_xpath('/html/body/div[1]/div[5]/div/div[1]/div[3]/form/div[2]/div[1]/input').send_keys(password) submit=driver.find_element_by_xpath('/html/body/div[1]/div[5]/div/div[1]/div[3]/form/div[4]/a/input').click()
time.sleep(1)
frame=driver.find_element_by_id('tcaptcha_iframe')
driver.switch_to_frame(frame)
imgUse=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[1]/div[2]/img').get_attribute('src')
imgNeed=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[1]/div[3]/img').get_attribute('src')
(imgUse)
(imgNeed)
t
t
with open('E:/Download/qq空间滑动验证码/'+str(i)+'.jpg','wb') as f:
f.write(imgU)
with open('E:/Download/qq空间滑动验证码/'+str(i)+'s.jpg','wb') as f:
f.write(imgN)
i+=1
这些就是我获得到的图⽚和⼩⽅块
放⼤观看每⼀张图
会发现每个图⽚的拼图部分都有⼀个⽩边
这就给了我们定位的好⽅法
3.利⽤cv库根据轮廓来分出拼图的位置----根据阈值转化成⼆值化图⽤到函数有
cv2.imread(⽂件file,标记)
标记:1是彩⾊,0是灰度
cv2.namedWindow(窗⼝名,窗⼝模式)
窗⼝模式:cv2.WINDOW_AUTOSIZE(⾃动⼤⼩),cv2.WINDOW_NORMAL(⼿动⼤⼩)
cv2.imshow(窗⼝名,图⽚变量名)
字⾯意思,不解释
cv2.waitKey(毫秒)
没有这⾏的话会闪过去
cv2.threshold (图⽚变量名, 阈值, 填充⾊, 填充⽅法)
源图⽚必须是单通道,所以刚开始的ad()要加参数0,表⽰读取灰度图
阈值在0~255之间,我不了解阈值的⼤⼩,所以进⾏了⼀番不同阈值的显⽰测试
填充⾊即字⾯意思
填充⽅法见下⾯链接⼤神的博客,我先给出截图
需要注意的是返回值是两个,需要⽤两个变量来接收
简单的利⽤代码看了不同阈值下的成果(ps⾃⼰也初学cv,没研究怎么⼀起显⽰)
import cv2
for i in range(1,9):
img=cv2.imread('./jpg/'+str(i)+'.jpg',0)#0为灰度图,注意路径,我设置的是程序所在⽬录的⼦⽂件夹 re,img1=cv2.threshold(img,95,255,0)#返回了两个值,但我们⽤不上第⼀个返回值
re,img2=cv2.threshold(img,150,255,0)
re,img3=cv2.threshold(img,220,255,0)
re,img4=cv2.threshold(img,240,255,0)
re,img5=cv2.threshold(img,250,255,0)
re,img6=cv2.threshold(img,260,255,0)
cv2.namedWindow('img',cv2.WINDOW_AUTOSIZE)
cv2.imshow('img',img1)
cv2.waitKey(0)#不加这个的话会⼀闪⽽逝
cv2.imshow('img',img2)
cv2.waitKey(0)
cv2.imshow('img',img3)
cv2.waitKey(0)
cv2.imshow('img',img4)
cv2.waitKey(0)
cv2.imshow('img',img5)
cv2.waitKey(0)
cv2.imshow('img',img6)
cv2.waitKey(0)
效果如下
95
150
220
240
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论