当前位置: 首页 > article >正文

中文点选识别

中文点选识别

测试网站:https://www.geetest.com/adaptive-captcha-demo

1. 开始验证

# 1.打开首页
driver.get('https://www.geetest.com/adaptive-captcha-demo')

# 2.点击【文字点选验证】
tag = WebDriverWait(driver, 30, 0.5).until(lambda dv: dv.find_element(
    By.XPATH,
    '//*[@id="gt-showZh-mobile"]/div/section/div/div[2]/div[1]/div[2]/div[3]/div[4]'
))
tag.click()

# 3.点击开始验证
tag = WebDriverWait(driver, 30, 0.5).until(lambda dv: dv.find_element(
    By.CLASS_NAME,
    'geetest_btn_click'
))
tag.click()

time.sleep(5)

请添加图片描述

2. 获取图片

# 要识别的目标图片
parent = driver.find_element(By.CLASS_NAME, 'geetest_ques_back')
tag_list = parent.find_elements(By.TAG_NAME, "img")

3. 目标文字识别

target_word_list = []
for tag in tag_list:
    ocr = ddddocr.DdddOcr(show_ad=False)
    word = ocr.classification(tag.screenshot_as_png)
    target_word_list.append(word)

print("要识别的文字:", target_word_list)

4. 背景坐标识别

超级鹰:https://www.chaojiying.com/

import base64
import requests

res = requests.post(
    url='http://upload.chaojiying.net/Upload/Processing.php',
    data={
        'user': "自己的用户名",
        'pass': "自己的密码",
        'codetype': "9501",
        'file_base64': base64.b64encode(content)
    },
    headers={
        'Connection': 'Keep-Alive',
        'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
    }
)

res_dict = res.json()
print(res_dict)

结果:

请添加图片描述

将结果封装成字典,方便后续找到相应的字并点击

bg_word_dict = {}
for item in res_dict["pic_str"].split("|"):
    word, x, y = item.split(",")
    bg_word_dict[word] = (x, y)
print(bg_word_dict)

请添加图片描述

5. 坐标点击

根据坐标,在验证码上进行点击。

# 8.点击
from selenium.webdriver import ActionChains

for word in target_word_list:
    time.sleep(0.5)
    group = bg_word_dict.get(word)
    if not group:
        continue
        x, y = group
        x = int(x) - int(bg_tag.size['width'] / 2)
        y = int(y) - int(bg_tag.size['height'] / 2)  # 超级鹰获取到的坐标原点为图片左上角,而我们需要的坐标原点为图片中心,所以需要进行转换。
        ActionChains(driver).move_to_element_with_offset(bg_tag, xoffset=x, yoffset=y).click().perform()
        time.sleep(1000)
        driver.close()

结果:

请添加图片描述

6. 完整代码

import base64
import time

import ddddocr
import requests
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Edge()
# 1.打开首页
driver.get('https://www.geetest.com/adaptive-captcha-demo')

# 2.点击【文字点选验证】
tag = WebDriverWait(driver, 30, 0.5).until(lambda dv: dv.find_element(
    By.XPATH,
    '//*[@id="gt-showZh-mobile"]/div/section/div/div[2]/div[1]/div[2]/div[3]/div[4]'
))
tag.click()

# 3.点击开始验证
tag = WebDriverWait(driver, 30, 0.5).until(lambda dv: dv.find_element(
    By.CLASS_NAME,
    'geetest_btn_click'
))
tag.click()

time.sleep(3)

# 要识别的目标图片
parent = driver.find_element(By.CLASS_NAME, 'geetest_ques_back')
tag_list = parent.find_elements(By.TAG_NAME, "img")

# 识别图片
target_word_list = []
for tag in tag_list:
    ocr = ddddocr.DdddOcr(show_ad=False)
    word = ocr.classification(tag.screenshot_as_png)
    target_word_list.append(word)

print("要识别的文字:", target_word_list)

# 6.背景图片
bg_tag = driver.find_element(
    By.CLASS_NAME,
    'geetest_bg'
)
content = bg_tag.screenshot_as_png

# 7.识别背景中的所有文字并获取坐标
ocr = ddddocr.DdddOcr(show_ad=False, det=True)
poses = ocr.detection(content)  

res = requests.post(
    url='http://upload.chaojiying.net/Upload/Processing.php',
    data={
        'user': "自己的用户名",
        'pass': "自己的密码",
        'codetype': "9501",
        'file_base64': base64.b64encode(content)
    },
    headers={
        'Connection': 'Keep-Alive',
        'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
    }
)

res_dict = res.json()
print(res_dict)

# 封装成字典
bg_word_dict = {}
for item in res_dict["pic_str"].split("|"):
    word, x, y = item.split(""
                            ",")
    bg_word_dict[word] = (x, y)
print(bg_word_dict)

# 8.点击
for word in target_word_list:
    time.sleep(0.5)
    group = bg_word_dict.get(word)
    if not group:
        continue
    x, y = group
    x = int(x) - int(bg_tag.size['width'] / 2)
    y = int(y) - int(bg_tag.size['height'] / 2)  # 超级鹰获取到的坐标原点为图片左上角,而我们需要的坐标原点为图片中心,所以需要进行转换。
    ActionChains(driver).move_to_element_with_offset(bg_tag, xoffset=x, yoffset=y).click().perform()

time.sleep(5)
driver.close()

http://www.kler.cn/a/234101.html

相关文章:

  • 现代无线通信接收机架构:超外差、零中频与低中频的比较分析
  • 【C#设计模式(4)——构建者模式(Builder Pattern)】
  • Vue计算属性computed
  • UAC2.0 speaker——同时支持 16bit,24bit 和 32bit
  • websocket初始化
  • 手动实现promise的all,race,finally方法
  • c#安全-nativeAOT
  • 【java】Hibernate访问数据库
  • 快团团大团长加了微信都不回复怎么回事?如果自己做快团团预算需要多少,团队需要几个人
  • Java 将TXT文本文件转换为PDF文件
  • 前端-Vue項目初始化
  • AJAX——认识URL
  • 灰度发布浅见
  • Flink-CDC实时读Postgresql数据
  • HiveSQL——连续增长问题
  • ECMAScript Modules规范的示例详解
  • 微信小程序(四十)API的封装与调用
  • 【J2EE笔记】2万字!我当时学习时做的笔记
  • vue3 之 商城项目—项目搭建起步
  • JAVA学习笔记9
  • 力扣[面试题 01.02. 判定是否互为字符重排(哈希表,位图)
  • 使用client-only 解决组件不兼容SSR问题
  • 【十四】【C++】list 的常见用法
  • 【Qt 学习之路】在 Qt 使用 ZeroMQ
  • Rust基础拾遗--核心功能
  • 深入探究 HTTP 简化:httplib 库介绍