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

news2025/2/26 9:32:53

一、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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用powershell筛选AD域控不能自主更改的用户并变更

# 查询“用户不能更改密码”为勾选状态的所有域用户,将域账户、姓名、勾选状态作为结果保存到C:\result\result.csvGet-ADUser -Filter * -Properties CannotChangePassword | Where-Object { $_.CannotChangePassword -eq $true } | Select SamAccountName, Name, …

LabVIEW超导体临界电流与磁场变化检测系统

一、项目背景 某高校物理实验室需要开发一套检测系统,用于研究超导体在不同条件下的临界电流和磁场变化情况。该系统需满足实验教学和科研的双重需求,提供高精度的数据采集和处理功能。 二、系统设计与实现 1. 硬件配置 高精度电流传感器:…

实例化游戏物体的实例(生成游戏物体)

一、实例1:实例化 1、准备工作:制备预制体,命名。如Circle 2、Create Empty,名字自取。如:CirclePrefab 3、给CirclePrefab添加Test.cs public GameObject CirclePrefab; // 预制体变量,用于存储Circle预…

Golang免杀-编码加密-Xor(GG)

go语言环境搭建 Golang学习日志 ━━ 下载及安装_golang下载-CSDN博客 go run xxx.go go build xxx.go 首先,cs.msf生成比特流数据. 放入xor,py脚本中进行xor加密. xor.py def xor(shellcode, key):new_shellcode ""key_len len(key)# 对shellcode的每一位进行…

有监督学习——线性回归

1. 线性模型 有监督学习是通过已知的样本产生预测模型的学习方法,任何有监督学习模型都可被想象成一个函数: 其中,\(x_1,x_2,x_3…x_n\)是模型的n维的特征值,\(y\)是要预测的目标值/分类,当\(y\)是可枚举的类型时&…

【leetcode--字母异位词分组】

class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:np collections.defaultdict(list)for st in strs:name "".join(sorted(st))np[name].append(st)return list(np.values()) collections.defaultdict(list)创建字典类型&#xff…

给你一个扫码支付的二维码,如何写测试用例?

前言 面试的时候,经常会临场出题:给你一个xxx, 如何测试, 或者说如何写测试用例?xxx可以是圆珠笔,水杯,电梯等生活中常见的场景。 那么给你一个支付的二维码,如何写测试用例呢? 二维码扫码支…

Vue路由守卫的使用

示例如下:(第一张图)当你点击车1的时候你写了路由守卫就点不开出现无权访问 (第二张图,就是可以访问后的图)有路由守卫点不开的情况下当你在本地存储中写了你在路由守卫中写的东西就可以进入了 你需要在r…

材料科学SCI期刊,中科院3区,IF=3.8,专业性强

一、期刊名称 Materials Today Communications 二、期刊简介概况 期刊类型:SCI 学科领域:材料科学 影响因子:3.8 中科院分区:3区 三、期刊征稿范围 《今日材料通讯》是一本范围广泛、多学科、快速出版的期刊,专注…

【docker】Dockerfile制作基础镜像 python 底层镜像制作 | 打包所有的requirement依赖

一、Dockerfile思想 我们正常的对一个项目进行打包 docker image 通常是在CI工具编译时进行对依赖的安装,比如golang的go get、python的pip install、node的npm install 等等 好处:我们更新了依赖可以动态的再编译时进行一个对依赖的更新 坏处&#xf…

Spring 内置BeanFactoryPostProcessor的子孙们

同样的Spring 也 内置了 一些实现 BeanFactoryPostProcessor的类,各有各的用处。 spring-context AspectJWeavingEnabler 用来把ClassPreProcessorAgentAdapter注册到LoadTimeWeaver中ConfigurationClassPostProcessor 一个重要的类,用来处理Configurat…

Redis应用:基于Redis实现排行榜、点赞、关注功能

文章目录 1. 环境准备2. 实现排行榜功能2.1 添加用户分数2.2 获取排行榜2.3 获取用户排名2.4 更新用户分数示例代码3. 实现点赞功能3.1 添加点赞3.2 获取点赞数3.3 检查用户是否点赞3.4 取消点赞示例代码4. 实现关注功能4.1 添加关注4.2 获取粉丝列表4.3 获取关注列表4.4 取消关…

【区间合并 差分 栈】3169. 无需开会的工作日

本文涉及知识点 区间合并 差分数组(大约2024年7月1号发) LeetCode3169. 无需开会的工作日 给你一个正整数 days,表示员工可工作的总天数(从第 1 天开始)。另给你一个二维数组 meetings,长度为 n,其中 me…

简易五子棋

简介 使用Java实现简易五子棋 规则介绍 游戏使用一个标准的1515方格的棋盘,双方分别用黑白两种颜色的棋子进行对战。黑子先行,双方轮流在空棋盘的交叉点上落子,每人一次只能落一子。游戏的目标是让自己的五颗棋子连成一线,这条…

BSCI验厂是什么?

BSCI验厂是指Business Social Compliance Initiative,即倡议商界遵守社会责任组织对BSCI组织成员的全球供应商进行的社会责任审核。以下是对BSCI验厂的详细介绍: 背景介绍: 2003年3月,总部设在比利时布鲁塞尔的对外贸易协会FTA正式…

618网络机顶盒哪个牌子好?内行盘点网络机顶盒排行榜

因工作原因每天都在跟各种类型的网络机顶盒打交道,最近超多朋友问我网络机顶盒哪个牌子好,不知道如何挑选网络机顶盒,我将要分享目前最值得入手的网络机顶盒排行榜,想买网络机顶盒可以看看以下这些品牌: ★泰捷WEBOX 6…

在ubuntu16中下载VMware Tools工具

一、打开植入 二、开始安装 打开驱动放置的默认位置 在这里打开终端;添加到/home/你的用户名/Downloand/中 进入后解压 然后进去解压后的文件 终端输入 sudo ./vmware-install.pl 开始安装前的配置(很麻烦跟着输就行) 继续 出现如上…

机器学习笔记:focal loss

1 介绍 Focal Loss 是一种在类别不平衡的情况下改善模型性能的损失函数最初在 2017 年的论文《Focal Loss for Dense Object Detection》中提出这种损失函数主要用于解决在有挑战性的对象检测任务中,易分类的负样本占据主导地位的问题,从而导致模型难以…

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分,不仅可以方便地连接手机,还能轻松连接电脑,让我们在工作和娱乐时享受无线的自由。然而,对于一些用户来说,将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…

JAVA面试常见面试问题02

1、jvm 内存结构图 对jvm直观的了解 答: jvm是一个抽象执行环境,它通过加载字节码、实现跨平台运行、管理内存(包括自动垃圾回收)、优化代码执行等,为Java程序提供运行时支持 2、内存泄漏 和 内存溢出 答&#xf…