1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace jumper423\decaptcha\services; |
4
|
|
|
|
5
|
|
|
use jumper423\decaptcha\core\DeCaptchaBase; |
6
|
|
|
use jumper423\decaptcha\core\DeCaptchaErrors; |
7
|
|
|
|
8
|
|
|
/** |
9
|
|
|
* Class Anticaptcha. |
10
|
|
|
*/ |
11
|
|
|
class Anticaptcha extends DeCaptchaBase |
12
|
|
|
{ |
13
|
|
|
protected $host = 'api.anti-captcha.com'; |
14
|
|
|
protected $scheme = 'https'; |
15
|
|
|
|
16
|
|
|
const RESPONSE_RECOGNIZE_OK = 0; |
17
|
|
|
const RESPONSE_RECOGNIZE_REPEAT = 2; |
18
|
|
|
const RESPONSE_GET_OK = 'ready'; |
19
|
|
|
const RESPONSE_GET_REPEAT = 'processing'; |
20
|
|
|
|
21
|
|
|
const DECODE_PARAM_ERROR = 4; |
22
|
|
|
const DECODE_PARAM_BALANCE = 5; |
23
|
|
|
|
24
|
|
|
const ACTION_BALANCE = 4; |
25
|
|
|
const DECODE_ACTION_BALANCE = 4; |
26
|
|
|
|
27
|
|
|
protected $paramsNames = [ |
28
|
|
|
self::ACTION_FIELD_KEY => 'clientKey', |
29
|
|
|
self::ACTION_FIELD_SOFT_ID => 'softId', |
30
|
|
|
self::ACTION_FIELD_LANGUAGE => 'languagePool', |
31
|
|
|
self::ACTION_FIELD_TASK => 'task', |
32
|
|
|
self::ACTION_FIELD_METHOD => 'type', |
33
|
|
|
self::ACTION_FIELD_FILE => 'body', |
34
|
|
|
self::ACTION_FIELD_PHRASE => 'phrase', |
35
|
|
|
self::ACTION_FIELD_REGSENSE => 'case', |
36
|
|
|
self::ACTION_FIELD_NUMERIC => 'numeric', |
37
|
|
|
self::ACTION_FIELD_CALC => 'math', |
38
|
|
|
self::ACTION_FIELD_MIN_LEN => 'minLength', |
39
|
|
|
self::ACTION_FIELD_MAX_LEN => 'maxLength', |
40
|
|
|
self::ACTION_FIELD_CAPTCHA_ID => 'taskId', |
41
|
|
|
]; |
42
|
|
|
|
43
|
|
|
public function init() |
44
|
|
|
{ |
45
|
|
|
parent::init(); |
46
|
|
|
|
47
|
|
|
$this->actions[static::ACTION_RECOGNIZE] = [ |
48
|
|
|
static::ACTION_URI => 'createTask', |
49
|
|
|
static::ACTION_METHOD => static::ACTION_METHOD_POST, |
50
|
|
|
static::ACTION_JSON => true, |
51
|
|
|
static::ACTION_FIELDS => [ |
52
|
|
|
static::ACTION_FIELD_KEY => [ |
53
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
54
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_API_KEY, |
55
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
56
|
|
|
], |
57
|
|
|
static::ACTION_FIELD_SOFT_ID => [ |
58
|
|
|
static::PARAM_SLUG_VARIABLE => false, |
59
|
|
|
static::PARAM_SLUG_DEFAULT => 825, |
60
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
61
|
|
|
static::PARAM_SLUG_NOTWIKI => true, |
62
|
|
|
], |
63
|
|
|
static::ACTION_FIELD_LANGUAGE => [ |
64
|
|
|
static::PARAM_SLUG_DEFAULT => 'en', |
65
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
66
|
|
|
static::PARAM_SLUG_ENUM => [ |
67
|
|
|
'en', |
68
|
|
|
'rn', |
69
|
|
|
], |
70
|
|
|
], |
71
|
|
|
static::ACTION_FIELD_TASK => [ |
72
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
73
|
|
|
static::PARAM_SLUG_DEFAULT => [], |
74
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_OBJECT, |
75
|
|
|
static::PARAM_SLUG_NOTWIKI => true, |
76
|
|
|
static::ACTION_FIELDS => [ |
77
|
|
|
static::ACTION_FIELD_METHOD => [ |
78
|
|
|
static::PARAM_SLUG_DEFAULT => 'ImageToTextTask', |
79
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
80
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
81
|
|
|
static::PARAM_SLUG_NOTWIKI => true, |
82
|
|
|
], |
83
|
|
|
static::ACTION_FIELD_FILE => [ |
84
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
85
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_FILE, |
86
|
|
|
static::PARAM_SLUG_CODING => static::PARAM_SLUG_CODING_BASE64, |
87
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
88
|
|
|
], |
89
|
|
|
static::ACTION_FIELD_PHRASE => [ |
90
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_BOOLEAN, |
91
|
|
|
static::PARAM_SLUG_ENUM => [ |
92
|
|
|
true, |
93
|
|
|
false, |
94
|
|
|
], |
95
|
|
|
], |
96
|
|
|
static::ACTION_FIELD_REGSENSE => [ |
97
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_BOOLEAN, |
98
|
|
|
static::PARAM_SLUG_ENUM => [ |
99
|
|
|
true, |
100
|
|
|
false, |
101
|
|
|
], |
102
|
|
|
], |
103
|
|
|
static::ACTION_FIELD_NUMERIC => [ |
104
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
105
|
|
|
static::PARAM_SLUG_ENUM => [ |
106
|
|
|
0, |
107
|
|
|
1, |
108
|
|
|
2, |
109
|
|
|
], |
110
|
|
|
], |
111
|
|
|
static::ACTION_FIELD_CALC => [ |
112
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_BOOLEAN, |
113
|
|
|
static::PARAM_SLUG_ENUM => [ |
114
|
|
|
true, |
115
|
|
|
false, |
116
|
|
|
], |
117
|
|
|
], |
118
|
|
|
static::ACTION_FIELD_MIN_LEN => [ |
119
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
120
|
|
|
], |
121
|
|
|
static::ACTION_FIELD_MAX_LEN => [ |
122
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
123
|
|
|
], |
124
|
|
|
], |
125
|
|
|
], |
126
|
|
|
], |
127
|
|
|
]; |
128
|
|
|
$this->actions[static::ACTION_UNIVERSAL_WITH_CAPTCHA] = [ |
129
|
|
|
static::ACTION_URI => 'getTaskResult', |
130
|
|
|
static::ACTION_METHOD => static::ACTION_METHOD_POST, |
131
|
|
|
static::ACTION_JSON => true, |
132
|
|
|
static::ACTION_FIELDS => [ |
133
|
|
|
static::ACTION_FIELD_KEY => [ |
134
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
135
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_API_KEY, |
136
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
137
|
|
|
], |
138
|
|
|
static::ACTION_FIELD_CAPTCHA_ID => [ |
139
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
140
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_CAPTCHA, |
141
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
142
|
|
|
], |
143
|
|
|
], |
144
|
|
|
]; |
145
|
|
|
$this->actions[static::ACTION_BALANCE] = [ |
146
|
|
|
static::ACTION_URI => 'getBalance', |
147
|
|
|
static::ACTION_METHOD => static::ACTION_METHOD_POST, |
148
|
|
|
static::ACTION_JSON => true, |
149
|
|
|
static::ACTION_FIELDS => [ |
150
|
|
|
static::ACTION_FIELD_KEY => [ |
151
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
152
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_API_KEY, |
153
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
154
|
|
|
], |
155
|
|
|
], |
156
|
|
|
]; |
157
|
|
|
|
158
|
|
|
$this->decodeSettings[static::DECODE_ACTION][static::DECODE_ACTION_RECOGNIZE] = [ |
159
|
|
|
static::DECODE_FORMAT => static::RESPONSE_TYPE_JSON, |
160
|
|
|
static::DECODE_PARAMS => [ |
161
|
|
|
static::DECODE_PARAM_RESPONSE => [ |
162
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'errorId', |
163
|
|
|
], |
164
|
|
|
static::DECODE_PARAM_CAPTCHA => [ |
165
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'taskId', |
166
|
|
|
], |
167
|
|
|
static::DECODE_PARAM_ERROR => [ |
168
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'errorCode', |
169
|
|
|
], |
170
|
|
|
], |
171
|
|
|
]; |
172
|
|
|
$this->decodeSettings[static::DECODE_ACTION][static::DECODE_ACTION_GET] = [ |
173
|
|
|
static::DECODE_FORMAT => static::RESPONSE_TYPE_JSON, |
174
|
|
|
static::DECODE_PARAMS => [ |
175
|
|
|
static::DECODE_PARAM_RESPONSE => [ |
176
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'status', |
177
|
|
|
], |
178
|
|
|
static::DECODE_PARAM_CODE => [ |
179
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'solution.text', |
180
|
|
|
], |
181
|
|
|
static::DECODE_PARAM_ERROR => [ |
182
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'errorCode', |
183
|
|
|
], |
184
|
|
|
], |
185
|
|
|
]; |
186
|
|
|
$this->decodeSettings[static::DECODE_ACTION][static::DECODE_ACTION_BALANCE] = [ |
187
|
|
|
static::DECODE_FORMAT => static::RESPONSE_TYPE_JSON, |
188
|
|
|
static::DECODE_PARAMS => [ |
189
|
|
|
static::DECODE_PARAM_RESPONSE => [ |
190
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'errorId', |
191
|
|
|
], |
192
|
|
|
static::DECODE_PARAM_BALANCE => [ |
193
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'balance', |
194
|
|
|
], |
195
|
|
|
static::DECODE_PARAM_ERROR => [ |
196
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 'errorCode', |
197
|
|
|
], |
198
|
|
|
], |
199
|
|
|
]; |
200
|
|
|
|
201
|
|
|
$this->wiki->setText(['service', 'name'], 'Anti Captcha'); |
202
|
|
|
$this->wiki->setText(['service', 'href'], 'http://infoblog1.ru/goto/anti-captcha'); |
203
|
|
|
$this->wiki->setText(['service', 'desc'], [ |
204
|
|
|
'ru' => 'Сервис AntiCaptcha, ранее белее известный как Antigate. |
205
|
|
|
|
206
|
|
|
100% капч распознаются нашими работниками со всего мира. Именно поэтому используя наш сервис вы одновременно помогаете тысячам людей по всему миру обеспечивать себя и своих близких. |
207
|
|
|
|
208
|
|
|
Деньги, которые наши работники зарабатывают у нас считаются хорошей зарплатой в таких странах как Индия, Пакистан или Вьетнам. С вашей помощью теперь у них есть выбор между работой на грязном производстве и работой за компьютером.', |
209
|
|
|
'en' => 'The AntiCaptcha service, formerly known as whiter Antigate. |
210
|
|
|
|
211
|
|
|
100% of captchas can be recognized by our employees from around the world. That is why using our service you help thousands of people around the world to provide themselves and their families. |
212
|
|
|
|
213
|
|
|
The money our employees earn are considered a good salary in countries such as India, Pakistan or Vietnam. With your help, they now have the choice between working on the dirty production and computer work.', |
214
|
|
|
]); |
215
|
|
|
$this->wiki->setText(['recognize', 'price'], [ |
216
|
|
|
'ru' => 'От 0.7 USD за каждые 1000 капч, в зависимости от ваших объемов', |
217
|
|
|
'en' => 'From 0.7 USD per 1000 captchas, depending on your volume', |
218
|
|
|
]); |
219
|
|
|
$this->wiki->setText(['recognize', 'desc'], [ |
220
|
|
|
'ru' => 'Решение обычной капчи с текстом.', |
221
|
|
|
'en' => 'The solution to the normal captcha text.', |
222
|
|
|
]); |
223
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_PHRASE], [ |
224
|
|
|
'ru' => [ |
225
|
|
|
'false - нет требований', |
226
|
|
|
'true - работник должен ввести текст с одним или несколькими пробелами', |
227
|
|
|
], |
228
|
|
|
'en' => [ |
229
|
|
|
'false - there are no requirements', |
230
|
|
|
'true - работник должен ввести текст с одним или несколькими пробелами', |
231
|
|
|
], |
232
|
|
|
]); |
233
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_REGSENSE], [ |
234
|
|
|
'ru' => [ |
235
|
|
|
'false - нет требований', |
236
|
|
|
'true - работник увидит специальный сигнал что ответ необходимо вводить с учетом регистра', |
237
|
|
|
], |
238
|
|
|
'en' => [ |
239
|
|
|
'false - there are no requirements', |
240
|
|
|
'true - the employee will see a special signal that the answer should be entered case sensitive', |
241
|
|
|
], |
242
|
|
|
]); |
243
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_NUMERIC], [ |
244
|
|
|
'ru' => [ |
245
|
|
|
'0 - нет требований', |
246
|
|
|
'1 - можно вводить только цифры', |
247
|
|
|
'2 - вводить можно любые символы кроме цифр', |
248
|
|
|
], |
249
|
|
|
'en' => [ |
250
|
|
|
'0 - there are no requirements', |
251
|
|
|
'1 - you can enter only numbers', |
252
|
|
|
'2 - you can enter any characters except numbers', |
253
|
|
|
], |
254
|
|
|
]); |
255
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_CALC], [ |
256
|
|
|
'ru' => [ |
257
|
|
|
'false - нет требований', |
258
|
|
|
'true - работник увидит специальный сигнал что на капче изображено математическое выражение и необходимо ввести на него ответ', |
259
|
|
|
], |
260
|
|
|
'en' => [ |
261
|
|
|
'false - there are no requirements', |
262
|
|
|
'true - the employee will see a special signal on the captcha depicts a mathematical expression and you need to enter the answer', |
263
|
|
|
], |
264
|
|
|
]); |
265
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_LANGUAGE], [ |
266
|
|
|
'ru' => [ |
267
|
|
|
'en - англоязычная очередь', |
268
|
|
|
'rn - группа стран Россия, Украина, Беларусь, Казахстан', |
269
|
|
|
], |
270
|
|
|
'en' => [ |
271
|
|
|
'en - English turn', |
272
|
|
|
'rn - a group of countries Russia, Ukraine, Belarus, Kazakhstan', |
273
|
|
|
], |
274
|
|
|
]); |
275
|
|
|
$this->wiki->setText(['field', 'main', 'desc', static::ACTION_FIELD_LANGUAGE], [ |
276
|
|
|
'ru' => 'Определяет язык очереди, в которую должна попасть капча.', |
277
|
|
|
'en' => 'Determines the language of the queue to which you want to get captcha.', |
278
|
|
|
]); |
279
|
|
|
$this->wiki->setText(['menu', 'from_service'], [ |
280
|
|
|
AnticaptchaReCaptchaProxeless::class, |
281
|
|
|
AnticaptchaReCaptcha::class, |
282
|
|
|
]); |
283
|
|
|
} |
284
|
|
|
|
285
|
|
|
/** |
286
|
|
|
* @throws DeCaptchaErrors |
287
|
|
|
* |
288
|
|
|
* @return bool |
289
|
|
|
*/ |
290
|
|
|
protected function requestRecognize() |
291
|
|
|
{ |
292
|
|
|
return $this->requestRepeat(static::ACTION_RECOGNIZE, static::DECODE_ACTION_RECOGNIZE, static::PARAM_SPEC_CAPTCHA, static::DECODE_PARAM_CAPTCHA, static::RESPONSE_RECOGNIZE_OK, static::SLEEP_RECOGNIZE, static::RESPONSE_RECOGNIZE_REPEAT, static::DECODE_PARAM_ERROR); |
293
|
|
|
} |
294
|
|
|
|
295
|
|
|
/** |
296
|
|
|
* @throws DeCaptchaErrors |
297
|
|
|
* |
298
|
|
|
* @return bool |
299
|
|
|
*/ |
300
|
|
|
protected function requestCode() |
301
|
|
|
{ |
302
|
|
|
return $this->requestRepeat(static::ACTION_UNIVERSAL_WITH_CAPTCHA, static::DECODE_ACTION_GET, static::PARAM_SPEC_CODE, static::DECODE_PARAM_CODE, static::RESPONSE_GET_OK, static::SLEEP_GET, static::RESPONSE_GET_REPEAT, static::DECODE_PARAM_ERROR); |
303
|
|
|
} |
304
|
|
|
|
305
|
|
|
/** |
306
|
|
|
* Баланс |
307
|
|
|
* |
308
|
|
|
* @return float |
309
|
|
|
*/ |
310
|
|
|
public function getBalance() |
311
|
|
|
{ |
312
|
|
|
$this->setParam(static::ACTION_FIELD_ACTION, static::ACTION_BALANCE); |
313
|
|
|
$response = $this->getResponse(static::ACTION_BALANCE); |
314
|
|
|
$result = $this->decodeResponse(static::DECODE_ACTION_BALANCE, $response); |
315
|
|
|
if ($result[static::DECODE_PARAM_RESPONSE] != 0) { |
316
|
|
|
return 0; |
317
|
|
|
} |
318
|
|
|
|
319
|
|
|
return (float) $result[static::DECODE_PARAM_BALANCE]; |
320
|
|
|
} |
321
|
|
|
} |
322
|
|
|
|