From 723c33e47f1d4092618623eaf1838c24396ad12b Mon Sep 17 00:00:00 2001 From: victorkowalski Date: Wed, 15 Oct 2025 10:11:06 +0300 Subject: [PATCH 1/8] vk --- examples/images/vk.jpg | Bin 0 -> 32255 bytes examples/vk_captcha.php | 19 +++++++++++++++++++ src/TwoCaptcha.php | 26 ++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 examples/images/vk.jpg create mode 100644 examples/vk_captcha.php diff --git a/examples/images/vk.jpg b/examples/images/vk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91809ec9bf5e57554a24455857adcabab70e9ecf GIT binary patch literal 32255 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 B???au literal 0 HcmV?d00001 diff --git a/examples/vk_captcha.php b/examples/vk_captcha.php new file mode 100644 index 0000000..9f21b92 --- /dev/null +++ b/examples/vk_captcha.php @@ -0,0 +1,19 @@ +vk([ + 'sitekey' => 'Y5Lh0tiycconMJGsFd3EbbuNKSp1yaZESUOIHfeV', + 'url' => 'https://rutube.ru', + ]); +} catch (\Exception $e) { + die($e->getMessage()); +} + +die('Captcha solved: ' . $result->code); diff --git a/src/TwoCaptcha.php b/src/TwoCaptcha.php index 901796f..677f1f1 100644 --- a/src/TwoCaptcha.php +++ b/src/TwoCaptcha.php @@ -601,6 +601,32 @@ public function cybersiara($captcha) return $this->solve($captcha); } + /** + * Wrapper for solving vk captcha (image) + * + * @param $captcha + * @return \stdClass + * @throws ApiException + * @throws NetworkException + * @throws TimeoutException + * @throws ValidationException + */ + public function vk($captcha) + { + if (is_string($captcha)) { + $captcha = [ + 'file' => $captcha, + ]; + } + + $this->requireFileOrBase64($captcha); + + $captcha['method'] = empty($captcha['base64']) ? 'post' : 'base64'; + + return $this->solve($captcha); + } + + /** * Sends captcha to `/in.php` and waits for it's result. * This helper can be used insted of manual using of `send` and `getResult` functions. From 9a3acecc5972947db9bd0068fe6abfb9547cb13e Mon Sep 17 00:00:00 2001 From: victorkowalski Date: Thu, 16 Oct 2025 14:25:09 +0300 Subject: [PATCH 2/8] vk captcha --- examples/rotate_options.php | 2 +- examples/text.php | 3 ++- examples/vk_captcha.php | 16 ++++++++++++---- src/TwoCaptcha.php | 12 +----------- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/examples/rotate_options.php b/examples/rotate_options.php index d68c2c5..2ef7f70 100644 --- a/examples/rotate_options.php +++ b/examples/rotate_options.php @@ -5,7 +5,7 @@ require(__DIR__ . '/../src/autoloader.php'); $solver = new \TwoCaptcha\TwoCaptcha([ - 'apiKey' => 'YOUR_API_KEY', + 'apiKey' => $argv[1], 'server' => 'http://2captcha.com' ]); diff --git a/examples/text.php b/examples/text.php index ae48d20..82b1958 100644 --- a/examples/text.php +++ b/examples/text.php @@ -4,7 +4,8 @@ require(__DIR__ . '/../src/autoloader.php'); -$solver = new \TwoCaptcha\TwoCaptcha('YOUR_API_KEY'); +//$argv[1] = YOUR_API_KEY +$solver = new \TwoCaptcha\TwoCaptcha($argv[1]); try { $result = $solver->text('If tomorrow is Saturday, what day is today?'); diff --git a/examples/vk_captcha.php b/examples/vk_captcha.php index 9f21b92..1cb9caa 100644 --- a/examples/vk_captcha.php +++ b/examples/vk_captcha.php @@ -1,17 +1,25 @@ vk([ - 'sitekey' => 'Y5Lh0tiycconMJGsFd3EbbuNKSp1yaZESUOIHfeV', - 'url' => 'https://rutube.ru', + $result = $solver->solve([ + 'method' => 'vkimage', + 'body' => base64_encode(file_get_contents(__DIR__ . '/images/vk.jpg')), + 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', ]); + /* + $result = $solver->vk([ + 'body' => base64_encode(file_get_contents(__DIR__ . '/images/vk.jpg')), + 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', + ]);*/ } catch (\Exception $e) { die($e->getMessage()); } diff --git a/src/TwoCaptcha.php b/src/TwoCaptcha.php index 677f1f1..e3286fc 100644 --- a/src/TwoCaptcha.php +++ b/src/TwoCaptcha.php @@ -613,20 +613,10 @@ public function cybersiara($captcha) */ public function vk($captcha) { - if (is_string($captcha)) { - $captcha = [ - 'file' => $captcha, - ]; - } - - $this->requireFileOrBase64($captcha); - - $captcha['method'] = empty($captcha['base64']) ? 'post' : 'base64'; - + $captcha['method'] = 'vkimage'; return $this->solve($captcha); } - /** * Sends captcha to `/in.php` and waits for it's result. * This helper can be used insted of manual using of `send` and `getResult` functions. From 520e9b1ee85eebc9ac6106892799fb5c1b03fcfb Mon Sep 17 00:00:00 2001 From: victorkowalski Date: Fri, 17 Oct 2025 09:50:18 +0300 Subject: [PATCH 3/8] vk captcha test --- examples/vk_captcha.php | 26 +++++++++++++++++++------- src/TwoCaptcha.php | 11 +++++++++++ tests/VkTest.php | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 tests/VkTest.php diff --git a/examples/vk_captcha.php b/examples/vk_captcha.php index 1cb9caa..a857841 100644 --- a/examples/vk_captcha.php +++ b/examples/vk_captcha.php @@ -10,16 +10,28 @@ $solver = new TwoCaptcha($argv[1]); try { - $result = $solver->solve([ - 'method' => 'vkimage', + //image-based + $result = $solver->vk([ + //'method' => 'vkimage', 'body' => base64_encode(file_get_contents(__DIR__ . '/images/vk.jpg')), - 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', + 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', ]); + + //token-based /* - $result = $solver->vk([ - 'body' => base64_encode(file_get_contents(__DIR__ . '/images/vk.jpg')), - 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', - ]);*/ + $tokenBasedResult = $solver->vk([ + 'method' => 'vkcaptcha', + 'redirect_uri' => 'https://id.vk.com/not_robot_captcha?domain=vk.com&session_token=eyJ....HGsc5B4LyvjA&variant=popup&blank=1', + 'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', + 'proxy' => [ + 'type' => 'HTTPS', + 'uri' => 'login:password@IP_address:PORT', + ], + ]); + + echo 'TokenBasedResult Captcha solved: ' . $tokenBasedResult->code; + */ + } catch (\Exception $e) { die($e->getMessage()); } diff --git a/src/TwoCaptcha.php b/src/TwoCaptcha.php index e3286fc..f68f068 100644 --- a/src/TwoCaptcha.php +++ b/src/TwoCaptcha.php @@ -613,6 +613,17 @@ public function cybersiara($captcha) */ public function vk($captcha) { + if (is_string($captcha)) { + if (!file_exists($captcha)) { + throw new ValidationException('File not found (' . $captcha . ')'); + } + $body = file_get_contents($captcha); + $body = base64_encode($body); + $captcha = [ + 'body' => $body, + ]; + } + $captcha['method'] = 'vkimage'; return $this->solve($captcha); } diff --git a/tests/VkTest.php b/tests/VkTest.php new file mode 100644 index 0000000..a5f2332 --- /dev/null +++ b/tests/VkTest.php @@ -0,0 +1,35 @@ + '...', + 'file' => $captchaImg, + ]; + + $sendParams = [ + 'method' => 'vkimage', + 'body' => '...', + 'soft_id' => '4585', + ]; + + $sendFiles = [ + 'file' => $captchaImg, + ]; + + $this->checkIfCorrectParamsSendAndResultReturned([ + 'params' => $params, + 'sendParams' => $sendParams, + 'sendFiles' => $sendFiles, + ]); + } +} From ea11d57b14a4b34bbcda7205740390a904eb193c Mon Sep 17 00:00:00 2001 From: victorkowalski Date: Mon, 27 Oct 2025 13:05:10 +0300 Subject: [PATCH 4/8] vk captcha test --- README.md | 34 ++++++++++++++++++++++++++++++++++ examples/vk_captcha.php | 5 ++--- src/TwoCaptcha.php | 9 ++++++++- tests/VkTest.php | 2 +- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6105836..28f2ed9 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,8 @@ Examples of API requests for different captcha types are available on the [PHP c - [atbCAPTCHA](#atbcaptcha) - [DataDome](#datadome) - [CyberSiARA](#cybersiara) + - [VK Captcha](#vk-captcha) + - [VK Image](#vk-image) - [Other methods](#other-methods) - [send / getResult](#send--getresult) - [balance](#balance) @@ -444,6 +446,38 @@ $result = $solver->cybersiara([ ]); ``` +### VK Image + +[API method description.](https://2captcha.com/2captcha-api#vkcaptcha) + +We offer two methods to solve this type of captcha - token-based and image-based. + +We use the body (image in base64 format) or file (image as file) and steps parameters. +You can get both values from the response to the request https://api.vk.com/method/captchaNotRobot.getContent?v={API_VER} when loading the captcha widget on the page. + +```php + $result = $solver->vkImage([ + 'body' => base64_encode(file_get_contents(__DIR__ . '/images/vk.jpg')), + 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', + ]); +``` +### VK Captcha + +[API method description.](https://2captcha.com/2captcha-api#vk-captcha) + +Token-based method requires redirect_uri parameter, as well as proxy and userAgent. The value of the redirect_uri parameter can be found in the response to requests to the VK API that return captchas. + +```php +$tokenBasedResult = $solver->vkCaptcha([ + 'redirect_uri' => 'https://id.vk.com/not_robot_captcha?domain=vk.com&session_token=eyJ....HGsc5B4LyvjA&variant=popup&blank=1', + 'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', + 'proxy' => [ + 'type' => 'HTTPS', + 'uri' => 'login:password@IP_address:PORT', + ], + ]); +``` + ## Other methods diff --git a/examples/vk_captcha.php b/examples/vk_captcha.php index a857841..4e1e20d 100644 --- a/examples/vk_captcha.php +++ b/examples/vk_captcha.php @@ -11,15 +11,14 @@ try { //image-based - $result = $solver->vk([ - //'method' => 'vkimage', + $result = $solver->vkImage([ 'body' => base64_encode(file_get_contents(__DIR__ . '/images/vk.jpg')), 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', ]); //token-based /* - $tokenBasedResult = $solver->vk([ + $tokenBasedResult = $solver->vkCaptcha([ 'method' => 'vkcaptcha', 'redirect_uri' => 'https://id.vk.com/not_robot_captcha?domain=vk.com&session_token=eyJ....HGsc5B4LyvjA&variant=popup&blank=1', 'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', diff --git a/src/TwoCaptcha.php b/src/TwoCaptcha.php index f68f068..751be85 100644 --- a/src/TwoCaptcha.php +++ b/src/TwoCaptcha.php @@ -611,7 +611,7 @@ public function cybersiara($captcha) * @throws TimeoutException * @throws ValidationException */ - public function vk($captcha) + public function vkImage($captcha) { if (is_string($captcha)) { if (!file_exists($captcha)) { @@ -628,6 +628,13 @@ public function vk($captcha) return $this->solve($captcha); } + public function vkCaptcha($captcha) + { + $captcha['method'] = 'vkcaptcha'; + + return $this->solve($captcha); + } + /** * Sends captcha to `/in.php` and waits for it's result. * This helper can be used insted of manual using of `send` and `getResult` functions. diff --git a/tests/VkTest.php b/tests/VkTest.php index a5f2332..59cc5fa 100644 --- a/tests/VkTest.php +++ b/tests/VkTest.php @@ -4,7 +4,7 @@ class VkTest extends AbstractWrapperTestCase { - protected $method = 'vk'; + protected $method = 'vkImage'; public function testAllParameters() From 3d3305bc5f86484d4ac1e1ad16cdb7ecf13c533a Mon Sep 17 00:00:00 2001 From: victorkowalski Date: Fri, 7 Nov 2025 08:13:58 +0300 Subject: [PATCH 5/8] refactoring --- examples/vk_captcha.php | 8 -------- examples/vk_image.php | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 examples/vk_image.php diff --git a/examples/vk_captcha.php b/examples/vk_captcha.php index 4e1e20d..d72cc9c 100644 --- a/examples/vk_captcha.php +++ b/examples/vk_captcha.php @@ -10,14 +10,7 @@ $solver = new TwoCaptcha($argv[1]); try { - //image-based - $result = $solver->vkImage([ - 'body' => base64_encode(file_get_contents(__DIR__ . '/images/vk.jpg')), - 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', - ]); - //token-based - /* $tokenBasedResult = $solver->vkCaptcha([ 'method' => 'vkcaptcha', 'redirect_uri' => 'https://id.vk.com/not_robot_captcha?domain=vk.com&session_token=eyJ....HGsc5B4LyvjA&variant=popup&blank=1', @@ -29,7 +22,6 @@ ]); echo 'TokenBasedResult Captcha solved: ' . $tokenBasedResult->code; - */ } catch (\Exception $e) { die($e->getMessage()); diff --git a/examples/vk_image.php b/examples/vk_image.php new file mode 100644 index 0000000..2d67c4b --- /dev/null +++ b/examples/vk_image.php @@ -0,0 +1,22 @@ +vkImage([ + 'body' => base64_encode(file_get_contents(__DIR__ . '/images/vk.jpg')), + 'steps' => '[5,12,22,24,21,23,10,7,2,8,19,18,8,24,21,22,11,14,16,5,18,20,4,21,12,6,0,0,11,12,8,20,19,3,14,8,9,13,16,24,18,3,2,23,8,12,6,1,11,0,20,15,19,22,17,24,8,0,12,5,19,14,11,6,7,14,23,24,23,20,4,20,6,12,4,17,4,18,6,20,17,5,23,7,10,2,8,9,5,4,17,24,11,14,4,10,12,22,21,2]', + ]); + +} catch (\Exception $e) { + die($e->getMessage()); +} + +die('Captcha solved: ' . $result->code); From 7c7562c42044aae4d6740279a86fa7f7f98d6747 Mon Sep 17 00:00:00 2001 From: victorkowalski Date: Fri, 7 Nov 2025 08:25:16 +0300 Subject: [PATCH 6/8] vkcaptcha upd --- examples/vk_captcha.php | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/vk_captcha.php b/examples/vk_captcha.php index d72cc9c..2ee0cd1 100644 --- a/examples/vk_captcha.php +++ b/examples/vk_captcha.php @@ -12,7 +12,6 @@ try { $tokenBasedResult = $solver->vkCaptcha([ - 'method' => 'vkcaptcha', 'redirect_uri' => 'https://id.vk.com/not_robot_captcha?domain=vk.com&session_token=eyJ....HGsc5B4LyvjA&variant=popup&blank=1', 'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 'proxy' => [ From 24e281ec58d8fd6a84efbb7b0b39c7826ad8bd81 Mon Sep 17 00:00:00 2001 From: victorkowalski Date: Fri, 7 Nov 2025 10:29:01 +0300 Subject: [PATCH 7/8] vk test --- src/TwoCaptcha.php | 4 ++-- tests/VkCaptchaTest.php | 34 +++++++++++++++++++++++++++ tests/{VkTest.php => VkImageTest.php} | 4 ++-- 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 tests/VkCaptchaTest.php rename tests/{VkTest.php => VkImageTest.php} (88%) diff --git a/src/TwoCaptcha.php b/src/TwoCaptcha.php index 751be85..5373e53 100644 --- a/src/TwoCaptcha.php +++ b/src/TwoCaptcha.php @@ -611,7 +611,7 @@ public function cybersiara($captcha) * @throws TimeoutException * @throws ValidationException */ - public function vkImage($captcha) + public function vkimage($captcha) { if (is_string($captcha)) { if (!file_exists($captcha)) { @@ -628,7 +628,7 @@ public function vkImage($captcha) return $this->solve($captcha); } - public function vkCaptcha($captcha) + public function vkcaptcha($captcha) { $captcha['method'] = 'vkcaptcha'; diff --git a/tests/VkCaptchaTest.php b/tests/VkCaptchaTest.php new file mode 100644 index 0000000..ae8b9cb --- /dev/null +++ b/tests/VkCaptchaTest.php @@ -0,0 +1,34 @@ + 'https://www.site.com/page/', + 'proxy' => [ + 'type' => 'HTTPS', + 'uri' => 'username:str0ngP@$$W0rd@1.2.3.4:4321', + + ] + ]; + + $sendParams = [ + 'method' => 'vkcaptcha', + 'pageurl' => 'https://www.site.com/page/', + 'proxy' => 'username:str0ngP@$$W0rd@1.2.3.4:4321', + 'proxytype' => 'HTTPS', + 'soft_id' => '4585' + ]; + + $this->checkIfCorrectParamsSendAndResultReturned([ + 'params' => $params, + 'sendParams' => $sendParams, + 'sendFiles' => [], + ]); + } +} diff --git a/tests/VkTest.php b/tests/VkImageTest.php similarity index 88% rename from tests/VkTest.php rename to tests/VkImageTest.php index 59cc5fa..f04710f 100644 --- a/tests/VkTest.php +++ b/tests/VkImageTest.php @@ -2,9 +2,9 @@ namespace TwoCaptcha\Tests; -class VkTest extends AbstractWrapperTestCase +class VkImageTest extends AbstractWrapperTestCase { - protected $method = 'vkImage'; + protected $method = 'vkimage'; public function testAllParameters() From 6225767cb2828ca67289c320d2ff426d5f730b6b Mon Sep 17 00:00:00 2001 From: victorkowalski Date: Fri, 5 Dec 2025 17:41:38 +0300 Subject: [PATCH 8/8] composer upd --- composer.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 6a43a4e..35c3541 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,9 @@ "Cutcaptcha", "Friendly Captcha", "atbCAPTCHA", - "DataDome" + "DataDome", + "vkCaptcha", + "vkImage" ], "license": "MIT", "authors": [