Skip to content

Commit

Permalink
Recaptcha V2
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmitry Gladyshev committed Apr 17, 2017
1 parent cb01706 commit e93dba7
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 7 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
1.2.0 - Add RecapthcaV2 methods

1.1.0 - Rename RucaptchaException to Exception
- Resolve account limit codes on error response
- Simplify error messages
Expand Down
17 changes: 13 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
rucaptcha-client
================
PHP-обёртка для сервиса распознавания капчи [rucaptcha.com](https://rucaptcha.com?from=1342124).
Удобная PHP-обёртка для сервиса распознавания капчи [rucaptcha.com](https://rucaptcha.com?from=1342124).
Оригинальная документация доступна [по ссылке](https://rucaptcha.com/api-rucaptcha?from=1342124).

[![Build Status](https://travis-ci.org/gladyshev/rucaptcha-client.svg?branch=master)](https://travis-ci.org/gladyshev/rucaptcha-client)
Expand All @@ -10,18 +10,19 @@ PHP-обёртка для сервиса распознавания капчи [
### Install

```bash
$ composer require --prefer-dist gladyshev/rucaptcha-client "~1.1"
$ composer require --prefer-dist gladyshev/rucaptcha-client "*"
```
or
```php
"require": {
...
"gladyshev/rucaptcha-client": "~1.1"
"gladyshev/rucaptcha-client": "*"
...
}
```

### Examples
Больше примеров в папке [examples](/examples).

```php
/* Simple */
Expand Down Expand Up @@ -106,6 +107,11 @@ Client::getPingbacks() : array;
Client::deletePingback(string $uri) : bool;
Client::deleteAllPingbacks() : bool;

/* Google Recaptcha V2 */

Client::sendRecapthaV2($googleKey, $pageUrl, $extra = []) : int
Client::recognizeRecapthaV2($googleKey, $pageUrl, $extra = []) : string

/* Other */

Client::getLastCaptchaId() : string;
Expand Down Expand Up @@ -143,4 +149,7 @@ Client::getLoadXml() : \SimpleXmlElement;
`header_acao` | integer | 0 | 0 = значение по умолчанию <br> 1 = in.php передаст Access-Control-Allow-Origin: * параметр в заголовке ответа. (Необходимо для кросс-доменных AJAX запросов в браузерных приложениях. Работает также для res.php.)
`textinstructions` | string | |Текст, который будет показан работнику. Может содержать в себе инструкции по разгадке капчи. Ограничение - 140 символов. Текст необходимо слать в кодировке UTF-8.
`textcaptcha` | string | | Текстовая капча. Картинка при этом не загружается, работник получает только текст и вводит ответ на этот текст. Ограничение - 140 символов. Текст необходимо слать в кодировке UTF-8.
`pingback` | string | | URL для автоматической отправки ответа на капчу (callback). URL должен быть зарегистрирован на сервере. [Больше информации здесь](https://rucaptcha.com/api-rucaptcha#pingback).
`pingback` | string | | URL для автоматической отправки ответа на капчу (callback). URL должен быть зарегистрирован на сервере. [Больше информации здесь](https://rucaptcha.com/api-rucaptcha#pingback).
`recaptcha` | string | | Используется при работе со старым алгоритмом распознования Google Recaptcha V2. [Больше информации здесь](https://rucaptcha.com/api-rucaptcha#solving_recaptchav2_old).
`proxy` | string | | Формат: логин:пароль@123.123.123.123:3128 [Больше информации о прокси здесь.](https://rucaptcha.com/api-rucaptcha#proxies)
`proxytype` | string | | Тип вашего прокси-сервера: HTTP, HTTPS, SOCKS4, SOCKS5.
68 changes: 68 additions & 0 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

namespace Rucaptcha;

use GuzzleHttp\RequestOptions;
use Rucaptcha\Exception\ErrorResponseException;
use Rucaptcha\Exception\RuntimeException;

/**
* Class Client
Expand All @@ -14,6 +16,11 @@ class Client extends GenericClient
{
const STATUS_OK_REPORT_RECORDED = 'OK_REPORT_RECORDED';

/**
* @var int
*/
protected $recaptchaRTimeout = 15;

/**
* @var string
*/
Expand Down Expand Up @@ -265,6 +272,67 @@ public function deleteAllPingbacks()
return $this->deletePingback('all');
}

/* Recaptcha v2 */

public function sendRecapthaV2($googleKey, $pageUrl, $extra = [])
{
$this->getLogger()->info("Try send google key (recaptcha) on {$this->serverBaseUri}/in.php");

$response = $this->getHttpClient()->request('POST', "/in.php", [
RequestOptions::QUERY => array_merge($extra, [
'method' => 'userrecaptcha',
'key' => $this->apiKey,
'googlekey' => $googleKey,
'pageurl' => $pageUrl
])
]);

$responseText = $response->getBody()->__toString();

if (strpos($responseText, 'OK|') !== false) {
$this->lastCaptchaId = explode("|", $responseText)[1];
$this->getLogger()->info("Sending success. Got captcha id `{$this->lastCaptchaId}`.");
return $this->lastCaptchaId;
}

throw new ErrorResponseException($this->getErrorMessage($responseText) ?: "Unknown error: `{$responseText}`.");
}

/**
* @param string $googleKey
* @param string $pageUrl
* @param array $extra # Captcha options
* @return string # Code to place in hidden form
* @throws RuntimeException
*/
public function recognizeRecaptchaV2($googleKey, $pageUrl, $extra = [])
{
$captchaId = $this->sendRecapthaV2($googleKey, $pageUrl, $extra);
$startTime = time();

while (true) {
$this->getLogger()->info("Waiting {$this->rTimeout} sec.");

sleep($this->recaptchaRTimeout);

if (time() - $startTime >= $this->mTimeout) {
throw new RuntimeException("Captcha waiting timeout.");
}

$result = $this->getCaptchaResult($captchaId);

if ($result === false) {
continue;
}

$this->getLogger()->info("Elapsed " . (time()-$startTime) . " second(s).");

return $result;
}

throw new RuntimeException('Unknown recognition logic error.');
}

/**
* Match error code by response.
*
Expand Down
9 changes: 6 additions & 3 deletions src/Extra.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,17 @@ class Extra
const QUESTION = 'question';
const NUMERIC = 'numeric';
const CALC = 'calc';
const MIN_LEN = 'min_len ';
const MAX_LEN = 'max_len ';
const MIN_LEN = 'min_len';
const MAX_LEN = 'max_len';
const IS_RUSSIAN = 'is_russian';
const SOFT_ID = 'soft_id';
const LANGUAGE = 'language';
const HEADER_ACAO = 'header_acao ';
const HEADER_ACAO = 'header_acao';
const TEXTINSTRUCTIONS = 'textinstructions';
const TEXTCAPTCHA = 'textcaptcha';
const CONTENT_TYPE = 'content_type';
const PINGBACK = 'pingback';
const RECAPTCHA = 'recaptcha';
const PROXY = 'proxy';
const PROXY_TYPE = 'proxytype';
}

0 comments on commit e93dba7

Please sign in to comment.