之前动手用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)

效果如下

95

150

220

240

250

260

需要注意的是,接下来我们要使用的轮廓,只会找连续的颜色,因此阈值设置太高的话,线条不连续,会检测不到

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_TREEcv2.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)

但是单纯的画轮廓,每张图都检测到了几百个轮廓,这可不行

随便某一个轮廓

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空间登录滑动验证码(无法获得完整图情况)(上)相关推荐

  1. python自动下载qq文件夹_GitHub - 1061700625/QQZone_AutoDownload_Album: Python+selenium 自动下载QQ空间相册...

    QQZone_AutoDownload_Album Python+selenium 自动下载QQ空间相册 . selenium_firefox.zip 需要解压后放在同路径下 . 貌似腾讯的登陆加密做 ...

  2. python爬取加密qq空间_使用python+selenium爬取qq空间好友动态

    使用python+selenium爬取qq空间好友动态 分析过程如下: 要想用selenium登陆qq空间,必须点击账号密码登陆按钮然后再填写账号密码登陆. 1.PNG 点击账号密码按钮后跳转到如下页 ...

  3. python截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)

    对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...

  4. 使用java + selenium + OpenCV破解网易易盾滑动验证码

    使用java + selenium + OpenCV破解网易易盾滑动验证码 网易易盾:dun.163.com * 验证码地址:https://dun.163.com/trial/jigsaw * 使用 ...

  5. 无聊日常--python+selenium+chromedriver 实现QQ空间评论自动删除

    博客内容用于技术交流学习,读者通过学习本博客内容后进行的任何违法违规操作与本人无关,特此声明. 我最初有写这个项目的想法是在18年11月底(好像是),当时我们学校的表白墙遭到了麦片的账号骚扰--不断在 ...

  6. python selenium截图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...

    对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...

  7. python selenium爬取QQ空间说说

    准备工作 安装selenium, pyquery, json模块. 使用的是火狐浏览器,所以还要安装geckodriver, 下载好后,把geckodirver.exe文件放在python.exe同一 ...

  8. python如何截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...

    对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...

  9. python整合selenium爬取QQ空间访客记录

    利用周末放假两天时间写了个QQ空间访客记录的爬虫,在这里分享出来:本文将会把要做的步骤都列出来,一步一步的实现这个爬虫程序. 特别注明: 本程序仅供学习交流目的 请勿用于不可描述的事情 爬取过程中需要 ...

  10. selenium进行QQ空间登录

    一.selenium简要说明 selenium是基于浏览器自动化的一个模块,它能便捷的获取网站中动态加载的数据,和实现模拟登录.爬虫等操作 二.实现流程 2.1 selenium前置操作 1. 安装s ...

最新文章

  1. mysql5.1.6安装_mysql 5.1.6的安装启动
  2. 基于android的智能风扇,新锡德尔对基于Android的静电式智能空气净化器系统设计...
  3. iphone查看删除的短信_iPhone12发布!刚买的苹果手机短信全部消失了怎么办?
  4. Dev C++安装第三方库boost
  5. MySql和Oracle数据库的区别?
  6. 系统架构(1)---单机至亿级流量大型网站系统架构演进
  7. java编码gbk的不可_解决 java “错误:编码GBK 的不可映射字符”
  8. python第6天作业
  9. UVA489 Hangman Judge【模拟】
  10. DaisyDisk for Mac(磁盘清理软件)
  11. OS开发 touch事件的优先级和事件传递
  12. [JAVA学习] JDK与JRE的区别
  13. PYTHON实现迅雷、FLASHGET、QQ旋风转真实链接、磁链转种子文件、迅雷快传链接抓取
  14. 百度网盘如何在线播放电影?
  15. Python查询物理机硬盘、主板、BIOS序列号(用于认证Windows设备)
  16. 多文件在线压缩并下载
  17. linux下载大文件失败,Linux下FTP/SFTP传输大文件总是失败的处理办法
  18. CCF-CSP认证历年真题解(100分)
  19. vue-cli2.x统一配置接口请求地址和开发环境的跨域代理
  20. 共享经济:团队共享VS个体共享

热门文章

  1. 联想 M7600d 激光一体机清零方法
  2. 2020年IPTV系统解决方案应该注意哪些问题?
  3. elementUI + echar 实现饼图效果
  4. c语言窗口炸弹代码,C语言实现宾果消消乐.pdf
  5. 黑客炸弹弹窗假装自己是黑客
  6. 基于python的人脸识别开题报告怎么写_开题报告-人脸识别系统的研究与实现
  7. python实现多人脸识别
  8. notepad html 自动格式化代码,notepad++格式化html代码
  9. ppt插入计算机时间,WPS之PPT插入自动更新的时间设置
  10. react中一个音频或视频播放的时候其他音视频暂停播放