python 识别滑块验证码
博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html
# -*- coding: utf-8 -*-
# https://gov.pkulaw.cn/1. import io
2. import json
3. from pathlib import Path
4. from PIL import Image
5. import base64
6. import cv2
7. import time
8. import requests
9. sess = requests.session()11. class SlideCrack(object):
12. def __init__(self, front, bg, out=None):
13. """
14. init code
15. :param front: 缺口图片
16. :param bg: 背景图片
17. :param out: 输出图片
18. """
19. self.front = front
20. self.bg = bg
21. self.out = out25. @staticmethod
26. def clear_white(img):
27. # 清除图片的空白区域,这里主要清除滑块的空白
28. img = cv2.imread(img)
29. rows, cols, channel = img.shape
30. min_x = 255
31. min_y = 255
32. max_x = 0
33. max_y = 0
34. for x in range(1, rows):
35. for y in range(1, cols):
36. t = set(img[x, y])
37. if len(t) >= 2:
38. if x <= min_x:
39. min_x = x
40. elif x >= max_x:
41. max_x = x
42. if y <= min_y:
43. min_y = y
44. elif y >= max_y:
45. max_y = y
46. img1 = img[min_x:max_x, min_y: max_y]
47. return img149. def template_match(self, tpl, target):
50. th, tw = tpl.shape[:2]
51. result = cv2.matchTemplate(target, tpl, cv2.TM_CCOEFF_NORMED)
52. # 寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置
53. min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
54. tl = max_loc
55. br = (tl[0] + tw, tl[1] + th)
56. # 绘制矩形边框,将匹配区域标注出来
57. # target:目标图像
58. # tl:矩形定点
59. # br:矩形的宽高
60. # (0,0,255):矩形边框颜色
61. # 1:矩形边框大小
62. cv2.rectangle(target, tl, br, (0, 0, 255), 2)
63. return tl[0]65. @staticmethod
66. def image_edge_detection(img):
67. edges = cv2.Canny(img, 100, 200)
68. return edges70. def discern(self):
71. img1 = self.clear_white(self.front)
72. img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
73. slide = self.image_edge_detection(img1)75. back = cv2.imread(self.bg, 0)
76. back = self.image_edge_detection(back)78. slide_pic = cv2.cvtColor(slide, cv2.COLOR_GRAY2RGB)
79. back_pic = cv2.cvtColor(back, cv2.COLOR_GRAY2RGB)
80. x = self.template_match(slide_pic, back_pic)
81. # 输出横坐标, 即 滑块在图片上的位置
82. return int(x)85. def bg_captcha_0(img,bgarray:list):
86. """
87. 滑块背景图还原
88. """
89. if isinstance(img, (str, Path)):
90. _img = Image.open(img)
91. elif isinstance(img, bytes):
92. _img = Image.open(io.BytesIO(img))
93. else:
94. return
95. # 创建一个新图
96. new_img = Image.new('RGB', (300, 200))98. # 图片还原顺序
99. __imgx = 300
100. __imgy = 200
101. _cutX = int(__imgx / 10)
102. _cutY = int(__imgy / 2)
103. for i in range(len(bgarray)):
104. # 从背景图中裁剪出对应位置的小块 Image.crop(左,上,右,下)坐标的4元组
105. if i<10:
106. crop_tuple = (int(i*_cutX),0,int((i+1)*_cutX),100)
107. else:
108. crop_tuple = (int((i-10)*_cutX),100,int((i-10+1)*_cutX),200)
109. img_cut = _img.crop(crop_tuple)111. # 将小块拼接到新图中,按bgarray数组给的位置来写坐标。
112. if bgarray[i]<10:
113. new_img.paste(img_cut,(bgarray[i]*30,0))
114. else:
115. new_img.paste(img_cut, ((bgarray[i]-10)*30,100))117. new_img.save('./image/bg.png')
118. return new_img121. def indexOf(arr,str_):
122. if arr and arr.index:
123. return arr.index(str_)
124. lenarr = len(arr)
125. for i in range(lenarr):
126. if arr[i] == str_:
127. return i
128. return -1130. # 生成轨迹
131. def get_tracks(distance, rate=0.5, t=0.2, v=0):
132. """
133. 将distance分割成小段的距离
134. :param distance: 总距离
135. :param rate: 加速减速的临界比例
136. :param a1: 加速度
137. :param a2: 减速度
138. :param t: 单位时间
139. :param t: 初始速度
140. :return: 小段的距离集合
141. """
142. tracks = []
143. # 加速减速的临界值
144. mid = rate * distance
145. # 当前位移
146. s = 0
147. # 循环
148. while s < distance:
149. # 初始速度
150. v0 = v
151. if s < mid:
152. a = 20
153. else:
154. a = -3
155. # 计算当前t时间段走的距离
156. s0 = v0 * t + 0.5 * a * t * t
157. # 计算当前速度
158. v = v0 + a * t
159. # 四舍五入距离,因为像素没有小数
160. tracks.append(round(s0))
161. # 计算当前距离
162. s += s0164. datelist = ''
165. distance = 0
166. for i in tracks[1:]:
167. distance += i
168. datelist_time = round(time.time() * 1000)
169. datelist += str(distance) + ',' + str(datelist_time) + '|'
170. time.sleep(0.005)
171. return datelist[:-1]174. # 注册和校验
175. def check_request(data):
176. headers = {
177. 'Cookie': 'ASP.NET_SessionId=qnfya5nvtn2b3pkycs5hs1zv; gr_user_id=f0c2c220-c9b3-4d70-96dd-1ee89e08a87f; gr_session_id_81eec0d0f0be2df1=da98e241-8c1a-4496-a734-61ad1907ef90; gr_session_id_81eec0d0f0be2df1_da98e241-8c1a-4496-a734-61ad1907ef90=true; xCloseNew=27; redSpot=false',
178. 'Host': 'gov.pkulaw.cn',
179. 'Origin': 'http://gov.pkulaw.cn',
180. 'Pragma': 'no-cache',
181. 'Referer': 'http://gov.pkulaw.cn/',
182. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36',
183. 'X-Requested-With': 'XMLHttpRequest',
184. }
185. url = 'http://gov.pkulaw.cn/VerificationCode/GetVerifiCodeResult'
186. res = sess.post(url,headers=headers,data=data)
187. return res190. def process_main():
191. register_data = {
192. 'act': 'getcode',
193. 'spec': '300*200'
194. }
195. data = json.loads(json.loads(check_request(register_data).text))
196. bgarray = [int(i) for i in data['array'].split(',')]
197. # 分割字符串
198. normal = data['normal'].split(',')[1]
199. small = data['small'].split(',')[1]201. # base64解码
202. b64decode = base64.b64decode(normal)
203. # 背景还原
204. bg_captcha_0(b64decode, bgarray=bgarray)
205. # 滑块图片
206. hk_image = base64.b64decode(small)
207. with open('./image/hk.png', 'wb') as f:
208. f.write(hk_image)
209. # 获取缺口距离
210. sc = SlideCrack('./image/bg.png','./image/hk.png')
211. slide_s = sc.discern()
212. check_data = {
213. 'act': 'check',
214. 'point': str(slide_s),
215. 'timespan': '452',
216. 'datelist': get_tracks(slide_s),
217. }
218. print(check_request(check_data).text)221. process_main()
python 识别滑块验证码相关推荐
- python识别滑块验证码_干掉验证码!使用Python图像识别移动滑块验证码
文章来源:python干货铺子 ❞ 前言 验证码往往是爬虫路上的一只拦路虎,而其花样也是层出不穷:图片验证.滑块验证.交互式验证.行为验证等.随着OCR技术的成熟,图片验证已经渐渐淡出主流,而「滑块验 ...
- python图像匹配缺口_【kimol君的无聊小发明】—用python识别滑块中的缺口
[kimol君的无聊小发明]-用python识别滑块中的缺口 前言 一.缺口识别 1.读取图片 2.识别图片边缘 3.缺口匹配 二.完整代码 写在最后 前言 某个夜深人静的夜晚,夜微凉风微扬,月光照进 ...
- Python模拟登录,Python识别图形验证码实现自动登陆
前言 利用Python识别图形验证码,selenium模块实现自动登陆.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re: numpy模块: pytess ...
- Python识别网站验证码的几种方式
Python识别网站验证码的几种方式 1.云打码平台(已完结) 优势:现成的平台,只需要调用即可,成功率较高. 劣势:需要一点软妹币. 这是最简单的运用,国内常用的打码平台有: 云打码(http:// ...
- Python识别登录验证码
Python识别登录验证码(附完整代码) [项目介绍] 网络迅速在人类生活中扎根,我们每天都会不可避免地接触大量网站和碎片化的信息,为了保护用户的账号安全和防止信息泄露,很多网站通行的方式是设置登录验 ...
- Python破解滑块验证码算法,完美避开人机识别
| 完美是不可能的,加个震惊!Python破解BiliBili滑块验证码,完美避开人机识别,可以有 准备工作 B站登录页 https://passport.bilibili.com/login pyt ...
- python 识别图形验证码_Python验证码识别
大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验 ...
- python识别中文验证码_Python实现验证码识别
大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验 ...
- python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...
图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口.云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好. 而自己写代码进行识别的话,又有很多种方案,比如最近火热的神经网 ...
最新文章
- 第二章 向量(d2)有序向量:二分查找
- 浅析ios开发中Block块语法的妙用
- LeetCode 138 复制带随机指针的链表-中等
- web.xml中的主要元素说明(listener, filter, servlet)
- Atitit.atiInputMethod v2词库清理策略工具 q229
- FLASH缓动导航制作方法.
- java程序设计编程题_JAVA编程题全集100题及答案
- 注意力模型(Attention Model)
- 【TFLearn和TensorFlow应用】——泰坦尼克号预测
- 抖音服务器维护中发不了视频,抖音视频发不出去怎么回事
- Android Studio配置优化最全详解
- Hadoop MapReduce Job 相关参数设置 概念介绍与理解
- 使用a标签时不用href=““调转页面
- 生命起源的奥秘:分子生物学对生命起源研究
- 基于域的无线安全认证方案
- DESFire 学习之AUTH
- [DP46题] HDU 1864 最大报销额
- Linux Signal信号详解
- 微软暑期实习Explore Program面经(已Offer)
- python开发环境和运行环境的区别_Python 初学者必知:Python 运行与开发环境
热门文章
- 后端调用阿里云快递API接口--后端部分
- Defensive Programming in PHP(PHP中的防御性编程)
- 快消出海系列:轻松找准波动原因--快消品出口额下降归因分析
- vue-cil 浏览器控制台报错:this._init is not a function
- Python3.7版---双人联机雷霆战机(2D特效+音效+道具+Linux系统)
- 微信小程序 — 自定义轮播图的面板指示点样式
- 定位模块如何实现公交系统智能化
- CSS3 属性样式总结记录(图文)
- 数学建模——模拟退火算法(Simulated Annealing,SA)
- 跑前端vue项目流程