博客来源于: 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 识别滑块验证码相关推荐

  1. python识别滑块验证码_干掉验证码!使用Python图像识别移动滑块验证码

    文章来源:python干货铺子 ❞ 前言 验证码往往是爬虫路上的一只拦路虎,而其花样也是层出不穷:图片验证.滑块验证.交互式验证.行为验证等.随着OCR技术的成熟,图片验证已经渐渐淡出主流,而「滑块验 ...

  2. python图像匹配缺口_【kimol君的无聊小发明】—用python识别滑块中的缺口

    [kimol君的无聊小发明]-用python识别滑块中的缺口 前言 一.缺口识别 1.读取图片 2.识别图片边缘 3.缺口匹配 二.完整代码 写在最后 前言 某个夜深人静的夜晚,夜微凉风微扬,月光照进 ...

  3. Python模拟登录,Python识别图形验证码实现自动登陆

    前言 利用Python识别图形验证码,selenium模块实现自动登陆.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re: numpy模块: pytess ...

  4. Python识别网站验证码的几种方式

    Python识别网站验证码的几种方式 1.云打码平台(已完结) 优势:现成的平台,只需要调用即可,成功率较高. 劣势:需要一点软妹币. 这是最简单的运用,国内常用的打码平台有: 云打码(http:// ...

  5. Python识别登录验证码

    Python识别登录验证码(附完整代码) [项目介绍] 网络迅速在人类生活中扎根,我们每天都会不可避免地接触大量网站和碎片化的信息,为了保护用户的账号安全和防止信息泄露,很多网站通行的方式是设置登录验 ...

  6. Python破解滑块验证码算法,完美避开人机识别

    | 完美是不可能的,加个震惊!Python破解BiliBili滑块验证码,完美避开人机识别,可以有 准备工作 B站登录页 https://passport.bilibili.com/login pyt ...

  7. python 识别图形验证码_Python验证码识别

    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验 ...

  8. python识别中文验证码_Python实现验证码识别

    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验 ...

  9. python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...

    图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口.云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好. 而自己写代码进行识别的话,又有很多种方案,比如最近火热的神经网 ...

最新文章

  1. 第二章 向量(d2)有序向量:二分查找
  2. 浅析ios开发中Block块语法的妙用
  3. LeetCode 138 复制带随机指针的链表-中等
  4. web.xml中的主要元素说明(listener, filter, servlet)
  5. Atitit.atiInputMethod v2词库清理策略工具    q229
  6. FLASH缓动导航制作方法.
  7. java程序设计编程题_JAVA编程题全集100题及答案
  8. 注意力模型(Attention Model)
  9. 【TFLearn和TensorFlow应用】——泰坦尼克号预测
  10. 抖音服务器维护中发不了视频,抖音视频发不出去怎么回事
  11. Android Studio配置优化最全详解
  12. Hadoop MapReduce Job 相关参数设置 概念介绍与理解
  13. 使用a标签时不用href=““调转页面
  14. 生命起源的奥秘:分子生物学对生命起源研究
  15. 基于域的无线安全认证方案
  16. DESFire 学习之AUTH
  17. [DP46题] HDU 1864 最大报销额
  18. Linux Signal信号详解
  19. 微软暑期实习Explore Program面经(已Offer)
  20. python开发环境和运行环境的区别_Python 初学者必知:Python 运行与开发环境

热门文章

  1. 后端调用阿里云快递API接口--后端部分
  2. Defensive Programming in PHP(PHP中的防御性编程)
  3. 快消出海系列:轻松找准波动原因--快消品出口额下降归因分析
  4. vue-cil 浏览器控制台报错:this._init is not a function
  5. Python3.7版---双人联机雷霆战机(2D特效+音效+道具+Linux系统)
  6. 微信小程序 — 自定义轮播图的面板指示点样式
  7. 定位模块如何实现公交系统智能化
  8. CSS3 属性样式总结记录(图文)
  9. 数学建模——模拟退火算法(Simulated Annealing,SA)
  10. 跑前端vue项目流程