1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace jumper423\decaptcha\services; |
4
|
|
|
|
5
|
|
|
use jumper423\decaptcha\core\DeCaptchaBase; |
6
|
|
|
|
7
|
|
|
/** |
8
|
|
|
* Распознавание капчи RuCaptcha. |
9
|
|
|
* |
10
|
|
|
* Class RuCaptcha |
11
|
|
|
* |
12
|
|
|
* @link http://infoblog1.ru/goto/rucaptcha |
13
|
|
|
*/ |
14
|
|
|
class RuCaptcha extends DeCaptchaBase |
15
|
|
|
{ |
16
|
|
|
protected $host = 'rucaptcha.com'; |
17
|
|
|
|
18
|
|
|
const RESPONSE_REPORTBAD_OK = 'OK_REPORT_RECORDED'; |
19
|
|
|
|
20
|
|
|
protected $paramsNames = [ |
21
|
|
|
self::ACTION_FIELD_METHOD => 'method', |
22
|
|
|
self::ACTION_FIELD_KEY => 'key', |
23
|
|
|
self::ACTION_FIELD_FILE => 'file', |
24
|
|
|
self::ACTION_FIELD_PHRASE => 'phrase', |
25
|
|
|
self::ACTION_FIELD_REGSENSE => 'regsense', |
26
|
|
|
self::ACTION_FIELD_NUMERIC => 'numeric', |
27
|
|
|
self::ACTION_FIELD_MIN_LEN => 'min_len', |
28
|
|
|
self::ACTION_FIELD_MAX_LEN => 'max_len', |
29
|
|
|
self::ACTION_FIELD_LANGUAGE => 'language', |
30
|
|
|
self::ACTION_FIELD_SOFT_ID => 'soft_id', |
31
|
|
|
self::ACTION_FIELD_CAPTCHA_ID => 'id', |
32
|
|
|
self::ACTION_FIELD_ACTION => 'action', |
33
|
|
|
self::ACTION_FIELD_QUESTION => 'question', |
34
|
|
|
self::ACTION_FIELD_HEADER_ACAO => 'header_acao', |
35
|
|
|
self::ACTION_FIELD_INSTRUCTIONS => 'textinstructions', |
36
|
|
|
self::ACTION_FIELD_PINGBACK => 'pingback', |
37
|
|
|
self::ACTION_FIELD_CALC => 'calc', |
38
|
|
|
self::ACTION_FIELD_LANG => 'lang', |
39
|
|
|
]; |
40
|
|
|
|
41
|
|
|
public function init() |
42
|
|
|
{ |
43
|
|
|
parent::init(); |
44
|
|
|
|
45
|
|
|
$this->actions[static::ACTION_RECOGNIZE] = [ |
46
|
|
|
static::ACTION_URI => 'in.php', |
47
|
|
|
static::ACTION_METHOD => static::ACTION_METHOD_POST, |
48
|
|
|
static::ACTION_FIELDS => [ |
49
|
|
|
static::ACTION_FIELD_METHOD => [ |
50
|
|
|
static::PARAM_SLUG_DEFAULT => 'post', |
51
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
52
|
|
|
static::PARAM_SLUG_NOTWIKI => true, |
53
|
|
|
], |
54
|
|
|
static::ACTION_FIELD_KEY => [ |
55
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
56
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_API_KEY, |
57
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
58
|
|
|
], |
59
|
|
|
static::ACTION_FIELD_FILE => [ |
60
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
61
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_FILE, |
62
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_MIX, |
63
|
|
|
], |
64
|
|
|
static::ACTION_FIELD_PHRASE => [ |
65
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
66
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
67
|
|
|
static::PARAM_SLUG_ENUM => [ |
68
|
|
|
0, |
69
|
|
|
1, |
70
|
|
|
], |
71
|
|
|
], |
72
|
|
|
static::ACTION_FIELD_REGSENSE => [ |
73
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
74
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
75
|
|
|
static::PARAM_SLUG_ENUM => [ |
76
|
|
|
0, |
77
|
|
|
1, |
78
|
|
|
], |
79
|
|
|
], |
80
|
|
|
static::ACTION_FIELD_NUMERIC => [ |
81
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
82
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
83
|
|
|
static::PARAM_SLUG_ENUM => [ |
84
|
|
|
0, |
85
|
|
|
1, |
86
|
|
|
2, |
87
|
|
|
3, |
88
|
|
|
], |
89
|
|
|
], |
90
|
|
|
static::ACTION_FIELD_MIN_LEN => [ |
91
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
92
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
93
|
|
|
], |
94
|
|
|
static::ACTION_FIELD_MAX_LEN => [ |
95
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
96
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
97
|
|
|
], |
98
|
|
|
static::ACTION_FIELD_LANGUAGE => [ |
99
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
100
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
101
|
|
|
static::PARAM_SLUG_ENUM => [ |
102
|
|
|
0, |
103
|
|
|
1, |
104
|
|
|
2, |
105
|
|
|
], |
106
|
|
|
], |
107
|
|
|
static::ACTION_FIELD_LANG => [ |
108
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
109
|
|
|
], |
110
|
|
|
static::ACTION_FIELD_QUESTION => [ |
111
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
112
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
113
|
|
|
static::PARAM_SLUG_ENUM => [ |
114
|
|
|
0, |
115
|
|
|
1, |
116
|
|
|
], |
117
|
|
|
], |
118
|
|
|
static::ACTION_FIELD_CALC => [ |
119
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
120
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
121
|
|
|
static::PARAM_SLUG_ENUM => [ |
122
|
|
|
0, |
123
|
|
|
1, |
124
|
|
|
], |
125
|
|
|
], |
126
|
|
|
static::ACTION_FIELD_HEADER_ACAO => [ |
127
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
128
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
129
|
|
|
static::PARAM_SLUG_ENUM => [ |
130
|
|
|
0, |
131
|
|
|
1, |
132
|
|
|
], |
133
|
|
|
], |
134
|
|
|
static::ACTION_FIELD_INSTRUCTIONS => [ |
135
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
136
|
|
|
], |
137
|
|
|
static::ACTION_FIELD_PINGBACK => [ |
138
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
139
|
|
|
], |
140
|
|
|
static::ACTION_FIELD_SOFT_ID => [ |
141
|
|
|
static::PARAM_SLUG_VARIABLE => false, |
142
|
|
|
static::PARAM_SLUG_DEFAULT => 1709, |
143
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
144
|
|
|
static::PARAM_SLUG_NOTWIKI => true, |
145
|
|
|
], |
146
|
|
|
], |
147
|
|
|
]; |
148
|
|
|
$this->actions[static::ACTION_UNIVERSAL] = [ |
149
|
|
|
static::ACTION_URI => 'res.php', |
150
|
|
|
static::ACTION_METHOD => static::ACTION_METHOD_GET, |
151
|
|
|
static::ACTION_FIELDS => [ |
152
|
|
|
static::ACTION_FIELD_KEY => [ |
153
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
154
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_API_KEY, |
155
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
156
|
|
|
], |
157
|
|
|
static::ACTION_FIELD_ACTION => [ |
158
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
159
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
160
|
|
|
], |
161
|
|
|
static::ACTION_FIELD_HEADER_ACAO => [ |
162
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
163
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
164
|
|
|
], |
165
|
|
|
static::ACTION_FIELD_CAPTCHA_ID => [ |
166
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_CAPTCHA, |
167
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
168
|
|
|
], |
169
|
|
|
], |
170
|
|
|
]; |
171
|
|
|
$this->actions[static::ACTION_UNIVERSAL_WITH_CAPTCHA] = [ |
172
|
|
|
static::ACTION_URI => 'res.php', |
173
|
|
|
static::ACTION_METHOD => static::ACTION_METHOD_GET, |
174
|
|
|
static::ACTION_FIELDS => [ |
175
|
|
|
static::ACTION_FIELD_KEY => [ |
176
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
177
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_API_KEY, |
178
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
179
|
|
|
], |
180
|
|
|
static::ACTION_FIELD_CAPTCHA_ID => [ |
181
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
182
|
|
|
static::PARAM_SLUG_SPEC => static::PARAM_SPEC_CAPTCHA, |
183
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
184
|
|
|
], |
185
|
|
|
static::ACTION_FIELD_ACTION => [ |
186
|
|
|
static::PARAM_SLUG_REQUIRE => true, |
187
|
|
|
static::PARAM_SLUG_DEFAULT => 'get', |
188
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_STRING, |
189
|
|
|
static::PARAM_SLUG_VARIABLE => false, |
190
|
|
|
], |
191
|
|
|
static::ACTION_FIELD_HEADER_ACAO => [ |
192
|
|
|
static::PARAM_SLUG_DEFAULT => 0, |
193
|
|
|
static::PARAM_SLUG_TYPE => static::PARAM_FIELD_TYPE_INTEGER, |
194
|
|
|
], |
195
|
|
|
], |
196
|
|
|
]; |
197
|
|
|
|
198
|
|
|
$this->decodeSettings[static::DECODE_ACTION][static::DECODE_ACTION_RECOGNIZE] = [ |
199
|
|
|
static::DECODE_SEPARATOR => '|', |
200
|
|
|
static::DECODE_PARAMS => [ |
201
|
|
|
static::DECODE_PARAM_RESPONSE => [ |
202
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 0, |
203
|
|
|
], |
204
|
|
|
static::DECODE_PARAM_CAPTCHA => [ |
205
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 1, |
206
|
|
|
], |
207
|
|
|
], |
208
|
|
|
]; |
209
|
|
|
$this->decodeSettings[static::DECODE_ACTION][static::DECODE_ACTION_GET] = [ |
210
|
|
|
static::DECODE_SEPARATOR => '|', |
211
|
|
|
static::DECODE_PARAMS => [ |
212
|
|
|
static::DECODE_PARAM_RESPONSE => [ |
213
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 0, |
214
|
|
|
], |
215
|
|
|
static::DECODE_PARAM_CODE => [ |
216
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 1, |
217
|
|
|
], |
218
|
|
|
], |
219
|
|
|
]; |
220
|
|
|
$this->decodeSettings[static::DECODE_ACTION][static::DECODE_ACTION_UNIVERSAL] = [ |
221
|
|
|
static::DECODE_SEPARATOR => '|', |
222
|
|
|
static::DECODE_PARAMS => [ |
223
|
|
|
static::DECODE_PARAM_RESPONSE => [ |
224
|
|
|
static::DECODE_PARAM_SETTING_MARKER => 0, |
225
|
|
|
], |
226
|
|
|
], |
227
|
|
|
]; |
228
|
|
|
|
229
|
|
|
$this->wiki->setText(['service', 'name'], 'RuCaptcha'); |
230
|
|
|
$this->wiki->setText(['service', 'href'], 'http://infoblog1.ru/goto/rucaptcha'); |
231
|
|
|
$this->wiki->setText(['service', 'desc'], [ |
232
|
|
|
'ru' => 'RuCaptcha.com — антикапча-сервис ручного распознавания изображений, здесь встречаются те, кому нужно в режиме реального времени распознать текст с отсканированных документов, бланков, капч и те, кто хочет заработать на вводе текста с экрана. |
233
|
|
|
|
234
|
|
|
В системе работают русскоязычные и англоязычные работники. |
235
|
|
|
|
236
|
|
|
Cервис антикапчи RuCaptcha.com не только поддерживает стандартное API на равне с сервисами pixodrom, antigate, anti-captcha и других, но и предоставляет расширенный фукнционал пополняющийся под каждый виток борьбы с автоматизацией. API RuCaptcha поддерживает решение ReCaptcha v2 (где нужно кликнуть по картинкам), ClickCaptcha (где нужно кликнуть в определённые точки) и Rotatecaptcha (FunCaptcha и другие капчи, которые нужно крутить).', |
237
|
|
|
'en' => 'RuCaptcha.com - antikapchu service manual image recognition, there are those who need real-time to recognize text from scanned documents, forms, and captures those who want to earn on entering text from the screen. |
238
|
|
|
|
239
|
|
|
The system works the Russian-speaking and English-speaking staff. |
240
|
|
|
|
241
|
|
|
Tuning anticaptcha RuCaptcha.com not only supports API standard on par with pixodrom services, antigate, anti-captcha and others, but also provides advanced functional replenishing at each round of combat automation. API RuCaptcha supports the decision ReCaptcha v2 (where you need to click on the pictures), ClickCaptcha (where you need to click on certain points) and Rotatecaptcha (FunCaptcha other CAPTCHA, you need to twist).', |
242
|
|
|
]); |
243
|
|
|
$this->wiki->setText(['recognize', 'price'], [ |
244
|
|
|
'ru' => 'От 18 до 44 руб. за 1000 капч в зависимости от нагрузки', |
245
|
|
|
'en' => 'Starting from 0.5 USD for 1000 solved CAPTCHAs', |
246
|
|
|
]); |
247
|
|
|
$this->wiki->setText(['recognize', 'desc'], [ |
248
|
|
|
'ru' => 'Расшифровка капч с картики. Необходимо указать файл с картинкой или ссылку на него.', |
249
|
|
|
'en' => 'Decrypt the captcha with image. You must specify a file with a picture or a link to it.', |
250
|
|
|
]); |
251
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_PHRASE], [ |
252
|
|
|
'ru' => [ |
253
|
|
|
'0 - одно слово', |
254
|
|
|
'1 - каптча имеет два слова', |
255
|
|
|
], |
256
|
|
|
'en' => [ |
257
|
|
|
'0 - one word', |
258
|
|
|
'1 - captcha has two words', |
259
|
|
|
], |
260
|
|
|
]); |
261
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_REGSENSE], [ |
262
|
|
|
'ru' => [ |
263
|
|
|
'0 - регистр ответа не имеет значения', |
264
|
|
|
'1 - регистр ответа имеет значение', |
265
|
|
|
], |
266
|
|
|
'en' => [ |
267
|
|
|
'0 - the case of the answer is irrelevant', |
268
|
|
|
'1 - the register response value', |
269
|
|
|
], |
270
|
|
|
]); |
271
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_NUMERIC], [ |
272
|
|
|
'ru' => [ |
273
|
|
|
'0 - параметр не задействован', |
274
|
|
|
'1 - капча состоит только из цифр', |
275
|
|
|
'2 - капча состоит только из букв', |
276
|
|
|
'3 - капча состоит либо только из цифр, либо только из букв', |
277
|
|
|
], |
278
|
|
|
'en' => [ |
279
|
|
|
'0 - parameter not used', |
280
|
|
|
'1 - captcha consists only of digits', |
281
|
|
|
'2 - captcha consists only of letters', |
282
|
|
|
'3 - captcha consists of either only numbers or only letters', |
283
|
|
|
], |
284
|
|
|
]); |
285
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_LANGUAGE], [ |
286
|
|
|
'ru' => [ |
287
|
|
|
'0 - параметр не задействован', |
288
|
|
|
'1 - на капче только кириллические буквы', |
289
|
|
|
'2 - на капче только латинские буквы', |
290
|
|
|
], |
291
|
|
|
'en' => [ |
292
|
|
|
'0 - parameter not used', |
293
|
|
|
'1 - the captcha only Cyrillic letters', |
294
|
|
|
'2 - displayed in a CAPTCHA latin characters only', |
295
|
|
|
], |
296
|
|
|
]); |
297
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_QUESTION], [ |
298
|
|
|
'ru' => [ |
299
|
|
|
'0 - параметр не задействован', |
300
|
|
|
'1 - работник должен написать ответ', |
301
|
|
|
], |
302
|
|
|
'en' => [ |
303
|
|
|
'0 - parameter not used', |
304
|
|
|
'1 - the employee must write the answer', |
305
|
|
|
], |
306
|
|
|
]); |
307
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_CALC], [ |
308
|
|
|
'ru' => [ |
309
|
|
|
'0 - параметр не задействован', |
310
|
|
|
'1 - работнику нужно совершить математическое действие с капчи', |
311
|
|
|
], |
312
|
|
|
'en' => [ |
313
|
|
|
'0 - parameter not used', |
314
|
|
|
'1 - the worker needs to perform a mathematical operation with captcha', |
315
|
|
|
], |
316
|
|
|
]); |
317
|
|
|
$this->wiki->setText(['field', 'slug', static::PARAM_SLUG_ENUM, static::ACTION_FIELD_HEADER_ACAO], [ |
318
|
|
|
'ru' => [ |
319
|
|
|
'0 - значение по умолчанию', |
320
|
|
|
'1 - in.php передаст Access-Control-Allow-Origin: * параметр в заголовке ответа', |
321
|
|
|
], |
322
|
|
|
'en' => [ |
323
|
|
|
'0 - the default value', |
324
|
|
|
'1 - in.php will transfer Access-Control-Allow-Origin: * parameter in response header', |
325
|
|
|
], |
326
|
|
|
]); |
327
|
|
|
$this->wiki->setText(['menu', 'from_service'], [ |
328
|
|
|
RuCaptchaInstruction::class, |
329
|
|
|
RuCaptchaClick::class, |
330
|
|
|
RuCaptchaGrid::class, |
331
|
|
|
RuCaptchaReCaptcha::class, |
332
|
|
|
RuCaptchaKeyCaptcha::class, |
333
|
|
|
RuCaptchaFunCaptcha::class, |
334
|
|
|
RuCaptchaReCaptchaV3::class, |
335
|
|
|
RuCaptchaGeeTest::class, |
336
|
|
|
]); |
337
|
|
|
} |
338
|
|
|
|
339
|
|
|
/** |
340
|
|
|
* Баланс |
341
|
|
|
* |
342
|
|
|
* @return float |
343
|
|
|
*/ |
344
|
|
|
public function getBalance() |
345
|
|
|
{ |
346
|
|
|
return (float) $this->requestUniversal('getbalance')[static::DECODE_PARAM_RESPONSE]; |
347
|
|
|
} |
348
|
|
|
|
349
|
|
|
/** |
350
|
|
|
* Не верно распознана. |
351
|
|
|
* |
352
|
|
|
* @return bool |
353
|
|
|
*/ |
354
|
|
|
public function notTrue() |
355
|
|
|
{ |
356
|
|
|
return $this->requestUniversal('reportbad')[static::DECODE_PARAM_RESPONSE] === static::RESPONSE_REPORTBAD_OK; |
357
|
|
|
} |
358
|
|
|
|
359
|
|
|
/** |
360
|
|
|
* Верно распознана. |
361
|
|
|
* |
362
|
|
|
* @return bool |
363
|
|
|
*/ |
364
|
|
|
public function true() |
365
|
|
|
{ |
366
|
|
|
return $this->requestUniversal('reportgood')[static::DECODE_PARAM_RESPONSE] === static::RESPONSE_REPORTBAD_OK; |
367
|
|
|
} |
368
|
|
|
} |
369
|
|
|
|