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] + distance
    end_y = pos[1]
    # 移动鼠标到起始位置
    pyautogui.moveTo(start_x, start_y, duration=0.3)
    # 按下鼠标左键
    pyautogui.mouseDown()
    # 往右多拖到20xp
    pyautogui.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, io

from 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 ImageGrab

from 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 True
    except Exception as e:
        print('click_verify err:', e)
        return False


def 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)+30
        print(ret)
        ##鼠标操作
        slide_mouse(lo_small,ret )
        return True
    except Exception as e:
        print('card_slide err:', e)
        ##转到点选验证
        ret=click_verify()
        if ret==True:return True
        else:return False
        return False


def slide_mouse(pos,distance):
    ##滑块验证 移动鼠标

    start_x = pos[0]
    start_y = pos[1]
    end_x = pos[0] + distance
    end_y = pos[1]
    # 移动鼠标到起始位置
    pyautogui.moveTo(start_x, start_y, duration=0.3)
    # 按下鼠标左键
    pyautogui.mouseDown()
    # 往右多拖到20xp
    pyautogui.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\Python311
    driver = 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():break
        time.sleep(3)

    time.sleep(10)

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

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

技术支持:

metabycf

  • 23
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用 Python + Selenium 自动识别文字点选验证码的方法如下: 1. 安装 Selenium 库和对应的浏览器驱动; 2. 使用 Selenium 打开网页并获取验证码图片; 3. 使用 OCR 技术识别图片中的文字; 4. 使用 Selenium 点击图片中对应文字的位置。 代码示例: ``` from selenium import webdriver from selenium.webdriver.common.by import By # 启动浏览器 driver = webdriver.Chrome() # 打开页面 driver.get("https://www.example.com/verify") # 获取验证码图片并识别文字 code = recognize_verify_code(driver.find_element(By.CSS_SELECTOR, "#verify-code").screenshot_as_png) # 点击图片中对应文字的位置 driver.find_element(By.CSS_SELECTOR, f"#verify-code .verify-item[title='{code}']").click() ``` 其中 `recognize_verify_code` 函数需要自行实现,可以使用第三方 OCR 库,如 Tesseract。 ### 回答2: 要使用PythonSelenium自动识别文字点选验证码,可以按照以下步骤进行: 1. 安装必要的软件和库: - 安装Python:从Python官方网站下载并安装Python。 - 安装Selenium:使用pip命令安装Selenium库,可以使用以下命令:`pip install selenium`。 - 安装webdriver:下载并安装适合您浏览器版本的webdriver,可以使用chromedriver或geckodriver。 2. 导入所需的库和模块: ```python from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC ``` 3. 启动浏览器驱动程序: ```python driver = webdriver.Chrome() # 如果使用Chrome浏览器 ``` 4. 打开目标网页: ```python driver.get("目标网页的URL") ``` 5. 定位验证码元素和识别区域: ```python captcha_element = driver.find_element(By.XPATH, "验证码元素的XPath") captcha_area = driver.find_element(By.XPATH, "识别区域的XPath") ``` 6. 截取验证码图片: ```python captcha_image = captcha_area.screenshot_as_png ``` 7. 使用第三方验证码识别库处理验证码图片: ```python # 这里假设使用了Tesseract OCR库来识别验证码 from PIL import Image import pytesseract captcha_text = pytesseract.image_to_string(Image.open(captcha_image)) ``` 8. 识别出的验证码文本作为答案,执行点击动作: ```python actions = ActionChains(driver) actions.move_to_element(captcha_element).click().send_keys(captcha_text).perform() ``` 9. 提交验证码: ```python submit_button = driver.find_element(By.XPATH, "提交按钮的XPath") submit_button.click() ``` 10. 等待页面加载完成,进行后续操作。 以上是一个基本的框架。具体步骤会根据网页的具体设计和验证码类型而有所不同。自动识别文字点选验证码是一项复杂的任务,需要不断调试和优化识别算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值