phpcfdi / image-captcha-resolver
用于解决图像验证码的连接器
Requires
- php: >=7.3
- ext-fileinfo: *
- ext-json: *
- php-http/discovery: ^1.14
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^1.1 || ^2.0
- symfony/polyfill-php80: ^1.23
Requires (Dev)
- guzzlehttp/guzzle: ^7.3
- guzzlehttp/psr7: ^2.0
- php-http/guzzle7-adapter: ^1.0
- php-http/mock-client: ^1.4
- phpunit/phpunit: ^9.5
- symfony/process: ^5.3
- vlucas/phpdotenv: ^5.3
Suggests
- symfony/process: To implement recommended CommandLineResolver
README
用于解决图像验证码的连接器
🇺🇸 该项目的文档是西班牙语,因为这是目标受众的自然语言。
关于 phpcfdi/image-captcha-resolver
这个库包含了一些流行或测试服务的连接器,用于解决验证码。
它被用于一些 PhpCfdi 的项目。
安装
使用 composer
composer require phpcfdi/image-captcha-resolver
为了正确实现,可能还需要安装一些额外的包。请参阅 https://docs.php-http.org/en/latest/clients.html
# uso de guzzle, con el adaptador del cliente y su contructor de request y response composer require guzzlehttp/guzzle php-http/guzzle7-adapter guzzlehttp/psr7 # uso de symfony http client con nyholm/psr7 como constructor de request y response composer require symfony/http-client nyholm/psr7 # uso de cliente basado en curl con laminas/laminas-diactoros como constructor de request y response composer require php-http/curl-client laminas/laminas-diactoros
然而,如果您正在开发一个库,则应将 php-http/mock-client
包和任何消息工厂(在 composer.json:require-dev
)用作客户端依赖项。
基本用法
调用解决验证码
对于此示例,假设已经存在一个在 $resolver
中的验证码解决器,并且验证码图像作为嵌入式图像存在,其内容在 $theImgElementSrcAtributte
中。
<?php declare(strict_types=1); use PhpCfdi\ImageCaptchaResolver\CaptchaImage; use PhpCfdi\ImageCaptchaResolver\CaptchaResolverInterface; use PhpCfdi\ImageCaptchaResolver\UnableToResolveCaptchaException; /** * @var string $theImgElementSrcAtributte * @var CaptchaResolverInterface $resolver */ $image = CaptchaImage::newFromInlineHtml($theImgElementSrcAtributte); try { $answer = $resolver->resolve($image); } catch (UnableToResolveCaptchaException $exception) { echo 'No se pudo resolver el captcha', PHP_EOL; return; } echo "Respuesta del captcha: {$answer->getValue()}", PHP_EOL;
创建基于 Anti-Captcha 的验证码解决器
创建解决器可以有两种方式:具体方式和发现方式。
<?php declare(strict_types=1); use PhpCfdi\ImageCaptchaResolver\Resolvers\AntiCaptchaResolver; use PhpCfdi\ImageCaptchaResolver\Timer\Timer; /** * @var string $clientKey La clave de cliente para conectarse a anti-captcha */ // Se puede crear el resolvedor usando los parámetros predefinidos $resolverDefault = AntiCaptchaResolver::create($clientKey); // O especificando parámetros funcionales $resolverWithSettings = AntiCaptchaResolver::create( $clientKey, 5, // segundos antes de intentar leer la respuesta 60, // segundos antes de considerar que el captcha no tiene solución 500 // milisegundos antes de reintentar obtener la respuesta ); // O directamente creando los objetos $resolverConstructed = new AntiCaptchaResolver( new AntiCaptchaResolver\AntiCaptchaConnector($clientKey), new Timer(4, 60, 500) );
创建基于 Local Captcha Resolver 的验证码解决器
创建解决器可以有两种方式:具体方式和发现方式。
服务: https://github.com/eclipxe13/captcha-local-resolver
<?php declare(strict_types=1); use PhpCfdi\ImageCaptchaResolver\Resolvers\CaptchaLocalResolver; use PhpCfdi\ImageCaptchaResolver\Timer\Timer; /** * @var string $baseUrl La dirección donde está corriendo el servicio, como http://localhost:9095 */ // Se puede crear el resolvedor usando los parámetros predefinidos $resolverDefault = CaptchaLocalResolver::create($baseUrl); // O especificando parámetros funcionales $resolverWithSettings = CaptchaLocalResolver::create( $baseUrl, 5, // segundos antes de intentar leer la respuesta 60, // segundos antes de considerar que el captcha no tiene solución 500 // milisegundos antes de reintentar obtener la respuesta ); // O directamente creando los objetos $resolverConstructed = new CaptchaLocalResolver( new CaptchaLocalResolver\CaptchaLocalResolverConnector($baseUrl), new Timer(4, 60, 500) );
创建基于命令行的验证码解决器
实现取决于所使用的工具,很可能会为工具创建一个自己的入口点,以便返回正确的 exit code 和响应。
如果可以使用像 tesseract
这样的工具来解决验证码,则此工具可能很有用。
以下示例假设您有一个要解决的验证码图像在 $image
中,并且存在一个名为 my-captcha-breaker
的命令,它接受一个图像并从输出的最后一行返回验证码的响应。
<?php declare(strict_types=1); use PhpCfdi\ImageCaptchaResolver\CaptchaImageInterface; use PhpCfdi\ImageCaptchaResolver\Resolvers\CommandLineResolver; use PhpCfdi\ImageCaptchaResolver\UnableToResolveCaptchaException; /** * @var CaptchaImageInterface $image */ $resolver = CommandLineResolver::create(explode(' ', 'my-captcha-breaker --in {file} --stdout')); try { $answer = $resolver->resolve($image); } catch (UnableToResolveCaptchaException $exception) { echo 'No se pudo resolver el captcha: ', $exception->getMessage(), PHP_EOL; return; } echo $answer, PHP_EOL;
解决器
多解决器
MultiResolver
解决器本身是一个解决器,它尝试使用预定义的解决器集合来解决验证码。这可以用于尝试使用不同的策略或重试同一解决器,具体取决于其包含的次数。
测试解决器
CaptchaLocalResolver
解决器使用本地验证码解决服务,通常用于测试。
它还可以使用 ConsoleResolver
解决器,其中验证码图像存储在预定义的文件中,并期望在执行过程的同一终端中写入窗口。仅在您可以写入响应时才适用。如果未在预定时间内收到响应,解决器将失败,并将其视为空响应。
如果您正在进行单元测试,最佳替代方案是使用 MockResolver
解析器,它使用预定义的 CaptchaAnswerInterface
或 UnableToResolveCaptchaException
异常构建响应,如果请求一个响应而它已经没有更多时,则使用 OutOfRangeException
异常失败。
新的解析器
如果您已经租用了 captcha 解析服务或希望实现一个,例如基于 tesseract
,您必须在项目中实现 ResolverInterface
接口。
如果解析器可以造福整个社区,那么请提出将其包含在这个库中的请求,我们将乐于对其进行评估,考虑依赖性和测试。
如果服务需要注册新账户,请与我们联系,我们可以创建解析器。请注意,您可能需要赞助订阅才能进行端到端功能测试。
类和接口规范
CaptchaImage
包含图像的 base64
编码,可以从文件、二进制数据、base64
编码的二进制数据或嵌入的 html 图像文本中构建。
静态方法:CaptchaImage::newFromFile(string $filename): self
静态方法:CaptchaImage::newFromBinary(string $contents): self
静态方法:CaptchaImage::newFromBase64(string $contents): self
静态方法:CaptchaImage::newFromInlineHtml(string $contents): self
还包含表示图像或获取 MIME 类型的方法
CaptchaImage::asBinary(): string
CaptchaImage::asBase64(): string
CaptchaImage::asBinary(): string
CaptchaImage::asInlineHtml(): string
CaptchaImage::getMimeType(): string
它还可以表示为 JSON 或字符串,因为它实现了 Stringable
和 JsonSerializable
,如果您愿意,可以使用 CaptchaImageInterface
设置自己的实现。
CaptchaResolverInterface
包含一个唯一的方法,用于解决 captcha,它接受一个 CaptchaImageInterface
并返回一个 CaptchaAnswer
:CaptchaResolverInterface::resolve(CaptchaImageInterface $image): CaptchaAnswerInterface
。
有多个实现,可以添加到这个库中或单独的库中。
CaptchaAnswer
包含 captcha 的文本响应,不能为空字符串。
使用 CaptchaAnswer::getValue(): string
方法获取响应。
可以使用 CaptchaAnswer::equalsTo($value): bool
与任何其他值进行比较。
它还可以表示为 JSON 或字符串,因为它实现了 Stringable
和 JsonSerializable
,如果您愿意,可以使用 CaptchaAnswerInterface
设置自己的实现。
HttpClientInterface
和 HttpClient
此方法是用于简化与外部 HTTP 通信的适配器。
当前实现包含非常少的方法,将根据需要添加新方法。
它使用 PSR-18 HTTP Client 和 PSR-17 HTTP Factories 标准,这些标准使用 PSR-7 HTTP 消息接口。它需要一个实现 PSR-18 的 http 客户端和一个实现 PSR-17 的库来构建 Request
或 Response
类型的消息。
为了简化对象的创建,使用了 HTTPlug Discovery 包 php-http/discovery
,该包允许查找已安装的实现并使用它们。
默认情况下,使用 HttpClient::discovery()
方法来构建对象,尽管也可以使用构造函数和提供必要的对象来创建。
支持
您可以通过在 Github 上提交工单来获取支持。
此外,这个库属于社区 PhpCfdi,因此您可以使用相同的沟通渠道来获得社区成员的帮助。
兼容性
本库将保持与至少最新版本的PHP支持版本兼容。
我们还使用语义版本2.0.0,因此您可以使用此库而不用担心破坏您的应用程序。
贡献
欢迎贡献。请阅读CONTRIBUTING以获取更多详细信息,并记得检查TODO文件和变更日志文件。
版权和许可
phpcfdi/image-captcha-resolver
库版权所有© PhpCfdi,许可协议为MIT协议(MIT)。更多信息请参阅LICENSE。