python通过selenium实现自动登录及轻松过滑块验证、点选验证码(2024-06-14)

一、chromedriver配置环境搭建


请确保下载的驱动程序与你的Chrome浏览器版本匹配,以确保正常运行。

1、Chrome版本号


chrome的地址栏输入chrome://version,自然就得到125.0.6422.142
版本 125.0.6422.142(正式版本) (64 位)


(图1Chrome版本号)

2、最新chromedriver版本下载地址

https://googlechromelabs.github.io/chrome-for-testing/


(图2最新chromedriver版本下载地址)

3、查看chromedriver 版本号

chromedriver --version



(图3查看chromedriver 版本号)

4、chromedriver.exe放置位置


与python.exe同目录


(图4chromedriver.exe放置位置)

5、安装selenium


pip install selenium(出现下图是已经成功安装4.10.0版本了)

6、查看selenium版本号


pip show selenium就可以查看版本号了(Version=4.10.0)


(图5查看selenium版本号)

7、卸载selenium


pip uninstall selenium

8、指定selenium安装版本


输入pip install selenium==3.3.1(指定安装3.3.1版本)

二、selenium自动登录


Selenium添加Cookie来实现自动登录。
总的来说分两步


1、第一步获取你登录的cookie,以csdn为例


driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
start=time()
sleep(15)//这里设置的是等待多少秒,也就是浏览器等待你登录,在这之后就去检查cookie,。
try:
    driver.refresh()//先刷新界面
    print(driver.get_cookies())//获得cookie并打印
except Exception as e:
    print(e)
    print(f'耗时:{time()-start}')
然后在控制台你就可以得到一个字典格式的cookies

2、第二步就是把第一步中得到的cookie放到webdriver里

driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
driver.delete_all_cookies()//先清除原有的
cookies=//这里把第一步的cookie复制上就行
for cookie in cookies:
    driver.add_cookie(cookie)
driver.refresh()//带着cookie重新加载

3、 webdriver中常用的cookie方法


webdriver中提供了操作cookie的相关方法:

get_cookies()                   获得cookie信息

add_cookie(cookie_dict)        添加cookie

delete_cookie(name)             删除特定(部分)的cookie

delete_all_cookies()              删除所有的cookie

4、自动登录完整源码

url="https://mygiftcard.jd.com/giftcard/myGiftCardInit.action"
def login(driver):driver.get('https://www.jd.com/')driver.switch_to.window(driver.window_handles[-1])driver.maximize_window()driver.delete_all_cookies()cookies = [{'domain': '.jd.com', 'expiry': 1717384813, 'httpOnly': False, 'name': '__jdb', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '76161171.5.1717382950957103922947|1.1717382951'},{'domain': '.jd.com', 'expiry': 1732935013, 'httpOnly': False, 'name': '__jda', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '76161171.1717382950957103922947.1717382951.1717382951.1717382951.1'},{'domain': '.jd.com', 'httpOnly': False, 'name': '__jdc', 'path': '/', 'sameSite': 'Lax', 'secure': False,'value': '76161171'},{'domain': '.jd.com', 'expiry': 1748918985, 'httpOnly': False, 'name': 'pinId', 'path': '/', 'sameSite': 'None','secure': True, 'value': 'YCe8rw2G6w2zBk65PfDfDg'},{'domain': '.jd.com', 'expiry': 1719974985, 'httpOnly': False, 'name': 'pin', 'path': '/', 'sameSite': 'None','secure': True, 'value': 'jd_XLCuliLsIoml'},{'domain': '.jd.com', 'expiry': 1717386601, 'httpOnly': False, 'name': 'jsavif', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '1'},{'domain': '.jd.com', 'expiry': 1717384801, 'httpOnly': False, 'name': 'token', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '58b2853fe33d43b6606c5a21df75d6e5,3,954101'},{'domain': '.jd.com', 'expiry': 1719975003, 'httpOnly': False, 'name': 'ipLoc-djd', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': '25-2258-2261-6568'},{'domain': 'www.jd.com', 'expiry': 1717386590, 'httpOnly': False, 'name': 'UseCorpPin', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': 'jd_XLCuliLsIoml'},{'domain': '.jd.com', 'expiry': 1719974985, 'httpOnly': False, 'name': '_tp', 'path': '/', 'sameSite': 'None','secure': True, 'value': 'gcPCiSoOxTEQh1UmLWSJmA%3D%3D'},{'domain': '.jd.com', 'expiry': 1718246952, 'httpOnly': False, 'name': 'areaId', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '25'},{'domain': '.jd.com', 'expiry': 1719974985, 'httpOnly': False, 'name': 'unick', 'path': '/', 'sameSite': 'None','secure': True, 'value': '717tjgq12eb3u3'},{'domain': '.jd.com', 'expiry': 1717383072, 'httpOnly': False, 'name': '_gia_d', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '1'},{'domain': '.jd.com', 'expiry': 1751942985, 'httpOnly': False, 'name': 'TrackID', 'path': '/','sameSite': 'None', 'secure': True,'value': '16Qvq9anbTkSX8gr4zaukUq5uQYslojZC9OQmewQghRGZ3XvjG_MMnzr_vyEIKSdUCtJ2wRpSFTY3eQtR-mtgEtTLaduuEqMy1V9rbOxT2sDX0aNazsKZ9ymfF8kbb66r'},{'domain': '.jd.com', 'expiry': 1751943003, 'httpOnly': False, 'name': 'shshshfpb', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': 'BApXcwpUJ3-pAgpgn7ERHMlecUhcGxJTHBlV5Lnto9xJ1MukUQIC2'},{'domain': '.jd.com', 'expiry': 1751943002, 'httpOnly': False, 'name': 'shshshfpa', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': '52743637-1e03-a986-e555-3b60bd02251d-1717382954'},{'domain': '.jd.com', 'expiry': 1751942954, 'httpOnly': False, 'name': 'shshshfpx', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': '52743637-1e03-a986-e555-3b60bd02251d-1717382954'},{'domain': 'www.jd.com', 'expiry': 1748918953, 'httpOnly': False, 'name': 'o2State', 'path': '/','sameSite': 'Lax', 'secure': False,'value': '{%22webp%22:true%2C%22avif%22:true%2C%22lastvisit%22:1717382953020}'},{'domain': '.jd.com', 'expiry': 1718678985, 'httpOnly': True, 'name': 'thor', 'path': '/', 'sameSite': 'None','secure': True,'value': 'B4C20964EEB81D93A1282B10D740DDCE93E6BF376C1A027834CA7420581040CA1F1691CE77DF8E8D4839BB18578D59CADD7B65F3464D14E69D56C466193409E2C5CC1CCC0FB0077D600F5E5A9050977080A6CD9DB54BF53D86A4A33D85C531B9CBA745CE208771BE1D5DFCEBADFD8E0CEB8C892454D65E7595BB979BE56296A5F7B62DAF0FD0D84D7FE1241F16E5B46A7A60AB7C12103EA76433421EA1F54E0A'},{'domain': '.jd.com', 'expiry': 1743302958, 'httpOnly': False, 'name': '3AB9D23F7A4B3C9B', 'path': '/','sameSite': 'Lax', 'secure': False,'value': 'IGRRJT2FGAUX2L3XBSLXZRHOWGH7YNRHMBQHXA7OMUM75D6BQNTIV6YWQQLNKHV2URUHMEDS7BVALS47ABD56MW5TA'},{'domain': '.jd.com', 'expiry': 1718679002, 'httpOnly': True, 'name': 'flash', 'path': '/', 'sameSite': 'None','secure': True,'value': '2_zpZqs4H7M7_a9OhxVV4eMXgMPNf1o8Lxl-gS2Cneh79n2xY8IA6o9y5JglFeAKaQiZht9zwAUXVJco4lj9A4vcdvIQiBDvy8LbsO_AFm1vttvRjlsuRLrbjHGIQSlouU9NJknNKUB8TbCWUlqFfY8wD2CdBj94DPObXyoggI_DK*'},{'domain': '.jd.com', 'expiry': 1719974985, 'httpOnly': True, 'name': '_pst', 'path': '/', 'sameSite': 'None','secure': True, 'value': 'jd_XLCuliLsIoml'},{'domain': '.jd.com', 'expiry': 1717384801, 'httpOnly': False, 'name': '__tk', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': 'VnTIiUTISDSEikqDVAvHVAvJTLe5Wne3iLTHiUSFikuATcVIVkq3i2,3,954101'},{'domain': '.jd.com', 'expiry': 1748486952, 'httpOnly': False, 'name': '3AB9D23F7A4B3CSS', 'path': '/','sameSite': 'Lax', 'secure': False,'value': 'jdd03IGRRJT2FGAUX2L3XBSLXZRHOWGH7YNRHMBQHXA7OMUM75D6BQNTIV6YWQQLNKHV2URUHMEDS7BVALS47ABD56MW5TAAAAAMP3QADWNQAAAAACGG4IYVAGJI3JMX'},{'domain': '.jd.com', 'expiry': 1732935018, 'httpOnly': False, 'name': '__jdu', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '1717382950957103922947'},{'domain': '.jd.com', 'httpOnly': False, 'name': 'ceshi3.com', 'path': '/', 'sameSite': 'None', 'secure': True,'value': '000'},{'domain': '.jd.com', 'expiry': 1718678950, 'httpOnly': False, 'name': '__jdv', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '76161171|direct|-|none|-|1717382950958'}]for cookie in cookies:driver.add_cookie(cookie)##driver.refresh()driver.get(url)

三、selenium自动填写表单


分为两步:一是取得元素(文本框、按钮等),二是执行输入、点击等操作。


1、第一步、获取元素


在 Chrome 里,鼠标停留在文本框,使用“检查元素”功能,在下方的调试窗口,右键“复制->复制完整 XPath”(如下图),得到“文本框”对应的 XPath,使用 Selenium 提供的send_keys命令实现文本输入。


(图6Crome里取得元素 XPath)


2、第二步、执行输入、点击等操作


执行输入

driver.find_element(By.XPATH,'/html/body/div[4]/div/div/div[2]/div/div[1]/div/div/div/div/div[2]/div[2]/div[2]/input').send_keys(card_id)


执行点击

driver.find_element(By.XPATH,'/html/body/div[4]/div/div/div[2]/div/div[1]/div/div/div/div/div[2]/div[2]/div[3]/div').click()


3、获取元素属性

        ele_big = driver.find_element(By.ID, "cpc_img")ele_small = driver.find_element(By.ID, "small_img")src_big = ele_big.get_attribute('src')src_small = ele_small.get_attribute('src')

四、pyautogui自动化控制鼠标和键盘操作


PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux)。


1、安装

pip3 install pyautogui

2、pyautogui鼠标操作样例

import pyautogui# 获取当前屏幕分辨率
screenWidth, screenHeight = pyautogui.size()# 获取当前鼠标位置
currentMouseX, currentMouseY = pyautogui.position()# 2秒钟鼠标移动坐标为100,100位置  绝对移动
#pyautogui.moveTo(100, 100,2)
pyautogui.moveTo(x=100, y=100,duration=2, tween=pyautogui.linear)#鼠标移到屏幕中央。
pyautogui.moveTo(screenWidth / 2, screenHeight / 2)# 鼠标左击一次
#pyautogui.click()
# x 
# y 
# clicks 点击次数
# interval点击之间的间隔
# button 'left', 'middle', 'right' 对应鼠标 左 中 右或者取值(1, 2, or 3)
# tween 渐变函数
#
pyautogui.click(x=None, y=None, clicks=1, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)# 鼠标相对移动 ,向下移动
#pyautogui.moveRel(None, 10)
pyautogui.moveRel(xOffset=None, yOffset=10,duration=0.0, tween=pyautogui.linear)# 鼠标当前位置0间隔双击
#pyautogui.doubleClick()
pyautogui.doubleClick(x=None, y=None, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)# 鼠标当前位置3击
#pyautogui.tripleClick()
pyautogui.tripleClick(x=None, y=None, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)#右击
pyautogui.rightClick()#中击
pyautogui.middleClick()#  用缓动/渐变函数让鼠标2秒后移动到(500,500)位置
#  use tweening/easing function to move mouse over 2 seconds.
pyautogui.moveTo(x=500, y=500, duration=2, tween=pyautogui.easeInOutQuad)#鼠标拖拽
pyautogui.dragTo(x=427, y=535, duration=3,button='left')#鼠标相对拖拽
pyautogui.dragRel(xOffset=100,yOffset=100,duration=,button='left',mouseDownUp=False)#鼠标移动到x=1796, y=778位置按下
pyautogui.mouseDown(x=1796, y=778, button='left')#鼠标移动到x=2745, y=778位置松开(与mouseDown组合使用选中)
pyautogui.mouseUp(x=2745, y=778, button='left',duration=5)#鼠标当前位置滚轮滚动
pyautogui.scroll()
#鼠标水平滚动(Linux)
pyautogui.hscroll()
#鼠标左右滚动(Linux)
pyautogui.vscroll()

移动滑块函数

def my_slide(pos,distance):start_x = pos[0]start_y = pos[1]end_x = pos[0] + distanceend_y = pos[1]# 移动鼠标到起始位置pyautogui.moveTo(start_x, start_y, duration=0.3)# 按下鼠标左键pyautogui.mouseDown()# 往右多拖到20xppyautogui.moveTo(end_x - 20, end_y - 20, duration=0.4)#拖回结束位置pyautogui.moveTo(end_x, end_y, duration=0.5)# 松开鼠标左键pyautogui.mouseUp()

3、pyautogui键盘操作样例

#模拟输入信息
pyautogui.typewrite(message='Hello world!',interval=0.5)
#点击ESC
pyautogui.press('esc')
# 按住shift键
pyautogui.keyDown('shift')
# 放开shift键
pyautogui.keyUp('shift')
# 模拟组合热键
pyautogui.hotkey('ctrl', 'c')

五、python屏幕截图

我们需要用到Python的pillow模块中的ImageGrab类的grab()方法即可实现,具体代码如下:

img = ImageGrab.grab(bbox=(x, y, width, height))img = ImageGrab.grab(bbox=(759, 421, 1141, 793))
img.save('./sel.jpg')


该方法中bbox参数中传入需要截取图片的区域即可。其中x、y表示截取图片的左上角位置坐标,width、height参数中传入截取图片的宽度和高度。

如果是全屏幕截取,则x, y = 0, 0;width、height传入屏幕分辨率中的宽度和高度即可。


六、python通过selenium自动登录及轻松过滑块验证、点选验证码源代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import pyautogui
import time
import webbrowser, base64, iofrom PIL import Image
import random
import cv2
import pyautogui
import time
import webbrowser
import requests, json, re
import time
import random
import shutil
import pyperclip
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import keyboard, os , uuid
from PIL import ImageGrabfrom YdmVerify import YdmVerify
y = YdmVerify()
##author:byc6352
##technical support:byc6352 or metabycf or 39848872
card_id='55ADCB28DBC56EB4'
url="https://mygiftcard.jd.com/giftcard/myGiftCardInit.action"
def login(driver,cookies=''):##自动登录driver.get('https://www.jd.com/')driver.switch_to.window(driver.window_handles[-1])driver.maximize_window()driver.delete_all_cookies()if cookies=='':cookies = [{'domain': '.jd.com', 'expiry': 1717384813, 'httpOnly': False, 'name': '__jdb', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '76161171.5.1717382950957103922947|1.1717382951'},{'domain': '.jd.com', 'expiry': 1732935013, 'httpOnly': False, 'name': '__jda', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '76161171.1717382950957103922947.1717382951.1717382951.1717382951.1'},{'domain': '.jd.com', 'httpOnly': False, 'name': '__jdc', 'path': '/', 'sameSite': 'Lax', 'secure': False,'value': '76161171'},{'domain': '.jd.com', 'expiry': 1748918985, 'httpOnly': False, 'name': 'pinId', 'path': '/', 'sameSite': 'None','secure': True, 'value': 'YCe8rw2G6w2zBk65PfDfDg'},{'domain': '.jd.com', 'expiry': 1719974985, 'httpOnly': False, 'name': 'pin', 'path': '/', 'sameSite': 'None','secure': True, 'value': 'jd_XLCuliLsIoml'},{'domain': '.jd.com', 'expiry': 1717386601, 'httpOnly': False, 'name': 'jsavif', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '1'},{'domain': '.jd.com', 'expiry': 1717384801, 'httpOnly': False, 'name': 'token', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '58b2853fe33d43b6606c5a21df75d6e5,3,954101'},{'domain': '.jd.com', 'expiry': 1719975003, 'httpOnly': False, 'name': 'ipLoc-djd', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': '25-2258-2261-6568'},{'domain': 'www.jd.com', 'expiry': 1717386590, 'httpOnly': False, 'name': 'UseCorpPin', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': 'jd_XLCuliLsIoml'},{'domain': '.jd.com', 'expiry': 1719974985, 'httpOnly': False, 'name': '_tp', 'path': '/', 'sameSite': 'None','secure': True, 'value': 'gcPCiSoOxTEQh1UmLWSJmA%3D%3D'},{'domain': '.jd.com', 'expiry': 1718246952, 'httpOnly': False, 'name': 'areaId', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '25'},{'domain': '.jd.com', 'expiry': 1719974985, 'httpOnly': False, 'name': 'unick', 'path': '/', 'sameSite': 'None','secure': True, 'value': '717tjgq12eb3u3'},{'domain': '.jd.com', 'expiry': 1717383072, 'httpOnly': False, 'name': '_gia_d', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '1'},{'domain': '.jd.com', 'expiry': 1751942985, 'httpOnly': False, 'name': 'TrackID', 'path': '/','sameSite': 'None', 'secure': True,'value': '16Qvq9anbTkSX8gr4zaukUq5uQYslojZC9OQmewQghRGZ3XvjG_MMnzr_vyEIKSdUCtJ2wRpSFTY3eQtR-mtgEtTLaduuEqMy1V9rbOxT2sDX0aNazsKZ9ymfF8kbb66r'},{'domain': '.jd.com', 'expiry': 1751943003, 'httpOnly': False, 'name': 'shshshfpb', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': 'BApXcwpUJ3-pAgpgn7ERHMlecUhcGxJTHBlV5Lnto9xJ1MukUQIC2'},{'domain': '.jd.com', 'expiry': 1751943002, 'httpOnly': False, 'name': 'shshshfpa', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': '52743637-1e03-a986-e555-3b60bd02251d-1717382954'},{'domain': '.jd.com', 'expiry': 1751942954, 'httpOnly': False, 'name': 'shshshfpx', 'path': '/','sameSite': 'Lax', 'secure': False, 'value': '52743637-1e03-a986-e555-3b60bd02251d-1717382954'},{'domain': 'www.jd.com', 'expiry': 1748918953, 'httpOnly': False, 'name': 'o2State', 'path': '/','sameSite': 'Lax', 'secure': False,'value': '{%22webp%22:true%2C%22avif%22:true%2C%22lastvisit%22:1717382953020}'},{'domain': '.jd.com', 'expiry': 1718678985, 'httpOnly': True, 'name': 'thor', 'path': '/', 'sameSite': 'None','secure': True,'value': 'B4C20964EEB81D93A1282B10D740DDCE93E6BF376C1A027834CA7420581040CA1F1691CE77DF8E8D4839BB18578D59CADD7B65F3464D14E69D56C466193409E2C5CC1CCC0FB0077D600F5E5A9050977080A6CD9DB54BF53D86A4A33D85C531B9CBA745CE208771BE1D5DFCEBADFD8E0CEB8C892454D65E7595BB979BE56296A5F7B62DAF0FD0D84D7FE1241F16E5B46A7A60AB7C12103EA76433421EA1F54E0A'},{'domain': '.jd.com', 'expiry': 1743302958, 'httpOnly': False, 'name': '3AB9D23F7A4B3C9B', 'path': '/','sameSite': 'Lax', 'secure': False,'value': 'IGRRJT2FGAUX2L3XBSLXZRHOWGH7YNRHMBQHXA7OMUM75D6BQNTIV6YWQQLNKHV2URUHMEDS7BVALS47ABD56MW5TA'},{'domain': '.jd.com', 'expiry': 1718679002, 'httpOnly': True, 'name': 'flash', 'path': '/', 'sameSite': 'None','secure': True,'value': '2_zpZqs4H7M7_a9OhxVV4eMXgMPNf1o8Lxl-gS2Cneh79n2xY8IA6o9y5JglFeAKaQiZht9zwAUXVJco4lj9A4vcdvIQiBDvy8LbsO_AFm1vttvRjlsuRLrbjHGIQSlouU9NJknNKUB8TbCWUlqFfY8wD2CdBj94DPObXyoggI_DK*'},{'domain': '.jd.com', 'expiry': 1719974985, 'httpOnly': True, 'name': '_pst', 'path': '/', 'sameSite': 'None','secure': True, 'value': 'jd_XLCuliLsIoml'},{'domain': '.jd.com', 'expiry': 1717384801, 'httpOnly': False, 'name': '__tk', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': 'VnTIiUTISDSEikqDVAvHVAvJTLe5Wne3iLTHiUSFikuATcVIVkq3i2,3,954101'},{'domain': '.jd.com', 'expiry': 1748486952, 'httpOnly': False, 'name': '3AB9D23F7A4B3CSS', 'path': '/','sameSite': 'Lax', 'secure': False,'value': 'jdd03IGRRJT2FGAUX2L3XBSLXZRHOWGH7YNRHMBQHXA7OMUM75D6BQNTIV6YWQQLNKHV2URUHMEDS7BVALS47ABD56MW5TAAAAAMP3QADWNQAAAAACGG4IYVAGJI3JMX'},{'domain': '.jd.com', 'expiry': 1732935018, 'httpOnly': False, 'name': '__jdu', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '1717382950957103922947'},{'domain': '.jd.com', 'httpOnly': False, 'name': 'ceshi3.com', 'path': '/', 'sameSite': 'None', 'secure': True,'value': '000'},{'domain': '.jd.com', 'expiry': 1718678950, 'httpOnly': False, 'name': '__jdv', 'path': '/', 'sameSite': 'Lax','secure': False, 'value': '76161171|direct|-|none|-|1717382950958'}]for cookie in cookies:driver.add_cookie(cookie)##driver.refresh()driver.get(url)def click_verify():# 图标点选try:##截图保存img = ImageGrab.grab(bbox=(759, 421, 1141, 793))img.save('./sel.jpg')with open(r'./sel.jpg', 'rb') as f:im =f.read()##图像识别ret=y.click_verify(image=im,verify_type="30330")print("ret="+ret)ret=str(ret)pos=ret.split(',')pos[0]=int(pos[0])pos[1] = int(pos[1])# 移动鼠标到起始位置pyautogui.moveTo(pos[0]+759, pos[1]+421, duration=0.3)# 按下鼠标左键pyautogui.mouseDown()# 松开鼠标左键pyautogui.mouseUp()time.sleep(2)##失败 再次点选click_verify()return Trueexcept Exception as e:print('click_verify err:', e)return Falsedef slide_verify():##滑块验证try:ele_big = driver.find_element(By.ID, "cpc_img")ele_small = driver.find_element(By.ID, "small_img")src_big = ele_big.get_attribute('src')# print(src_big)src_small = ele_small.get_attribute('src')# 获取标准的base64字符串base64_big = src_big[22:]base64_small = src_small[22:]lo_small = [804, 753]##计算缺口滑块距离ret=y.slide_verify(base64_small,base64_big)ret=int(ret)+30print(ret)##鼠标操作slide_mouse(lo_small,ret )return Trueexcept Exception as e:print('card_slide err:', e)##转到点选验证ret=click_verify()if ret==True:return Trueelse:return Falsereturn Falsedef slide_mouse(pos,distance):##滑块验证 移动鼠标start_x = pos[0]start_y = pos[1]end_x = pos[0] + distanceend_y = pos[1]# 移动鼠标到起始位置pyautogui.moveTo(start_x, start_y, duration=0.3)# 按下鼠标左键pyautogui.mouseDown()# 往右多拖到20xppyautogui.moveTo(end_x - 20, end_y - 20, duration=0.4)#拖回结束位置pyautogui.moveTo(end_x, end_y, duration=0.5)# 松开鼠标左键pyautogui.mouseUp()if __name__ == '__main__':##chromedriver.exe 位置:C:\Users\Administrator\AppData\Local\Programs\Python\Python311driver = webdriver.Chrome()login(driver)time.sleep(5)##自动输入卡号driver.find_element(By.XPATH,'/html/body/div[4]/div/div/div[2]/div/div[1]/div/div/div/div/div[2]/div[2]/div[2]/input').send_keys(card_id)##点击按钮driver.execute_script('document.querySelector("#root > div:nth-child(1) > div > div > div > div > div.bind-card > div.bind-form.clearfix > div:nth-child(3) > div").click()')time.sleep(3)# 滑块验证、点选验证for index in range(100):print('滑块验证,执行第: ', index)if not slide_verify():breaktime.sleep(3)time.sleep(10)

七、python通过selenium自动登录及轻松过滑块验证、点选验证码视频演示

python通过selenium自动登录及轻松过滑块验证、点选验证码改进版视频演示_哔哩哔哩_bilibili

技术支持:

metabycf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/355771.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

V4和V6双栈处理

现进行双栈 对R1 对R2 对R3 对R4 路由地址配完,起协议 然后起ripng,在R2,R3,R4上都宣告一下 然后在PC1和PC2上都手动配置一下就可以了

Kafka第一篇——内部组件概念架构启动服务器zookeeper选举以及底层原理

目录 引入 ——为什么分布式系统需要用第三方软件? JMS 对比 组件 架构推演——备份实现安全可靠 , Zookeeper controller的选举 controller和broker底层通信原理 BROKER内部组件 ​编辑 topic创建 引入 ——为什么分布式系统需要用第三方软件&#…

游戏开发丨基于Tkinter的五子棋小游戏

文章目录 写在前面Tkinter五子棋系列文章写在后面 写在前面 本期内容:基于tkinter的五子棋小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700190 实验环境 python3.11及以上pycharmtkinter Tkinter Tkinter是Python的一个标准…

刷题记录(240613)

aliyun0512 1. 小红定义一个数组是好数组,当且仅当所有奇数出现了奇数次,所有偶数出现了偶数次。现在小红拿到了一个数组,她希望取一个该数组的非空子序列(可以不连续),使得子序列是好数组。你能帮小红求出子序列的方案数吗?由于…

C# Winform Datagridview控件使用和详解

DataGridView 是一种以表格形式显示数据的控件,由Rows(行),Columns(列),Cells(单元格)构成。本实例将综合利用DataGridView的属性和事件,展示不同的表格风格数据和操作。包含: 添加Datagridview行,列数据设…

APP IOS

APP IOS苹果源生应用程序 APP Android-CSDN博客

【Python/Pytorch 】-- K-means聚类算法

文章目录 文章目录 00 写在前面01 基于Python版本的K-means代码02 X-means方法03 最小二乘法简单理解04 贝叶斯信息准则 00 写在前面 时间演变聚类算法:将时间演变聚类算法用在去噪上,基本思想是,具有相似信号演化的体素具有相似的模型参数…

【开源项目】智慧北京案例~超经典实景三维数字孪生智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码!

飞渡科技数字孪生北京管理平台, 依托实景数字孪生底座,以城市感知网络为硬件基础,以城市大数据为核心资源,以数字孪生、云计算、人工智能为关键技术,实现城市产业规划、资产安全管理、城市能耗监控等一体化空间融合。 …

实现锚点链接点击tab跳转到指定位置 并且滚动鼠标顶部锚点的样式也跟随变化

实现效果如下 不管是点击还是 滚动鼠标 顶部的样式也会跟随变化 点击会跳转到指定的位置 通过IntersectionObserver 监听是否可见 下面代码可以直接执行到vue的文件 <template><div><ul class"nav"><li v-for"tab in tabs" :key…

Java——访问修饰符

一、访问修饰符是什么 Java中的访问修饰符用于控制类、接口、构造函数、方法和数据成员&#xff08;字段&#xff09;的可见性和访问级别。 Java提供了四种访问修饰符&#xff1a; 访问修饰符同一类内同一包内不同包的子类不同包的非子类适用对象public可见可见可见可见类、…

第 7 章: 对象关系映射

在第 6 章中&#xff0c;我们大概了解了如何通过 JDBC 来进行简单的数据库操作。通过 SQL 来执行操作虽然不算复杂&#xff0c;但在面向对象的语言中&#xff0c;这类操作多少显得有些格格不入&#xff0c;毕竟我们都是在与“对象”打交道。把对象与关系型数据库关联起来&#…

【目标检测】图解 DETR 系统框图

简略版本 Backbone&#xff1a;CNN backbone 学习图像的 2D 特征Positional Encoding&#xff1a;将 2D 特征展平&#xff0c;并对其使用位置编码&#xff08;positional encoding&#xff09;Encoder&#xff1a;经过 Transformer 的 encoderDecoder&#xff1a;encoder 的输出…

光纤中的数值 2.405 是怎么一回事?

在光纤通信中,光线的传播依赖于纤芯和包层之间的折射率差异。 即,当光线从纤芯入射到界面上时,如果入射角大于临界角 θ0,将发生全反射,没有光能量透射至包层而泄漏出去,此即光纤导光原理。 反映到光纤的端面,在光纤端面的光线,当入射角必须小于光纤的孔径角 α0 ,此时…

laravel中如何向字段标签添加工具提示

首先&#xff0c;您可以使用 轻松自定义字段标签->label()。我相信您知道这一点。但您知道吗……标签输出未转义&#xff1f;这意味着您也可以在标签中包含 HTML。 为了尽快实现上述目标&#xff0c;我只是采取了一个快速而粗糙的解决方案&#xff1a; CRUD::field(nickna…

Python 修炼|人人编程手册|001 计算思维

在微信中阅读,关注公众号:CodeFit。 > 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注,为我的 持续创作 提供 动力! 1. 计算思维 在我们正式开启 Python 修炼之旅前,先来了解一个关键的概念 —— 计算思维。 计算思维,其核心本质在于 抽象 …

学生护眼大路灯应该怎么选?五款护眼大路灯对比推荐

我们都知道光线无处不在&#xff0c;想要减少近视隐患&#xff0c;就不得不提一下护眼灯了&#xff0c;特别是经常坐在电脑前码字的上班族以及深夜还在学习的学生党这一类人群&#xff0c;经常用眼光线不好不仅影响视力健康&#xff0c;还会影响效率。而一款护眼灯能够提供柔和…

阐述一下Golang中defer的原理

基本用法 在Go语言中&#xff0c;defer关键字用于在函数返回前执行一段代码或调用一个清理函数。这对于处理文件关闭、解锁或者返回一些资源到资源池等操作非常有用。 其基本用法如下所示&#xff1a; package mainimport "fmt"func main() {example() }func exam…

AI穿戴设备是未来手机的终结者?中国AI商业化的未来预测

AI技术的发展正处于商业化应用的关键阶段&#xff0c;而中国在互联网时代已凭借商业化应用逆袭。AI算法大模型虽强大&#xff0c;但真正普惠民众需与设备深度结合。穿戴式智能设备就成为了新战场&#xff0c;AI算法与穿戴设备结合能释放更大工作效率。私人助理AI将成趋势&#…

AI口语练习APP的开发流程

开发AI口语练习APP是一个持续的过程&#xff0c;需要多学科团队的紧密合作&#xff0c;包括产品经理、UI/UX设计师、前后端开发者、机器学习工程师、测试工程师和市场运营人员等。随着技术的发展和用户需求的变化&#xff0c;开发流程可能需要相应地进行调整和优化。AI口语练习…

【学习笔记】Mybatis-Plus(二) :常用注解

常用注解 注解含义应用场景TableName表名注解&#xff0c;标识实体类对应的表表名和实体类名称不一致TableId主键注解&#xff0c;标识实体类的主键主键需要指定自增长TableField字段注解数据库名称和字段名称不一致TableLogic逻辑删除不是真正物理删除数据KeySequence序列主键…