diff --git a/CHANGELOG b/CHANGELOG index bfb58f1..7e71509 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +1.1.0 - Rename RucaptchaException to Exception + - Resolve account limit codes on error response + - Simplify error messages + 1.0.6 - Add addPingback method - Add getPingbacks method - Add deletePingback method diff --git a/README.md b/README.md index 25d1f68..ac00eab 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,21 @@ PHP-обёртка для сервиса распознавания капчи [ [![Code Coverage](https://scrutinizer-ci.com/g/gladyshev/rucaptcha-client/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/gladyshev/rucaptcha-client/?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/gladyshev/rucaptcha-client/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/gladyshev/rucaptcha-client/?branch=master) -### Примеры ### +### Install + +```bash +$ composer require --prefer-dist gladyshev/rucaptcha-client "~1.1" +``` +or +```php +"require": { + ... + "gladyshev/rucaptcha-client": "~1.1" + ... +} +``` + +### Examples ```php /* Simple */ @@ -56,17 +70,7 @@ while (count($taskIds) > 0) print_r($results); ``` -### Установка ### - -```php -"require": { - ... - "gladyshev/rucaptcha-client": "~1.0" - ... -} -``` - -### Методы `Rucaptcha\Client` ### +### Methods of `Rucaptcha\Client` ```php use Rucaptcha\Client; @@ -111,8 +115,7 @@ Client::getLoad(array $paramsList = []) : array; Client::getLoadXml() : \SimpleXmlElement; ``` - -### Опции клиента ### +### Library options Параметр | Тип | По умолчанию | Возможные значения ---| --- | --- | --- @@ -123,11 +126,11 @@ Client::getLoadXml() : \SimpleXmlElement; `serverBaseUri`| string | 'http://rucaptcha.com' | Базовый URI сервиса -### Параметры распознавания капчи `$extra` ### +### Solving options `$extra` Параметр | Тип | По умолчанию | Возможные значения ---| --- | --- | --- -`phrase` | integer | 0 | 0 = одно слово
1 = капча имеет два слова +`phrase` | integer | 0 | 0 = одно слово
1 = капча имеет два слова `regsense`| integer | 0 | 0 = регистр ответа не имеет значения
1 = регистр ответа имеет значение `question`| integer | 0 | 0 = параметр не задействован
1 = на изображении задан вопрос, работник должен написать ответ `numeric` | integer | 0 | 0 = параметр не задействован
1 = капча состоит только из цифр
2 = Капча состоит только из букв
3 = Капча состоит либо только из цифр, либо только из букв. @@ -136,7 +139,7 @@ Client::getLoadXml() : \SimpleXmlElement; `max_len` | 1..20 | 0 | 0 = параметр не задействован
1..20 = максимальное количество знаков в ответе `is_russian` | integer | 0 | параметр больше не используется, т.к. он означал "слать данную капчу русским исполнителям", а в системе находятся только русскоязычные исполнители. Смотрите новый параметр language, однозначно обозначающий язык капчи `soft_id` | string | | ID разработчика приложения. Разработчику приложения отчисляется 10% от всех капч, пришедших из его приложения. -`language` | integer | 0 | 0 = параметр не задействован
1 = на капче только кириллические буквы
2 = на капче только латинские буквы +`language` | integer | 0 | 0 = параметр не задействован
1 = на капче только кириллические буквы
2 = на капче только латинские буквы `header_acao` | integer | 0 | 0 = значение по умолчанию
1 = in.php передаст Access-Control-Allow-Origin: * параметр в заголовке ответа. (Необходимо для кросс-доменных AJAX запросов в браузерных приложениях. Работает также для res.php.) `textinstructions` | string | |Текст, который будет показан работнику. Может содержать в себе инструкции по разгадке капчи. Ограничение - 140 символов. Текст необходимо слать в кодировке UTF-8. `textcaptcha` | string | | Текстовая капча. Картинка при этом не загружается, работник получает только текст и вводит ответ на этот текст. Ограничение - 140 символов. Текст необходимо слать в кодировке UTF-8. diff --git a/src/Client.php b/src/Client.php index f7efa95..50deb9d 100644 --- a/src/Client.php +++ b/src/Client.php @@ -3,7 +3,6 @@ namespace Rucaptcha; use Rucaptcha\Exception\ErrorResponseException; -use Rucaptcha\Exception\RuntimeException; /** * Class Client @@ -23,6 +22,7 @@ class Client extends GenericClient /** * Your application ID in Rucaptcha catalog. * The value `1013` is ID of this library. Set in false if you want to turn off sending any ID. + * * @see https://rucaptcha.com/software/view/php-api-client * @var string */ @@ -42,9 +42,9 @@ public function sendCaptcha($content, array $extra = []) /** * Bulk captcha result. * - * @param int[] $captchaIds # Captcha task Ids array - * @return string[] # Array $captchaId => $captchaText or false if is not ready - * @throws RuntimeException + * @param int[] $captchaIds # Captcha task Ids array + * @return string[] # Array $captchaId => $captchaText or false if is not ready + * @throws ErrorResponseException */ public function getCaptchaResultBulk(array $captchaIds) { @@ -78,16 +78,19 @@ public function getCaptchaResultBulk(array $captchaIds) */ public function getBalance() { - $response = $this->getHttpClient()->request('GET', "/res.php?key={$this->apiKey}&action=getbalance"); + $response = $this + ->getHttpClient() + ->request('GET', "/res.php?key={$this->apiKey}&action=getbalance"); + return $response->getBody()->__toString(); } /** * Report of wrong recognition. * - * @param $captchaId + * @param string $captchaId * @return bool - * @throws RuntimeException + * @throws ErrorResponseException */ public function badCaptcha($captchaId) { @@ -100,7 +103,11 @@ public function badCaptcha($captchaId) if ($responseText === self::STATUS_OK_REPORT_RECORDED) { return true; } - throw new ErrorResponseException($this->getErrorMessage($responseText) ?: "Unknown error: `{$responseText}`."); + + throw new ErrorResponseException( + $this->getErrorMessage($responseText) ?: $responseText, + $this->getErrorCode($responseText) ?: 0 + ); } /** @@ -143,7 +150,7 @@ public function getLoadXml() /** * @param string $captchaId # Captcha task ID * @return array | false # Solved captcha and cost array or false if captcha is not ready - * @throws RuntimeException + * @throws ErrorResponseException */ public function getCaptchaResultWithCost($captchaId) { @@ -166,13 +173,18 @@ public function getCaptchaResultWithCost($captchaId) ]; } - throw new ErrorResponseException($this->getErrorMessage($responseText) ?: "Unknown error: `{$responseText}`."); + throw new ErrorResponseException( + $this->getErrorMessage($responseText) ?: $responseText, + $this->getErrorCode($responseText) ?: 0 + ); } /** + * Add pingback url to rucaptcha whitelist. + * * @param string $url * @return bool # true if added and exception if fail - * @throws RuntimeException + * @throws ErrorResponseException */ public function addPingback($url) { @@ -185,12 +197,18 @@ public function addPingback($url) if ($responseText === self::STATUS_OK) { return true; } - throw new ErrorResponseException($this->getErrorMessage($responseText) ?: "Unknown error: `{$responseText}`."); + + throw new ErrorResponseException( + $this->getErrorMessage($responseText) ?: $responseText, + $this->getErrorCode($responseText) ?: 0 + ); } /** - * @return string[] - * @throws RuntimeException + * Returns pingback whitelist items. + * + * @return string[] # List of urls + * @throws ErrorResponseException */ public function getPingbacks() { @@ -206,13 +224,18 @@ public function getPingbacks() return empty($data[1]) ? [] : array_values($data); } - throw new ErrorResponseException($this->getErrorMessage($responseText) ?: "Unknown error: `{$responseText}`."); + throw new ErrorResponseException( + $this->getErrorMessage($responseText) ?: $responseText, + $this->getErrorCode($responseText) ?: 0 + ); } /** + * Remove pingback url from whitelist. + * * @param string $uri * @return bool - * @throws RuntimeException + * @throws ErrorResponseException */ public function deletePingback($uri) { @@ -225,15 +248,34 @@ public function deletePingback($uri) if ($responseText === self::STATUS_OK) { return true; } - throw new ErrorResponseException($this->getErrorMessage($responseText) ?: "Unknown error: `{$responseText}`."); + throw new ErrorResponseException( + $this->getErrorMessage($responseText) ?: $responseText, + $this->getErrorCode($responseText) ?: 0 + ); } /** + * Truncate pingback whitelist. + * * @return bool - * @throws RuntimeException + * @throws ErrorResponseException */ public function deleteAllPingbacks() { return $this->deletePingback('all'); } + + /** + * Match error code by response. + * + * @param string $responseText + * @return int + */ + private function getErrorCode($responseText) + { + if (preg_match('/ERROR:\s*(\d{0,4})/ui', $responseText, $matches)) { + return intval($matches[1]); + } + return 0; + } } diff --git a/src/Exception/RucaptchaException.php b/src/Exception/Exception.php similarity index 62% rename from src/Exception/RucaptchaException.php rename to src/Exception/Exception.php index d3074bd..5476068 100644 --- a/src/Exception/RucaptchaException.php +++ b/src/Exception/Exception.php @@ -5,8 +5,7 @@ namespace Rucaptcha\Exception; -use Exception; -class RucaptchaException extends Exception +class Exception extends \Exception { } diff --git a/src/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php index e456eb5..f8a7d3e 100644 --- a/src/Exception/InvalidArgumentException.php +++ b/src/Exception/InvalidArgumentException.php @@ -5,6 +5,6 @@ namespace Rucaptcha\Exception; -class InvalidArgumentException extends RucaptchaException +class InvalidArgumentException extends Exception { } diff --git a/src/Exception/RuntimeException.php b/src/Exception/RuntimeException.php index fed6aaa..1508714 100644 --- a/src/Exception/RuntimeException.php +++ b/src/Exception/RuntimeException.php @@ -5,6 +5,6 @@ namespace Rucaptcha\Exception; -class RuntimeException extends RucaptchaException +class RuntimeException extends Exception { } diff --git a/src/GenericClient.php b/src/GenericClient.php index a53b6f3..ce0b4c1 100644 --- a/src/GenericClient.php +++ b/src/GenericClient.php @@ -13,7 +13,7 @@ use Psr\Log\LoggerInterface; use Rucaptcha\Exception\ErrorResponseException; use Rucaptcha\Exception\InvalidArgumentException; -use Rucaptcha\Exception\RucaptchaException; +use Rucaptcha\Exception\Exception; use Rucaptcha\Exception\RuntimeException; use SplFileObject; @@ -94,7 +94,7 @@ public function setHttpClient(ClientInterface $client) * @param string $path * @param array $extra * @return string - * @throws RucaptchaException + * @throws Exception */ public function recognizeFile($path, array $extra = []) { @@ -199,7 +199,7 @@ public function getCaptchaResult($captchaId) return html_entity_decode(trim(explode('|', $responseText)[1])); } - throw new ErrorResponseException($this->getErrorMessage($responseText) ?: "Unknown error: `{$responseText}`."); + throw new ErrorResponseException($this->getErrorMessage($responseText) ?: $responseText); } /**