phpcfdi/image-captcha-resolver

用于解决图像验证码的连接器

v0.2.3 2023-05-25 18:00 UTC

This package is auto-updated.

Last update: 2024-08-25 20:42:24 UTC


README

Source Code Packagist PHP Version Support Discord Latest Version Software License Build Status Reliability Maintainability Code Coverage Violations Total Downloads

用于解决图像验证码的连接器

🇺🇸 该项目的文档是西班牙语,因为这是目标受众的自然语言。

关于 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 的验证码解决器

创建解决器可以有两种方式:具体方式和发现方式。

服务: https://anti-captcha.com

<?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 解析器,它使用预定义的 CaptchaAnswerInterfaceUnableToResolveCaptchaException 异常构建响应,如果请求一个响应而它已经没有更多时,则使用 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 或字符串,因为它实现了 StringableJsonSerializable,如果您愿意,可以使用 CaptchaImageInterface 设置自己的实现。

CaptchaResolverInterface

包含一个唯一的方法,用于解决 captcha,它接受一个 CaptchaImageInterface 并返回一个 CaptchaAnswerCaptchaResolverInterface::resolve(CaptchaImageInterface $image): CaptchaAnswerInterface

有多个实现,可以添加到这个库中或单独的库中。

CaptchaAnswer

包含 captcha 的文本响应,不能为空字符串。

使用 CaptchaAnswer::getValue(): string 方法获取响应。

可以使用 CaptchaAnswer::equalsTo($value): bool 与任何其他值进行比较。

它还可以表示为 JSON 或字符串,因为它实现了 StringableJsonSerializable,如果您愿意,可以使用 CaptchaAnswerInterface 设置自己的实现。

HttpClientInterfaceHttpClient

此方法是用于简化与外部 HTTP 通信的适配器。

当前实现包含非常少的方法,将根据需要添加新方法。

它使用 PSR-18 HTTP Client 和 PSR-17 HTTP Factories 标准,这些标准使用 PSR-7 HTTP 消息接口。它需要一个实现 PSR-18 的 http 客户端和一个实现 PSR-17 的库来构建 RequestResponse 类型的消息。

为了简化对象的创建,使用了 HTTPlug Discovery 包 php-http/discovery,该包允许查找已安装的实现并使用它们。

默认情况下,使用 HttpClient::discovery() 方法来构建对象,尽管也可以使用构造函数和提供必要的对象来创建。

支持

您可以通过在 Github 上提交工单来获取支持。

此外,这个库属于社区 PhpCfdi,因此您可以使用相同的沟通渠道来获得社区成员的帮助。

兼容性

本库将保持与至少最新版本的PHP支持版本兼容。

我们还使用语义版本2.0.0,因此您可以使用此库而不用担心破坏您的应用程序。

贡献

欢迎贡献。请阅读CONTRIBUTING以获取更多详细信息,并记得检查TODO文件和变更日志文件。

版权和许可

phpcfdi/image-captcha-resolver库版权所有© PhpCfdi,许可协议为MIT协议(MIT)。更多信息请参阅LICENSE