chipslays/cracker

破解,破解,再破解!

1.0.5 2021-02-05 10:56 UTC

This package is auto-updated.

Last update: 2024-09-08 03:59:31 UTC


README

Steam游戏服务中的自动验证码识别。

问题

在编写Steam Client库时,我遇到了验证码输入的问题。在某个时候,不断的输入验证码变得令人烦恼,因此决定进行验证码识别。

解决方案

识别使用Tesseract OCR + 基于约5000个不同验证码单独训练的模型(语言文件)。

模型训练基于这个仓库。

识别过程如下:每次生成验证码图片的链接都会在一定时间内生成相同的文本,然后死亡。但是图片上的文本始终相同,只是字母和噪音的随机性不同。因此,基于这一点,设定了识别的迭代次数,例如10次迭代,在循环结束后,选择出现频率最高的字符。

依赖

Imagick

Tesseract OCR

训练模型(提高识别率)

安装

$ composer require chipslays/cracker

使用

use Cracker\Crack;

require 'vendor/autoload.php';


/**
 * Можно передать файл или ссылку.
 * Например:
 *      https://steamcommunity.com/public/captcha.php?gid=387475048XXXXXXXXXXXXXXXX
 *      images/captcha.png
 */
$cracked = (new Crack('https://raw.githubusercontent.com/chipslays/cracker/master/.github/captcha.png'))
    ->temp(__DIR__ . '/storage') // папка для временных файлов
    ->tessdata(__DIR__) // указываем путь где храняться модели
    ->model('steam') // используем свою модель
    ->iterations(1) // количество итераций
    ->resolve(true); // true - вернуть массив

print_r($cracked);

/** output */
Array
(
    [sortedChars] => Array
        (
            [0] => Array
                (
                    [M] => 1
                )

            [1] => Array
                (
                    [J] => 1
                )

            [2] => Array
                (
                    [X] => 1
                )

            [3] => Array
                (
                    [N] => 1
                )

            [4] => Array
                (
                    [P] => 1
                )

            [5] => Array
                (
                    [9] => 1
                )

        )

    [mostUsedChars] => Array
        (
            [0] => M
            [1] => J
            [2] => X
            [3] => N
            [4] => P
            [5] => 9
        )

    [captcha] => MJXNP9
    [time] => 0.9768
)

验证码: MJXNP9

从结果来看,在sortedChars中,三次迭代都识别出了相同的字符。

执行时间(键time)为0.9秒,迭代次数越多,识别所需时间越长。

示例中指定了训练模型,它只需要1次迭代就能正确识别,但由于图像被修改,在某些情况下可能会出现一些错误,比如字母被填充或者相反,字母完全看不见,或者只看得见一小部分,在这种情况下当然会有误差。

注意!此仓库不包含训练模型,因此您需要自行收集数据并对其进行训练。我只是表明这是可行的。有关训练的信息在这里

可以尝试使用标准模型eng

$cracked = (new Crack($fileOrUrl))
    ->temp(__DIR__ . '/storage')
    ->model('eng')
    ->iterations(10)
    ->resolve(true);

对于模型eng需要更多的迭代和时间,但识别质量在任何情况下都还有待提高。

待办事项

  • 代码重构
  • 修改图像的可能性