Conectores para resolver captchas de imágenes

Overview

phpcfdi/image-captcha-resolver

Source Code Latest Version Software License Build Status Scrutinizer Coverage Status Total Downloads

Conectores para resolver captchas de imágenes

🇺🇸 The documentation of this project is in spanish as this is the natural language for the intended audience.

Acerca de phpcfdi/image-captcha-resolver

Esta librería contiene conectores con algunos servicios populares o de prueba para resolver captchas.

Es utilizado en algunos proyectos de PhpCfdi.

Instalación

Usa composer

composer require phpcfdi/image-captcha-resolver

Es posible que para su correcta implementación requiera también instalar algunos paquetes adicionales. Vea 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

Sin embargo, si lo que está desarrollando es una librería debería usar como dependencia de cliente el paquete php-http/mock-client y cualquier fábrica de mensajes (en composer.json:require-dev).

Uso básico

Llamar a resolver un captcha

Para este ejemplo se asume que ya existe un resolvedor de captchas en $resolver y que la imagen del captcha se encuentra como imagen embedida y su contenido en $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;

Creación de un resolvedor de captchas basado en Anti-Captcha

Para crear el resolvedor se puede hacer de dos formas: de manera específica y por descubrimiento.

Servicio: 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)
);

Creación de un resolvedor de captchas basado en Local Captcha Resolver

Para crear el resolvedor se puede hacer de dos formas: de manera específica y por descubrimiento.

Servicio: 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)
);

Creación de un resolvedor de captchas basado en línea de comandos

La implementación dependerá siempre de la herramienta que se esté utilizando, es probable que fabrique su propio punto de entrada a la herramienta para que devuelva el exit code correcto y la respuesta.

Esta herramienta podría ser útil en caso de que el captcha se pueda resolver utilizando alguna herramienta como tesseract.

El siguiente ejemplo supone que tiene la imagen del captcha a resolver en $image y que existe un commando llamado my-captcha-breaker que se le entrega una imagen y devuelve en el último renglón de la salida la respuesta del captcha.

<?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;

Resolvedores

Multiresolvedor

El resolvedor MultiResolver es en sí mismo un resolvedor que intenta resolver el captcha usando un conjunto predefinido de resolvedores. Podría ser útil para intentar resolver utilizando diferentes estrategias o reintentando con un mismo resolvedor el número de veces en las que esté incluído.

Resolvedores para pruebas

El resolvedor CaptchaLocalResolver usa servicio de resolución de captchas local y es comúnmente utilizado para pruebas.

También podría usar el resolvedor ConsoleResolver en donde se almacena en un archivo predefinido la imagen del captcha a resolver y se espera que escriba la ventana en la misma terminal donde está ejecutando el proceso. Solo es útil si puede escribir la respuesta. Si no se recibe la respuesta en un tiempo predeterminado el resolvedor fallará lo tomará como una respuesta vacía.

Si está haciendo pruebas unitarias, la mejor alternativa es usar el resolvedor MockResolver, que se construye con respuestas prestablecidas CaptchaAnswerInterface o excepciones UnableToResolveCaptchaException y falla con una excepción OutOfRangeException si se le pide una respuesta y ya no tiene más.

Nuevos resolvedores

Si ya tienes contratado un servicio de solución de captchas o deseas implementar uno, por ejemplo, basado en tesseract, debes implementar la interfaz ResolverInterface en tu proyecto.

Si el resolvedor puede beneficiar a toda la comunidad entonces haz tu solicitud de que se incluya en esta librería y con gusto lo evaluaremos, tomando en cuenta las dependencias y las pruebas.

Si el servicio requiere de registrar una nueva cuenta, por favor ponte en contacto con nosotros y podemos crear el resolvedor. Considera que será necesario que patrocines la suscripción para poder hacer pruebas de funcionamiento punto a punto.

Especificación de clases e interfaces

CaptchaImage

Contiene la imagen en base64 de la imagen, se puede construir desde un archivo, desde datos binarios, desde datos binarios codificados como base64 o desde un texto de imagen html embedido.

  • static CaptchaImage::newFromFile(string $filename): self
  • static CaptchaImage::newFromBinary(string $contents): self
  • static CaptchaImage::newFromBase64(string $contents): self
  • static CaptchaImage::newFromInlineHtml(string $contents): self

También contiene métodos para expresar la imagen u obtener el tipo MIME:

  • CaptchaImage::asBinary(): string
  • CaptchaImage::asBase64(): string
  • CaptchaImage::asBinary(): string
  • CaptchaImage::asInlineHtml(): string
  • CaptchaImage::getMimeType(): string

También se puede expresar como JSON o como string pues implementa Stringable y JsonSerializable y si lo desea, puede establecer su propia implementación usando CaptchaImageInterface.

CaptchaResolverInterface

Contiene un único método de resolución en donde toma un CaptchaImageInterface y entrega un CaptchaAnswer: CaptchaResolverInterface::resolve(CaptchaImageInterface $image): CaptchaAnswerInterface.

Hay diferentes implementaciones y se pueden agregar más a esta librería o en una librería independiente.

CaptchaAnswer

Contiene la respuesta del captcha como un valor de texto, no puede ser una cadena vacía.

La respuesta se obtiene con el método CaptchaAnswer::getValue(): string.

Y se puede comparar contra cualquier otro valor usando CaptchaAnswer::equalsTo($value): bool.

También se puede expresar como JSON o como string pues implementa Stringable y JsonSerializable y si lo desea, puede establecer su propia implementación usando CaptchaAnswerInterface.

HttpClientInterface y HttpClient

Este método es un adaptador para facilitar las comunicaciones de HTTP con el exterior.

La implementación actual contiene muy pocos métodos y serán agregados nuevos conforme se necesite.

Utiliza los estándares PSR-18 HTTP Client, y PSR-17 HTTP Factories que usan el PSR-7 HTTP message interfaces. Requieren de un cliente http que implemente el PSR-18 y de una librería que implemente PSR-17 para construir los mensajes de tipo Request o Response.

Para que sea fácil poder crear el objeto, se usa el paquete de HTTPlug Discovery php-http/discovery que permite encontrar implementaciones instaladas y utilizarlas.

El método HttpClient::discovery() es el que se utiliza de forma predeterminada para construir el objeto, aunque también se puede crear utilizando el constructor y entregando los objetos necesarios.

Soporte

Puedes obtener soporte abriendo un ticket en Github.

Adicionalmente, esta librería pertenece a la comunidad PhpCfdi, así que puedes usar los mismos canales de comunicación para obtener ayuda de algún miembro de la comunidad.

Compatibilidad

Esta librería se mantendrá compatible con al menos la versión con soporte activo de PHP más reciente.

También utilizamos Versionado Semántico 2.0.0 por lo que puedes usar esta librería sin temor a romper tu aplicación.

Contribuciones

Las contribuciones con bienvenidas. Por favor lee CONTRIBUTING para más detalles y recuerda revisar el archivo de tareas pendientes TODO y el archivo CHANGELOG.

Copyright and License

The phpcfdi/image-captcha-resolver library is copyright © PhpCfdi and licensed for use under the MIT License (MIT). Please see LICENSE for more information.

You might also like...
API simples utilizando workerman(assincrono) usando TDD, DDD e boas praticas para escalonamento horizontal.

Motivos para usar workerman Além de mais rápido que o swoole, não necessita de libs externas, porém o ponto negativo é não possuir corrotinas, sendo n

Componentes voltados para trabalhar com o framework Adianti

adianti_components Estes componentes não possuem vinculo com a empresa do framework Adianti. Componentes voltados para trabalhar com o framework Adian

Uma solucão simples para integrar sua aplicação Laravel a API PIX do Banco Central do Brasil
Uma solucão simples para integrar sua aplicação Laravel a API PIX do Banco Central do Brasil

Uma solução simples para integrar a sua aplicação Laravel com a API PIX do Banco Central do Brasil Instalação Publicando os assets Publicando o arquiv

Panel de Control para Dominios
Panel de Control para Dominios

Panel de Control para Gestión de Dominios Esta aplicación permite la gestión interna de dominios de una manera sencilla. Podrás dar de alta dominios p

Panel de Control para Dominios
Panel de Control para Dominios

Panel de Control para Gestión de Dominios Esta aplicación permite la gestión interna de dominios de una manera sencilla. Podrás dar de alta dominios p

Cliente OAuth2 para Gov.br

Cliente OAuth2 para Gov.br Este pacote fornece suporte OAuth 2.0 para Gov.br usando a biblioteca cliente do League PHP. Requisitos Versões suportadas

Projeto utilizado para prática de TDD usando PHP com a equipe de desenvolvimento.

🚀 TDD com PHP 📄 Detalhamento do projeto Projeto desenvolvido durante um DOJO que organizei com os colegas de equipe da GAM Distribuidora. A proposta

Proyecto con configuraciones basicas para iniciar una aplicacion en Laravel 7

LARAVEL CORK ADMIN Proyecto base de Laravel 7, usando la plantilla de CORK en su versión 1.9. Este proyecto contiene algunos paquetes extras que ayuda

Biblioteca PHP para validação de padrões brasileiros

BrCommons Validators BrCommons validator is a set of usefull validators that helps you develop fast and realiable code. Installation by composer Run c

Aplicación API para consumir el Servicio Web de Descarga Masiva del SAT.

API Descarga Masiva Aplicación API para consumir el Servicio Web de Descarga Masiva del SAT. Note: The documentation of this project is in Spanish, as

Un proyecto que crea una API de usuarios para registro, login y luego acceder a su información mediante autenticación con JSON Web Token

JSON WEB TOKEN CON LARAVEL 8 Prueba de autenticación de usuarios con una API creada en Laravel 8 Simple, fast routing engine. License The Laravel fram

CRUD COM LARAVEL 8, MVC, LOGIN E ROTAS, PRONTO PARA VOCE USAR NOS SEUS PROJETOS
CRUD COM LARAVEL 8, MVC, LOGIN E ROTAS, PRONTO PARA VOCE USAR NOS SEUS PROJETOS

CRUD COM LARAVEL 8, MVC, LOGIN E ROTAS, PRONTO PARA VOCE USAR NOS SEUS PROJETOS. Para rodar o Crud é preciso instalar o composer e um servidor localho

Web para capacitaciones de Laravel con el flujo de trabajo GitFlow.

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Libreria PHP para generar direcciones de criptomonedas.

Criptomonedas soportadas Soporte para 3 tipos de direcciones: legacy, compatibility y segwit. Bitcoin Dash Dogecoin Litecoin Viacoin Zcash Requerimien

Biblioteca para busca (on-line) de estados e os seus respectivos municípios via API disponibilizada pelo IBGE.
Biblioteca para busca (on-line) de estados e os seus respectivos municípios via API disponibilizada pelo IBGE.

LocalidadeX Biblioteca para busca (on-line) e listagem de estados e seus respectivos municípios, efetua a consulta via API do IBGE, disponibilizando o

Herramienta Para Snipear Nitros Y Participar En Sorteos Automaticamente
Herramienta Para Snipear Nitros Y Participar En Sorteos Automaticamente

Crips Nitro Sniper Discord Nitro Sniper Y Auto Participar En Sorteos ⚠️ Es Bastante Rapido Y Efectivo Hecho En Python Como Usar ( Python ) : python -m

Web scrapper para cotizar articulos

WebScrapper Este web scrapper esta desarrollado en python 3.10.0 para buscar en la pagina de cyber puerta articulos dentro del catalogo. El programa t

Teste realizado para Laravel e manuseio de APIs
Teste realizado para Laravel e manuseio de APIs

Aplicação simples para consumir o Web Service ViaCEP e funcionar também como uma API. Projeto As funcionalidades do projeto desenvolvidas são: Utiliza

Comments
  • Update project config file

    Update project config file

    Update project files Fix phpstan configuration name to exclude from package Split GH Actions to run full CI on PHP 8.0 and only tests on 7.3 & 7.4

    opened by eclipxe13 1
  • Mantenimiento (v0.2.2)

    Mantenimiento (v0.2.2)

    Este es una liberación de mantenimiento, el cambio más importante es la corrección de un posible problema detectado por PHPStan.

    Cambios en entorno de desarrollo

    • Se utiliza Phive en lugar del script install-development-tools para mantener las librerías de desarrollo.
    • Se corrige el nombre del grupo de mantenedores en GitHub.
    • En Github en el flujo de integración continua se actualiza para:
      • Incluir PHP 8.0, PHP 8.1 y PHP 8.2 a las pruebas.
      • Se divide el proceso de contrucción en varios pasos.
      • Se actualizan las acciones de GitHub a la versión 3.
    • Se actualiza el año del archivo de licencia.
    • Se utiliza un nuevo estándar de estilo de código basado en PSR-12, como los demás proyectos de PhpCfdi.
    opened by eclipxe13 0
  • Corregir los problemas detectados por PHPStan (1.1.2)

    Corregir los problemas detectados por PHPStan (1.1.2)

    La versión más reciente de PHPStan phpstan/phpstan:1.1.2 encontró algunos puntos de mejora y uno que otro falso positivo. Se hacen las correcciones:

    • AntiCaptchaConnector: Se previene un error de ejecución al verificar la respuesta del servidor.
    • CaptchaLocalResolverConnector: Se previene un error de ejecución al verificar la respuesta del servidor.
    • Se eliminan asignaciones superfluas al usar el operador Null coalescing.
    opened by eclipxe13 0
  • Versión 0.2.0

    Versión 0.2.0

    Se agrega el resolvedor CommandLineResolver que pasa la imagen del captcha como un archivo temporal para ser resuelto por un commando externo.

    Se agrega el resolvedor MultiResolver que contiene un conjunto de resolvedores para intentar resolver con ellos uno a uno.

    Se cambia el nombre de la excepción UnableToResolveCaptcha a UnableToResolveCaptchaException.

    Se cambia el nombre de la excepción UndiscoverableClient a UndiscoverableClientException.

    Se agrega la clase interna TemporaryFile para crear y eliminar archivos temporales.

    opened by eclipxe13 0
Releases(v0.2.2)
  • v0.2.2(Nov 8, 2022)

    Este es una liberación de mantenimiento, el cambio más importante es la corrección de un posible problema detectado por PHPStan.

    Cambios en entorno de desarrollo

    • Se utiliza Phive en lugar del script install-development-tools para mantener las librerías de desarrollo.
    • Se corrige el nombre del grupo de mantenedores en GitHub.
    • En Github en el flujo de integración continua se actualiza para:
      • Incluir PHP 8.0, PHP 8.1 y PHP 8.2 a las pruebas.
      • Se divide el proceso de contrucción en varios pasos.
      • Se actualizan las acciones de GitHub a la versión 3.
    • Se actualiza el año del archivo de licencia.
    • Se utiliza un nuevo estándar de estilo de código basado en PSR-12, como los demás proyectos de PhpCfdi.
    • Se agrega la integración con SonarCloud.
    • Se elimina la integración con Scrutinizer CI. ¡Gracias Scrutinizer!
    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Nov 17, 2021)

    La versión más reciente de PHPStan phpstan/phpstan:1.1.2 encontró algunos puntos de mejora y uno que otro falso positivo. Se hacen las correcciones:

    • AntiCaptchaConnector: Se previene un error de ejecución al verificar la respuesta del servidor.
    • CaptchaLocalResolverConnector: Se previene un error de ejecución al verificar la respuesta del servidor.
    • Se eliminan asignaciones superfluas al usar el operador Null coalescing.
    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Jul 29, 2021)

    Se agrega el resolvedor CommandLineResolver que pasa la imagen del captcha como un archivo temporal para ser resuelto por un comando externo.

    Se agrega el resolvedor MultiResolver que contiene un conjunto de resolvedores para intentar resolver con ellos uno a uno.

    Se cambia el nombre de la excepción UnableToResolveCaptcha a UnableToResolveCaptchaException.

    Se cambia el nombre de la excepción UndiscoverableClient a UndiscoverableClientException.

    Se agrega la clase interna TemporaryFile para crear y eliminar archivos temporales.

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Jul 26, 2021)

Owner
phpCfdi
PHP Tools and utilities for Mexican CFDI
phpCfdi
TypeResolver - A PSR-5 based resolver of Class names, Types and Structural Element Names

TypeResolver and FqsenResolver The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs but also how to stati

phpDocumentor 9k Dec 29, 2022
Proyecto Laravel-Livewire-Tailwind. Buscador de Gifs, Imágenes y Vídeos. Fuentes: Giphy y Pixabay.

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Juan Gómez 1 Feb 10, 2022
Jéssica Paula 7 Aug 12, 2022
Este es un sitema bibliotecario para registro de adquisiciones y prestamos para INATEC Siuna

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

James Reyes 3 Mar 26, 2022
Desafio prático para desenvolvedores fullstack que desejam entrar para nosso time.

Instruções para realizar os exercícios Essa avaliação é composta por três partes, que visam servir de base para análise das competências dos candidato

Dommus Tecnologia 3 Mar 3, 2022
PHP com duas funções: uma para gerar a linha do Pix Copia e Cola e outra para gerar o QRCode baseado no retorno da primeira função.

pix-copiacola-qrcode Pix.php - Funções para gerar, de forma simples, a linha "Copia e Cola" e o QRCode Necessita PHP 7 ou superior Para o QRCode usa a

Rogerio Arvy Vitiello 8 Oct 6, 2022
Scripts em PHP para um processo seletivo, onde trabalho com lógica básica para testar minhas competências na linguagem referida.

Processo-Seletivo-PHP-Junior Scripts em PHP para um processo seletivo, onde trabalho com lógica básica para testar minhas competências na linguagem re

Gabriel Silva Araujo 2 Dec 10, 2021
Plugin de Wordpress para criar um Hacker News-like para o ManualdoUsuario.net

?? Órbita Plugin de Wordpress para criar um painel de debates baseado em links, similar ao Hacker News, para o Manual do Usuário. Rodar o projeto Requ

Gabriel Nunes 7 Nov 14, 2022
Paquete laravel para leer indicadores previsionales desde Previred y tramos de impuesto de 2da categoría desde SII

Laravel PreviScraper Indicadores previsionales Chile ???? Indicadores previsionales desde Previred y tramos de impuesto desde SII Los datos se obtiene

Guillermo Farías Pavez 11 Feb 9, 2022
Herramienta para limpiar Comprobantes Fiscales Digitales v3.3

phpcfdi/cfdi-cleaner Herramienta para limpiar Comprobantes Fiscales Digitales por Internet mexicanos. ???? The documentation of this project is in spa

phpCfdi 10 Sep 24, 2022