使用 Python 自动识别点触验证码

1. 目标
本节的目标是使用 Python 语言通过程序自动识别并通过点触验证码。

2. 准备工作
我们将使用 Python 的 Selenium 库和 Chrome 浏览器。请确保已经安装好了 Selenium WebDriver 和 Chrome 浏览器,并配置好了 ChromeDriver。相关的安装和配置可以参考 Selenium 官方文档。

安装必要的 Python 库:

bash

pip install selenium pillow requests
3. 了解点触验证码
点触验证码是一种需要用户点击图像中特定文字或图案的验证方式。此类验证码的识别难度较大,因此我们将借助第三方验证码识别平台(如超级鹰)来实现自动化。  更多内容联系1436423940

4. 识别思路
直接通过图像识别技术来识别点触验证码难度较大,尤其是复杂的文字和图像。我们将利用超级鹰提供的服务,通过提交验证码图片获取识别结果,然后模拟点击识别出的坐标位置。

5. 注册账号
首先需要注册一个超级鹰账号并申请一个软件 ID。可以在超级鹰官网进行注册。注册完成后,在开发者中心添加一个软件 ID,并充值一些题分。

6. 获取 API
超级鹰提供了适用于 Python 的 API。以下是 Python 的 API 实现代码:

python

import requests
import hashlib
import json

class Chaojiying:
    def __init__(self, username, password, soft_id):
        self.username = username
        self.password = self._md5(password)
        self.soft_id = soft_id
        self.base_url = 'http://upload.chaojiying.net/'

    def _md5(self, s):
        return hashlib.md5(s.encode('utf-8')).hexdigest()

    def post_pic(self, im, codetype):
        url = self.base_url + 'Upload/Processing.php'
        files = {'userfile': ('captcha.jpg', im)}
        data = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
            'codetype': codetype,
        }
        response = requests.post(url, data=data, files=files)
        return response.json()

    def report_error(self, im_id):
        url = self.base_url + 'Upload/ReportError.php'
        data = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
            'id': im_id,
        }
        response = requests.post(url, data=data)
        return response.json()
7. 初始化
首先,我们初始化一些变量和对象,如 WebDriver 和 Chaojiying 对象:

python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from PIL import Image
import time
import io

EMAIL = 'your_email@example.com'
PASSWORD = 'your_password'
CHAOJIYING_USERNAME = 'your_username'
CHAOJIYING_PASSWORD = 'your_password'
CHAOJIYING_SOFT_ID = 'your_soft_id'
CHAOJIYING_KIND = 9102

class CrackTouClick:
    def __init__(self):
        self.driver = webdriver.Chrome(executable_path='path_to_chromedriver')
        self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)

    def open(self):
        self.driver.get("http://admin.touclick.com/login.html")
        email_field = self.driver.find_element(By.ID, "email")
        password_field = self.driver.find_element(By.ID, "password")
        email_field.send_keys(EMAIL)
        password_field.send_keys(PASSWORD)

    def get_touclick_button(self):
        return self.driver.find_element(By.CLASS_NAME, "touclick-hod-wrap")

    def get_touclick_element(self):
        return self.driver.find_element(By.CLASS_NAME, "touclick-pub-content")

    def get_position(self):
        element = self.get_touclick_element()
        location = element.location
        size = element.size
        return (location['x'], location['y'], size['width'], size['height'])

    def get_screenshot(self):
        screenshot = self.driver.get_screenshot_as_png()
        return Image.open(io.BytesIO(screenshot))

    def get_touclick_image(self):
        screenshot = self.get_screenshot()
        position = self.get_position()
        return screenshot.crop((position[0], position[1], position[0] + position[2], position[1] + position[3]))

    def recognize_captcha(self):
        image = self.get_touclick_image()
        buffered = io.BytesIO()
        image.save(buffered, format="PNG")
        img_str = buffered.getvalue()
        return self.chaojiying.post_pic(img_str, CHAOJIYING_KIND)

    def main(self):
        self.open()
        self.get_touclick_button().click()
        time.sleep(2) # 等待验证码加载

        result = self.recognize_captcha()
        print(result)

        if 'pic_str' in result:
            pic_str = result['pic_str']
            locations = self.get_points(pic_str)
            self.touch_click_words(locations)

    def get_points(self, coordinates):
        points = []
        groups = coordinates.split('|')
        for group in groups:
            parts = group.split(',')
            points.append((int(parts[0]), int(parts[1])))
        return points

    def touch_click_words(self, locations):
        element = self.get_touclick_element()
        for location in locations:
            ActionChains(self.driver).move_to_element_with_offset(element, location[0], location[1]).click().perform()
            time.sleep(1)

if __name__ == "__main__":
    crack_touclick = CrackTouClick()
    crack_touclick.main()
8. 识别验证码
调用 Chaojiying 对象的 post_pic 方法提交图片进行识别,并获取识别结果。代码如下:

python

if __name__ == "__main__":
    crack_touclick = CrackTouClick()
    crack_touclick.main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值