利用python selenium+cv2破解qq空间登录滑动验证码(无法获得完整图情况)(上)
之前动手用python写了一个qq空间自动点赞的脚本,登录方法采用的是selenium获取网页截图然后返回二维码截图,用手机qq扫一扫进行登录.
然后又用flask简单的写成了网页,放到了自己的服务器上,这样每次只需要输入网址就会弹出二维码,手机qq扫一扫便可以登录,十分方便.
但由于qq空间的机制,cookie有效期为48小时.因此就必须每两天进行一次登录(有邮箱提醒).虽然还算比较方便,但是对于程序猿来说这些还不够完美.
以上为另一种思路,供大家参考,接下来我将讲述我如何利用cv2实现破解滑动验证码
1.首先,下载cv2库
根据python官方文档
我选择了
pip install opencv-contrib-python
2.通过selenium获取一定数量的验证码,看看有没有共同的规律
直接放代码,但我不知道为什么每次只能获取4次,然后就停止了.可能是tx的某种反爬侦测.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import requestsurl='https://i.qq.com/'
username=123456789#其实内容无所谓因为不滑动验证码是不会post账号密码的
password=123456789opt=Options()
opt.add_argument('--headless')
driver=webdriver.Chrome(chrome_options=opt)
i=13
while i<30:driver.get(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')imgU=requests.get(imgUse)imgN=requests.get(imgNeed)imgU=imgU.contentimgN=imgN.contentwith 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 (图片变量名, 阈值, 填充色, 填充方法)
源图片必须是单通道,所以刚开始的cv2.read()要加参数0,表示读取灰度图
阈值在0~255之间,我不了解阈值的大小,所以进行了一番不同阈值的显示测试
填充色即字面意思
填充方法见下面链接大神的博客,我先给出截图
需要注意的是返回值是两个,需要用两个变量来接收
另一位大神关于cv阈值的简单解释
简单的利用代码看了不同阈值下的成果(ps自己也初学cv,没研究怎么一起显示)
import cv2for 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)
效果如下
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
需要注意的是,接下来我们要使用的轮廓,只会找连续的颜色,因此阈值设置太高的话,线条不连续,会检测不到
4.获得轮廓
用到的新的函数有
cv2.findContours(图片变量(二值图),轮廓的检索模式,轮廓的近似办法)
图片变量要二值图,这也是为什么在第三步需要用到阈值
轮廓的检索模式有四种:
cv2.RETR_EXTERNAL只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE建立一个等级树结构的轮廓。
轮廓的近似方法(部分):
cv2.CHAIN_APPROX_NONE存储所有的轮廓点(占内存)
cv2.CHAIN_APPROX_SIMPLE只保留终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息(省内存)
咱们采用cv2.RETR_TREE和cv2.CHAIN_APPROX_NONE
注意!!!
报错:too many values to unpack说明你接收用的变量数量不对
cv2.findContours函数的返回值有过很多变化
openCV2.0版本返回值有两个
openCV3.0版本返回值有三个
openCV4.0版本返回值又变成了只有两个
我使用4.0版本,因此返回值是 轮廓,轮廓的索引
其中轮廓是一个list,索引是个高级的东西.我也不知道是啥反正用不上
cv2.drawContours(图片变量(三通道), 轮廓, 第几个轮廓,颜色, 线宽度)
图片变量要三通道图,不过后来试了下灰度图也不报错了,但是灰度图不方便观察轮廓线,还是推荐三通道图
轮廓就是之前获得的那个list
第几个轮廓是个int类型的变量,-1代表所有轮廓一起加载
颜色可以是个元组,如(255,0,0)表示蓝色.或者直接int类型的255也是蓝色
线宽度,字面意思,-1表示填充模式(不懂)
import cv2for i in range(1,9):img=cv2.imread('./jpg/'+str(i)+'.jpg',0)re,img1=cv2.threshold(img,125,255,0)cv2.namedWindow('img',cv2.WINDOW_AUTOSIZE)cv2.imshow('img',img1)contours,b=cv2.findContours(img1.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)cv2.waitKey(0)for j in range(0,len(contours)-1):image=cv2.imread('./jpg/'+str(i)+'.jpg',1)#获取三通道图image=cv2.drawContours(image, contours, j, 255, 3)#绘制轮廓cv2.imshow('img',image)cv2.waitKey(0)
但是单纯的画轮廓,每张图都检测到了几百个轮廓,这可不行
![](/assets/blank.gif)
5.轮廓的筛选
以下是看云上的openCV-Python中文教程节选片段
openCV-Python中文教程
首先,我们可以根据轮廓面积进行筛选
经过我的测试,正常的拼图面积在6000-8000之间
因此,咱们先这样
import cv2for i in range(1,9):img=cv2.imread('./jpg/'+str(i)+'.jpg',0)re,img1=cv2.threshold(img,125,255,0)cv2.namedWindow('img',cv2.WINDOW_AUTOSIZE)cv2.imshow('img',img1)contours,b=cv2.findContours(img1.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)cv2.waitKey(0)for j in range(0,len(contours)-1):area=cv2.contourArea(contours[j])if area<6000 or area>8000:continueprint(area)image=cv2.imread('./jpg/'+str(i)+'.jpg',1)image=cv2.drawContours(image, contours, j, 255, 3)#绘制轮廓cv2.imshow('img',image)cv2.waitKey(0)
这样基本就筛选出了准确的图案
但光有面积是不够的,你会发现这样的情况
这个图案的面积是7385.5,也在我们的筛选范围内
因此第二步,我们要根据图案的重心位置来进行进一步判断
根据我的测试,拼图出现的位置只在后方,即x坐标大于500的地方
因此,代码改写如下
import cv2for i in range(1,9):img=cv2.imread('./jpg/'+str(i)+'.jpg',0)re,img1=cv2.threshold(img,125,255,0)cv2.namedWindow('img',cv2.WINDOW_AUTOSIZE)cv2.imshow('img',img1)contours,b=cv2.findContours(img1.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)cv2.waitKey(0)for j in range(0,len(contours)-1):M = cv2.moments(contours[j]) # 计算第一条轮廓的各阶矩,字典形式try:#防止分母等于0报错center_x = int(M["m10"] / M["m00"])center_y = int(M["m01"] / M["m00"])except:continue#如果分母等于0,那一定不是我们的目标,因此可以直接跳过当前循环area=cv2.contourArea(contours[j])if area<6000 or area>8000 or center_x<500:continueprint(area)print(center_x)image=cv2.imread('./jpg/'+str(i)+'.jpg',1)image=cv2.drawContours(image, contours, j, 255, 3)#绘制轮廓image=cv2.circle(image, (center_x, center_y), 7, 128, -1)#绘制中心点cv2.imshow('img',image)cv2.waitKey(0)
至此,我们已经可以准确的定位到拼图的位置,接下来需要的就是计算出需要移动的距离,以及selenium模拟人的操作
我会整理下我的代码全部放到porn啊不是,全部放到github上。地址在这里:qq空间自动点赞
利用python selenium+cv2破解qq空间登录滑动验证码(无法获得完整图情况)(上)相关推荐
- python自动下载qq文件夹_GitHub - 1061700625/QQZone_AutoDownload_Album: Python+selenium 自动下载QQ空间相册...
QQZone_AutoDownload_Album Python+selenium 自动下载QQ空间相册 . selenium_firefox.zip 需要解压后放在同路径下 . 貌似腾讯的登陆加密做 ...
- python爬取加密qq空间_使用python+selenium爬取qq空间好友动态
使用python+selenium爬取qq空间好友动态 分析过程如下: 要想用selenium登陆qq空间,必须点击账号密码登陆按钮然后再填写账号密码登陆. 1.PNG 点击账号密码按钮后跳转到如下页 ...
- python截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)
对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...
- 使用java + selenium + OpenCV破解网易易盾滑动验证码
使用java + selenium + OpenCV破解网易易盾滑动验证码 网易易盾:dun.163.com * 验证码地址:https://dun.163.com/trial/jigsaw * 使用 ...
- 无聊日常--python+selenium+chromedriver 实现QQ空间评论自动删除
博客内容用于技术交流学习,读者通过学习本博客内容后进行的任何违法违规操作与本人无关,特此声明. 我最初有写这个项目的想法是在18年11月底(好像是),当时我们学校的表白墙遭到了麦片的账号骚扰--不断在 ...
- python selenium截图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...
对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...
- python selenium爬取QQ空间说说
准备工作 安装selenium, pyquery, json模块. 使用的是火狐浏览器,所以还要安装geckodriver, 下载好后,把geckodirver.exe文件放在python.exe同一 ...
- python如何截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...
对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...
- python整合selenium爬取QQ空间访客记录
利用周末放假两天时间写了个QQ空间访客记录的爬虫,在这里分享出来:本文将会把要做的步骤都列出来,一步一步的实现这个爬虫程序. 特别注明: 本程序仅供学习交流目的 请勿用于不可描述的事情 爬取过程中需要 ...
- selenium进行QQ空间登录
一.selenium简要说明 selenium是基于浏览器自动化的一个模块,它能便捷的获取网站中动态加载的数据,和实现模拟登录.爬虫等操作 二.实现流程 2.1 selenium前置操作 1. 安装s ...
最新文章
- mysql5.1.6安装_mysql 5.1.6的安装启动
- 基于android的智能风扇,新锡德尔对基于Android的静电式智能空气净化器系统设计...
- iphone查看删除的短信_iPhone12发布!刚买的苹果手机短信全部消失了怎么办?
- Dev C++安装第三方库boost
- MySql和Oracle数据库的区别?
- 系统架构(1)---单机至亿级流量大型网站系统架构演进
- java编码gbk的不可_解决 java “错误:编码GBK 的不可映射字符”
- python第6天作业
- UVA489 Hangman Judge【模拟】
- DaisyDisk for Mac(磁盘清理软件)
- OS开发 touch事件的优先级和事件传递
- [JAVA学习] JDK与JRE的区别
- PYTHON实现迅雷、FLASHGET、QQ旋风转真实链接、磁链转种子文件、迅雷快传链接抓取
- 百度网盘如何在线播放电影?
- Python查询物理机硬盘、主板、BIOS序列号(用于认证Windows设备)
- 多文件在线压缩并下载
- linux下载大文件失败,Linux下FTP/SFTP传输大文件总是失败的处理办法
- CCF-CSP认证历年真题解(100分)
- vue-cli2.x统一配置接口请求地址和开发环境的跨域代理
- 共享经济:团队共享VS个体共享
热门文章
- 联想 M7600d 激光一体机清零方法
- 2020年IPTV系统解决方案应该注意哪些问题?
- elementUI + echar 实现饼图效果
- c语言窗口炸弹代码,C语言实现宾果消消乐.pdf
- 黑客炸弹弹窗假装自己是黑客
- 基于python的人脸识别开题报告怎么写_开题报告-人脸识别系统的研究与实现
- python实现多人脸识别
- notepad html 自动格式化代码,notepad++格式化html代码
- ppt插入计算机时间,WPS之PPT插入自动更新的时间设置
- react中一个音频或视频播放的时候其他音视频暂停播放