diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dfd6caa --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/vendor +composer.lock \ No newline at end of file diff --git a/LICENSE b/LICENSE index 8dada3e..8f71f43 100644 --- a/LICENSE +++ b/LICENSE @@ -199,3 +199,4 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..b5db118 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +Captcha +================ +[![PHP version](https://badge.fury.io/ph/jumper423%2Fcaptcha.svg)](https://badge.fury.io/ph/jumper423%2Fcaptcha) + +Распознавание капч для всех популярных сервисов [rucaptcha.com](http://infoblog1.ru/goto/rucaptcha), 2captcha.com, pixodrom.com, captcha24.com, [socialink.ru](http://www.socialink.ru/?key=84333), anti-captcha.com + +Особенности +------------ +* Подходит для всех сервисов по распознаванию капч работающие по общим стандартам +* Лёгкость настроки +* Распозвание как по пути до файла, так и по ссылки + +Установка +------------ +Предпочтительный способ установить это расширение через [composer](http://getcomposer.org/download/). + +Либо запустить + +``` +php composer.phar require --prefer-dist jumper423/captcha "*" +``` + +или добавить + +``` +"jumper423/captchar": "*" +``` + +в файл `composer.json`. + +Конфигурация +------------ + +```php +'components' => [ + 'captcha' => [ + 'class' => 'jumper423\Captcha', + 'pathTmp' => '@app/captcha', + 'apiKey' => '42eab4119020dbc729f657fef270r546', + ], +], +``` + +Использование +------------ +Простой пример использования: + +```php +$path = 'path/to/captcha.png'; +if (\Yii::$app->captcha->run($path)) { + $captcha = \Yii::$app->captcha->result(); +} else { + throw new Exception(\Yii::$app->captcha->error()); +} +``` + +Так же можно применять если у Вас есть только ссылка на капчу, но для этого метода Вам следует прописать путь в конфигурации для сохранения капч (pathTmp): + +```php +$url = 'https://vk.com/captcha.php?sid=698254154192&s=1'; +if (\Yii::$app->captcha->run($url)) { + $captcha = \Yii::$app->captcha->result(); +} else { + throw new Exception(\Yii::$app->captcha->error()); +} +``` \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..03393ac --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "jumper423/captcha", + "description": "Распознавание капч для всех популярных сервисов rucaptcha.com, 2captcha.com, pixodrom.com, captcha24.com, socialink.ru, anti-captcha.com", + "keywords": ["yii2", "captcha", "recognition", "rucaptcha.com", "2captcha.com", "pixodrom.com", "captcha24.com", "socialink.ru", "rucaptcha", "2captcha", "pixodrom", "captcha24", "socialink", "anti-captcha.com", "anti-captcha"], + "homepage": "http://infoblog1.ru/learn/cms/yii/raspoznavanie-kapch-na-yii2", + "type": "project", + "license": "Apache License 2.0", + "support": { + "issues": "https://github.com/jumper423/captcha/issues?state=open", + "source": "https://github.com/jumper423/captcha" + }, + "minimum-stability": "stable", + "require": { + "php": ">=5.4.0" + }, + "config": { + "process-timeout": 1800 + }, + "autoload": { + "psr-4": {"jumper423\\": "src/"} + } +} diff --git a/src/Captcha.php b/src/Captcha.php new file mode 100644 index 0000000..625b371 --- /dev/null +++ b/src/Captcha.php @@ -0,0 +1,224 @@ +apiKey = $apiKey(); + } else { + $this->apiKey = $apiKey; + } + } + + /** + * Запуск распознавания капчи + * + * @param string $filename Путь до файла или ссылка на него + * + * @return bool + */ + public function run($filename) + { + $this->result = null; + $this->error = null; + try { + if (strpos($filename, 'http://') !== false || strpos($filename, 'https://') !== false) { + $current = file_get_contents($filename); + if ($current) { + $path = tempnam(sys_get_temp_dir(), 'captcha'); + if (file_put_contents($path, $current)) { + $filename = $path; + } else { + throw new Exception("Нет доступа для записи файла"); + } + } else { + throw new Exception("Файл {$filename} не загрузился"); + } + } elseif (!file_exists($filename)) { + throw new Exception("Файл {$filename} не найден"); + } + $postData = [ + 'method' => 'post', + 'key' => $this->apiKey, + 'file' => (version_compare(PHP_VERSION, '5.5.0') >= 0) ? new \CURLFile($filename) : '@' . $filename, + 'phrase' => $this->isPhrase, + 'regsense' => $this->isRegSense, + 'numeric' => $this->isNumeric, + 'min_len' => $this->minLen, + 'max_len' => $this->maxLen, + 'language' => $this->language, + 'soft_id' => 882, + ]; + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "http://{$this->domain}/in.php"); + if (version_compare(PHP_VERSION, '5.5.0') >= 0 && version_compare(PHP_VERSION, '7.0') < 0) { + curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); + } + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_TIMEOUT, 60); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); + $result = curl_exec($ch); + if (curl_errno($ch)) { + throw new Exception("CURL вернул ошибку: " . curl_error($ch)); + } + curl_close($ch); + $this->setError($result); + list(, $this->captchaId) = explode("|", $result); + $waitTime = 0; + sleep($this->requestTimeout); + while (true) { + $result = file_get_contents("http://{$this->domain}/res.php?key={$this->apiKey}&action=get&id={$this->captchaId}"); + $this->setError($result); + if ($result == "CAPCHA_NOT_READY") { + $waitTime += $this->requestTimeout; + if ($waitTime > $this->maxTimeout) { + break; + } + sleep($this->requestTimeout); + } else { + $ex = explode('|', $result); + if (trim($ex[0]) == 'OK') { + $this->result = trim($ex[1]); + + return true; + } + } + } + throw new Exception('Лимит времени превышен'); + } catch (Exception $e) { + $this->error = $e->getMessage(); + + return false; + } + } + + /** + * Не верно распознана + */ + public function notTrue() + { + file_get_contents("http://{$this->domain}/res.php?key={$this->apiKey}&action=reportbad&id={$this->captchaId}"); + } + + /** + * Результат + * @return null|string + */ + public function result() + { + return $this->result; + } + + /** + * Ошибка + * @return null|string + */ + public function error() + { + return $this->error; + } + + /** + * Проверка на то произошла ли ошибка + * + * @param $error + * + * @throws Exception + */ + private function setError($error) + { + if (strpos($error, 'ERROR') !== false) { + if (defined(CaptchaErrors::class . '::' . $error)) { + throw new Exception(CaptchaErrors::$error); + } else { + throw new Exception($error); + } + } + } +} diff --git a/src/CaptchaErrors.php b/src/CaptchaErrors.php new file mode 100644 index 0000000..68e43c0 --- /dev/null +++ b/src/CaptchaErrors.php @@ -0,0 +1,41 @@ + 'Нет свободных работников в данный момент, попробуйте позже либо повысьте свою максимальную ставку здесь', + self::ERROR_ZERO_CAPTCHA_FILESIZE => 'Размер капчи которую вы загружаете менее 100 байт', + self::ERROR_TOO_BIG_CAPTCHA_FILESIZE => 'Ваша капча имеет размер более 100 килобайт', + self::ERROR_ZERO_BALANCE => 'Нулевой либо отрицательный баланс', + self::ERROR_IP_NOT_ALLOWED => 'Запрос с этого IP адреса с текущим ключом отклонен. Пожалуйста смотрите раздел управления доступом по IP', + self::ERROR_CAPTCHA_UNSOLVABLE => 'Не смог разгадать капчу', + self::ERROR_BAD_DUPLICATES => 'Функция 100% распознавания не сработала и-за лимита попыток', + self::ERROR_NO_SUCH_METHOD => 'Вы должны слать параметр method в вашем запросе к API, изучите документацию', + self::ERROR_IMAGE_TYPE_NOT_SUPPORTED => 'Невозможно определить тип файла капчи, принимаются только форматы JPG, GIF, PNG', + self::ERROR_KEY_DOES_NOT_EXIST => 'Использован несуществующий key', + self::ERROR_WRONG_USER_KEY => 'Неверный формат параметра key, должно быть 32 символа', + self::ERROR_WRONG_ID_FORMAT => 'Неверный формат ID каптчи. ID должен содержать только цифры', + self::ERROR_WRONG_FILE_EXTENSION => 'Ваша каптча имеет неверное расширение, допустимые расширения jpg,jpeg,gif,png', + ]; +} \ No newline at end of file diff --git a/src/CaptchaInterface.php b/src/CaptchaInterface.php new file mode 100644 index 0000000..f7bd178 --- /dev/null +++ b/src/CaptchaInterface.php @@ -0,0 +1,12 @@ +