chipslays / cracker
破解,破解,再破解!
1.0.5
2021-02-05 10:56 UTC
Requires
- guzzlehttp/guzzle: 7.0
- intervention/image: ^2.5
- thiagoalessio/tesseract_ocr: ^2.9
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 )
从结果来看,在sortedChars
中,三次迭代都识别出了相同的字符。
执行时间(键time
)为0.9秒,迭代次数越多,识别所需时间越长。
示例中指定了训练模型,它只需要1次迭代就能正确识别,但由于图像被修改,在某些情况下可能会出现一些错误,比如字母被填充或者相反,字母完全看不见,或者只看得见一小部分,在这种情况下当然会有误差。
注意!此仓库不包含训练模型,因此您需要自行收集数据并对其进行训练。我只是表明这是可行的。有关训练的信息在这里。
可以尝试使用标准模型eng
$cracked = (new Crack($fileOrUrl)) ->temp(__DIR__ . '/storage') ->model('eng') ->iterations(10) ->resolve(true);
对于模型eng
需要更多的迭代和时间,但识别质量在任何情况下都还有待提高。
待办事项
- 代码重构
- 修改图像的可能性