文末源码,阅读大约2.8分钟

傻瓜式教程 - 体验滑块,提供练习场景及源码。


文章目录

  • 环境安装
  • 效果展示
  • 源码

环境安装

安装python需要的依赖包

cv2 安装可以参考这里:https://javapub.blog.csdn.net/article/details/123656345

安装webdriver -> chrome

下载对应版本,放在本地 D:\anaconda3\Scripts 目录下

https://registry.npmmirror.com/binary.html?path=chromedriver


效果展示

GIF效果:https://tva2.sinaimg.cn/large/007F3CC8ly1h0ku3yh9g5g31ex0pfwus.gif

cv2使用参考:https://blog.csdn.net/RNG_uzi_/article/details/90034485

注意:测试时慢点刷,容易封IP。

源码

有问题可以留言探讨,公众号:JavaPub

对源码加了大量注释

测试网站:http://app.miit-eidc.org.cn/miitxxgk/gonggao/xxgk/queryCpParamPage?dataTag=Z&gid=U3119671&pc=303

import os
import cv2
import time
import random
import requests
import numpy as np
from PIL import Image
from io import BytesIO
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECclass CrackSlider():def __init__(self):# self.browser = webdriver.Edge()self.browser = webdriver.Chrome()self.s2 = r'//*[@id="captcha_div"]/div/div[1]/div/div[1]/img[1]'self.s3 = r'//*[@id="captcha_div"]/div/div[1]/div/div[1]/img[2]'self.url = 'http://app.miit-eidc.org.cn/miitxxgk/gonggao/xxgk/queryCpParamPage?dataTag=Z&gid=U3119671&pc=303'  # 测试网站self.wait = WebDriverWait(self.browser, 20)self.browser.get(self.url)# 保存俩张图片def get_img(self, target, template, xp):time.sleep(3)target_link = self.browser.find_element_by_xpath(self.s2).get_attribute("src")template_link = self.browser.find_element_by_xpath(self.s3).get_attribute("src")target_img = Image.open(BytesIO(requests.get(target_link).content))template_img = Image.open(BytesIO(requests.get(template_link).content))target_img.save(target)template_img.save(template)size_loc = target_img.sizeprint('size_loc[0]-----\n')print(size_loc[0])zoom = xp / int(size_loc[0])  # 耦合像素print('zoom-----\n')print(zoom)return zoomdef change_size(self, file):image = cv2.imread(file, 1)  # 读取图片 image_name应该是变量img = cv2.medianBlur(image, 5)  # 中值滤波,去除黑色边际中可能含有的噪声干扰。去噪。b = cv2.threshold(img, 15, 255, cv2.THRESH_BINARY)  # 调整裁剪效果,二值化处理。binary_image = b[1]  # 二值图--具有三通道binary_image = cv2.cvtColor(binary_image, cv2.COLOR_BGR2GRAY)x, y = binary_image.shapeedges_x = []edges_y = []for i in range(x):for j in range(y):if binary_image[i][j] == 255:edges_x.append(i)edges_y.append(j)left = min(edges_x)  # 左边界right = max(edges_x)  # 右边界width = right - left  # 宽度bottom = min(edges_y)  # 底部top = max(edges_y)  # 顶部height = top - bottom  # 高度pre1_picture = image[left:left + width, bottom:bottom + height]  # 图片截取return pre1_picture  # 返回图片数据# 匹配比对俩图距离def match(self, target, template):img_gray = cv2.imread(target, 0)img_rgb = self.change_size(template)template = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) # 图片格式转换为灰度图片 # cv2.imshow('template', template)# cv2.waitKey(0)res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) # 匹配模式,匹配图片run = 1# 使用二分法查找阈值的精确值L = 0R = 1while run < 20:run += 1threshold = (R + L) / 2if threshold < 0:print('Error')return Noneloc = np.where(res >= threshold)if len(loc[1]) > 1:L += (R - L) / 2elif len(loc[1]) == 1:breakelif len(loc[1]) < 1:R -= (R - L) / 2res = loc[1][0]print('match distance-----\n')print(res)return resdef move_to_gap(self, tracks):slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'yidun_slider')))ActionChains(self.browser).click_and_hold(slider).perform()#element = self.browser.find_element_by_xpath(self.s3)#ActionChains(self.browser).click_and_hold(on_element=element).perform()while tracks:x = tracks.pop(0)print('tracks.pop(0)-----\n')print(x)ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()#ActionChains(self.browser).move_to_element_with_offset(to_element=element, xoffset=x, yoffset=0).perform()#time.sleep(0.01)time.sleep(0.05)ActionChains(self.browser).release().perform()def move_to_gap1(self, distance):distance += 46time.sleep(1)element = self.browser.find_element_by_xpath(self.s3)ActionChains(self.browser).click_and_hold(on_element=element).perform()ActionChains(self.browser).move_to_element_with_offset(to_element=element, xoffset=distance, yoffset=0).perform()#ActionChains(self.browser).release().perform()time.sleep(1.38)ActionChains(self.browser).release(on_element=element).perform()def move_to_gap2(self, distance):element = self.browser.find_elements_by_class_name("yidun_slider")[0]action = ActionChains(self.browser)mouse_action = action.click_and_hold(on_element=element)distance += 11distance = int(distance * 32/33)move_steps = int(distance/4)for i in range(0,move_steps):mouse_action.move_by_offset(4,random.randint(-5,5)).perform()time.sleep(0.1)mouse_action.release().perform()    # 计算出先加速、后加速的数组def get_tracks(self, distance, seconds, ease_func):distance += 20tracks = [0]offsets = [0]for t in np.arange(0.0, seconds, 0.1):ease = ease_funcprint('ease-----\n')print(ease)offset = round(ease(t / seconds) * distance)print('offset-----\n')print(offset)tracks.append(offset - offsets[-1])print('offset - offsets[-1]-----\n')print(offset - offsets[-1])offsets.append(offset)print('offsets-----\n')print(offsets)tracks.extend([-3, -2, -3, -2, -2, -2, -2, -1, -0, -1, -1, -1])return tracksdef get_tracks1(self,distance):"""根据偏移量获取移动轨迹:param distance: 偏移量:return: 移动轨迹"""# 移动轨迹track = []# 当前位移current = 0# 减速阈值mid = distance * 4 / 5# 计算间隔t = 0.2# 初速度v = 0while current < distance:if current < mid:# 加速度为正 2a = 4else:# 加速度为负 3a = -3# 初速度 v0v0 = v# 当前速度 v = v0 + atv = v0 + a * t# 移动距离 x = v0t + 1/2 * a * t^2move = v0 * t + 1 / 2 * a * t * t# 当前位移current += move# 加入轨迹track.append(round(move))return trackdef ease_out_quart(self, x):res = 1 - pow(1 - x, 4)print('ease_out_quart-----\n')print(res)return res# 发生意外,请留言。https://javapub.blog.csdn.net/article/details/123730597
if __name__ == '__main__':xp = 320  # 验证码的像素-长target = 'target.jpg'  # 临时保存的图片名template = 'template.png'  # 临时保存的图片名cs = CrackSlider()zoom = cs.get_img(target, template, xp)distance = cs.match(target, template)track = cs.get_tracks((distance + 7) * zoom, random.randint(2, 4), cs.ease_out_quart)#track = cs.get_tracks1(distance)#track = cs.get_tracks((distance + 7) * zoom, random.randint(1, 2), cs.ease_out_quart)cs.move_to_gap(track)#cs.move_to_gap1(distance)#cs.move_to_gap2(distance)time.sleep(2)#cs.browser.close()

同名公众号,更多工具解决方案

python入门教程 - 滑块实战【附源码】相关推荐

  1. python入门教程 - 滑块实战[附源码]

    推荐教程 Python基础教程|xin3721自学网ul li id=itemtitlePython3 从入门到精通视频教程/li /ul ul li class=description Python ...

  2. 7个惊艳众人的 Python 实用项目!【附源码】

    今天分享7个学妹看见都惊呆的 Python 小项目![附源码] 建议收藏 界面应用 1.计算器 1. 案例介绍 本例利用 Python 开发一个可以进行简单的四则运算的图形化计算器,会用到 Tkint ...

  3. 教你用python制作人脸卡通画(附源码)

    教你用python制作人脸卡通画(附源码) 效果展示: 让我们开始学习之路: 原理:利用第三方人脸接口将图像人脸化 第三方接口注册地址:https://ai.minivision.cn/#/login ...

  4. (神技能)Python控制的鼠标实战与源码

    (神技能)Python控制的鼠标实战与源码 文章目录 (神技能)Python控制的鼠标实战与源码 一.序言 二.配置环境 1.下载pyautogui包 二.鼠标控制 1.获取鼠标位置函数以及测试源码 ...

  5. 织梦DEDECMS网站改造MIP加速器教程方法【附源码】 - 移动端MIP加速闪电图标

    织梦DEDECMS网站改造MIP加速器教程方法[附源码] - 移动端MIP加速闪电图标.独立手机站改造MIP 首先我们网站必须为UTF-8编码内核程序,否则无法直接操作,今天我们介绍下已有独立移动网站 ...

  6. python蒙特卡洛模拟抢红包(附源码),可用于课堂展示(presentation)

    本博客是复现b站毕导视频中描述的模拟论证过程,先上原视频链接(强烈建议先看原视频): 我给自己发了2亿个红包,才发现先抢和后抢差距这么大https://www.bilibili.com/video/B ...

  7. 66个Python练手项目,附源码

    前言: 不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了66个Python实战项目列表,都有完整且详细的教程,你可以从 ...

  8. python抢票代码_五一要来了,教你用Python自动抢火车票,附源码

    用python另一个抢票神器,你get到了吗? 2020年时间飞逝,转眼间马上要到五一了,还在为抢不到火车票发愁吗?作为程序员的我们撸一个抢票软件可好? ... 难以想象的数据, 预示着今年春运回程和 ...

  9. Django项目实战(附源码免费下载)

    制作图书管理系统(末尾附源码) 第一步先更改settings.py里面的必要配置,更改或附件项如下 INSTALLED_APPS = ['django.contrib.admin','django.c ...

最新文章

  1. 华为云客户端_从技术角度解读华为云手机之于普通用户的可行性
  2. Applet 大文件上传
  3. 判断java日期跨月_18 个 Java8 日期处理的实践,太有用了!
  4. mfs分布式存储+master端高可用
  5. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)
  6. Struts 2 的Action详解(三)
  7. ASP.NET中常用功能代码总结(1)——发送邮件篇
  8. HarmonyOS Sans - 华为把鸿蒙系统自带的字体开放给全社会免费商用了
  9. 获取Android手机短信中心号码
  10. android 流量计算器,电工计算器v8.0.1_for Android 直装解锁专业版
  11. Android JNI的调用过程
  12. canvas学习之-七色板
  13. Java软件开发工程师简历模板包装教学问题完整版 【心静思远-9527】
  14. java 以10为底的对数_获取Java中值的以10为底的对数
  15. 程序员常用资源工具集合(建议收藏)
  16. 基于Java的GUI界面+SQL Server数据库课程信息管理系统
  17. 文件与磁盘空间管理---外存分配方式、存储空间管理
  18. 7-6 程序员买西瓜 (5分)
  19. java ref传引用_java引用传递
  20. C++顺序结构——小玉买文具

热门文章

  1. 使用华为云CSE开发微服务应用
  2. 新机PE环境安装系统出现的问题,EFI RART发现红× 解决方法
  3. 关于收集技术分享会议_关于技术会议上的饼图多样性
  4. OpenHarmony社区运营报告(2022年12月)
  5. matlab仿真电缆,一种井下电缆绝缘在线监测方法及matlab/simulink仿真
  6. 蓝牙基带解调(GFSK:Gauss frequency Shift Keying )
  7. 几种常见的数字调制方法 ASK,FSK,GFSK
  8. vue项目使用markdown编辑器
  9. 解决系统提示msvcr71.dll文件丢失的错误
  10. V字仇杀队精彩简介_免费下载