|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace jumper423\decaptcha\core; |
|
4
|
|
|
|
|
5
|
|
|
use jumper423\decaptcha\services\RuCaptcha; |
|
6
|
|
|
|
|
7
|
|
|
/** |
|
8
|
|
|
* Class DeCaptchaAbstract. |
|
9
|
|
|
*/ |
|
10
|
|
|
class DeCaptchaWiki |
|
11
|
|
|
{ |
|
12
|
|
|
private $texts = []; |
|
13
|
|
|
|
|
14
|
|
|
public function __construct() |
|
15
|
|
|
{ |
|
16
|
|
|
$this->texts = [ |
|
17
|
|
|
DeCaptchaBase::ACTION_FIELD_KEY => [ |
|
18
|
|
|
'name' => [ |
|
19
|
|
|
'ru' => 'Ключ', |
|
20
|
|
|
], |
|
21
|
|
|
'desc' => [ |
|
22
|
|
|
'ru' => 'Ключ от учетной записи', |
|
23
|
|
|
], |
|
24
|
|
|
], |
|
25
|
|
|
DeCaptchaBase::ACTION_FIELD_LANGUAGE => [ |
|
26
|
|
|
'name' => [ |
|
27
|
|
|
'ru' => 'Язык', |
|
28
|
|
|
], |
|
29
|
|
|
'desc' => [ |
|
30
|
|
|
'ru' => 'На каком языке текст на капче', |
|
31
|
|
|
], |
|
32
|
|
|
], |
|
33
|
|
|
DeCaptchaBase::ACTION_FIELD_FILE => [ |
|
34
|
|
|
'name' => [ |
|
35
|
|
|
'ru' => 'Картинка', |
|
36
|
|
|
], |
|
37
|
|
|
'desc' => [ |
|
38
|
|
|
'ru' => 'Путь на файл с картинкой или ссылка на него', |
|
39
|
|
|
], |
|
40
|
|
|
], |
|
41
|
|
|
DeCaptchaBase::ACTION_FIELD_PHRASE => [ |
|
42
|
|
|
'name' => [ |
|
43
|
|
|
'ru' => 'Несколько слов', |
|
44
|
|
|
], |
|
45
|
|
|
'desc' => [ |
|
46
|
|
|
'ru' => 'Работник должен ввести текст с одним или несколькими пробелами', |
|
47
|
|
|
], |
|
48
|
|
|
], |
|
49
|
|
|
DeCaptchaBase::ACTION_FIELD_REGSENSE => [ |
|
50
|
|
|
'name' => [ |
|
51
|
|
|
'ru' => 'Регистр', |
|
52
|
|
|
], |
|
53
|
|
|
'desc' => [ |
|
54
|
|
|
'ru' => 'Работник должен ввсести ответ с учетом регистра', |
|
55
|
|
|
], |
|
56
|
|
|
], |
|
57
|
|
|
DeCaptchaBase::ACTION_FIELD_NUMERIC => [ |
|
58
|
|
|
'name' => [ |
|
59
|
|
|
'ru' => 'Символы', |
|
60
|
|
|
], |
|
61
|
|
|
'desc' => [ |
|
62
|
|
|
'ru' => 'Какие символы используется в капче', |
|
63
|
|
|
], |
|
64
|
|
|
], |
|
65
|
|
|
DeCaptchaBase::ACTION_FIELD_CALC => [ |
|
66
|
|
|
'name' => [ |
|
67
|
|
|
'ru' => 'Вычисление', |
|
68
|
|
|
], |
|
69
|
|
|
'desc' => [ |
|
70
|
|
|
'ru' => 'На капче изображенно математичекая выражение и её необходимо решить', |
|
71
|
|
|
], |
|
72
|
|
|
], |
|
73
|
|
|
DeCaptchaBase::ACTION_FIELD_MIN_LEN => [ |
|
74
|
|
|
'name' => [ |
|
75
|
|
|
'ru' => 'Длина min', |
|
76
|
|
|
], |
|
77
|
|
|
'desc' => [ |
|
78
|
|
|
'ru' => 'Минимальная длина капчи', |
|
79
|
|
|
], |
|
80
|
|
|
], |
|
81
|
|
|
DeCaptchaBase::ACTION_FIELD_MAX_LEN => [ |
|
82
|
|
|
'name' => [ |
|
83
|
|
|
'ru' => 'Длина max', |
|
84
|
|
|
], |
|
85
|
|
|
'desc' => [ |
|
86
|
|
|
'ru' => 'Максимальная длина капчи', |
|
87
|
|
|
], |
|
88
|
|
|
], |
|
89
|
|
|
DeCaptchaBase::ACTION_FIELD_QUESTION => [ |
|
90
|
|
|
'name' => [ |
|
91
|
|
|
'ru' => 'Вопрос', |
|
92
|
|
|
], |
|
93
|
|
|
'desc' => [ |
|
94
|
|
|
'ru' => 'На изображении задан вопрос, работник должен написать ответ', |
|
95
|
|
|
], |
|
96
|
|
|
], |
|
97
|
|
|
DeCaptchaBase::ACTION_FIELD_IS_RUSSIAN => [ |
|
98
|
|
|
'name' => [ |
|
99
|
|
|
'ru' => 'Кириллица', |
|
100
|
|
|
], |
|
101
|
|
|
'desc' => [ |
|
102
|
|
|
'ru' => 'На изображении присутствуют русские символы', |
|
103
|
|
|
], |
|
104
|
|
|
], |
|
105
|
|
|
DeCaptchaBase::ACTION_FIELD_LANGUAGE => [ |
|
106
|
|
|
'name' => [ |
|
107
|
|
|
'ru' => 'Язык', |
|
108
|
|
|
], |
|
109
|
|
|
'desc' => [ |
|
110
|
|
|
'ru' => 'Символы какого языка размещенны на капче', |
|
111
|
|
|
], |
|
112
|
|
|
], |
|
113
|
|
|
DeCaptchaBase::ACTION_FIELD_HEADER_ACAO => [ |
|
114
|
|
|
'name' => [ |
|
115
|
|
|
'ru' => 'Кросс-доменный', |
|
116
|
|
|
], |
|
117
|
|
|
'desc' => [ |
|
118
|
|
|
'ru' => 'Необходимо для кросс-доменных AJAX запросов в браузерных приложениях.', |
|
119
|
|
|
], |
|
120
|
|
|
], |
|
121
|
|
|
DeCaptchaBase::ACTION_FIELD_TEXTINSTRUCTIONS => [ |
|
122
|
|
|
'name' => [ |
|
123
|
|
|
'ru' => 'Инструкция', |
|
124
|
|
|
], |
|
125
|
|
|
'desc' => [ |
|
126
|
|
|
'ru' => 'Текстовая капча или инструкция для прохождения капчи.', |
|
127
|
|
|
], |
|
128
|
|
|
], |
|
129
|
|
|
DeCaptchaBase::ACTION_FIELD_PINGBACK => [ |
|
130
|
|
|
'name' => [ |
|
131
|
|
|
'ru' => 'Ответ на', |
|
132
|
|
|
], |
|
133
|
|
|
'desc' => [ |
|
134
|
|
|
'ru' => 'Указание для сервера, что после распознания изображения, нужно отправить ответ на указанный адрес.', |
|
135
|
|
|
], |
|
136
|
|
|
], |
|
137
|
|
|
DeCaptchaBase::ACTION_FIELD_LABEL => [ |
|
138
|
|
|
'name' => [ |
|
139
|
|
|
'ru' => 'От куда', |
|
140
|
|
|
], |
|
141
|
|
|
'desc' => [ |
|
142
|
|
|
'ru' => 'Пояснение от куда пришла капча ("vk", "google", "recaptcha", "yandex", "mailru", "yahoo" и т.д.).', |
|
143
|
|
|
], |
|
144
|
|
|
], |
|
145
|
|
|
DeCaptchaBase::ACTION_FIELD_PAGEURL => [ |
|
146
|
|
|
'name' => [ |
|
147
|
|
|
'ru' => 'Адрес', |
|
148
|
|
|
], |
|
149
|
|
|
'desc' => [ |
|
150
|
|
|
'ru' => 'Адрес страницы на которой решается капча.', |
|
151
|
|
|
], |
|
152
|
|
|
], |
|
153
|
|
|
DeCaptchaBase::ACTION_FIELD_GOOGLEKEY => [ |
|
154
|
|
|
'name' => [ |
|
155
|
|
|
'ru' => 'Google key', |
|
156
|
|
|
], |
|
157
|
|
|
'desc' => [ |
|
158
|
|
|
'ru' => 'Ключ-индентификатор рекапчи на целевой странице. <div class="g-recaptcha" data-sitekey="ВОТ_ЭТОТ"></div>', |
|
159
|
|
|
], |
|
160
|
|
|
], |
|
161
|
|
|
DeCaptchaBase::ACTION_FIELD_GOOGLETOKEN => [ |
|
162
|
|
|
'name' => [ |
|
163
|
|
|
'ru' => 'Google token', |
|
164
|
|
|
], |
|
165
|
|
|
'desc' => [ |
|
166
|
|
|
'ru' => 'Секретный токен для предыдущей версии рекапчи. В большинстве случаев сайты используют новую версию и этот токен не требуется. |
|
167
|
|
|
Подробнее |
|
168
|
|
|
Секретный токен генерируется на сервере Google и вставляется на страницу в атрибуте data-stoken. Выглядит это примерно так: |
|
169
|
|
|
```<script type="text/javascript" src="...." data-type="normal" data-ray="2ef1e98c77332d9b" async |
|
170
|
|
|
data-sitekey="6LfOYgoTAAAAAInWDVTLSc8Yblab-c9DaLblabla" |
|
171
|
|
|
data-stoken="urFaI2UjzL9Q4gf4a-aeCNAePAZUuq7nYbX40BVb69aXVq-apf_k-kZ7i-iXE2WxkokWB9rZv-ofOJPjbEh4YN3SyoVrsIorNOpeGSWx2D0"></script>``` |
|
172
|
|
|
Токен действует пару минут после генерации, затем нужно снова зайти на страницу и получить его.', |
|
173
|
|
|
], |
|
174
|
|
|
], |
|
175
|
|
|
DeCaptchaBase::ACTION_FIELD_PROXYTYPE => [ |
|
176
|
|
|
'name' => [ |
|
177
|
|
|
'ru' => 'Тип прокси', |
|
178
|
|
|
], |
|
179
|
|
|
'desc' => [ |
|
180
|
|
|
'ru' => 'Тип прокси (http, socks4, ...)', |
|
181
|
|
|
], |
|
182
|
|
|
], |
|
183
|
|
|
DeCaptchaBase::ACTION_FIELD_PROXY => [ |
|
184
|
|
|
'name' => [ |
|
185
|
|
|
'ru' => 'Адрес прокси', |
|
186
|
|
|
], |
|
187
|
|
|
'desc' => [ |
|
188
|
|
|
'ru' => 'IP адрес прокси ipv4/ipv6.', |
|
189
|
|
|
], |
|
190
|
|
|
], |
|
191
|
|
|
DeCaptchaBase::ACTION_FIELD_PROXYPORT => [ |
|
192
|
|
|
'name' => [ |
|
193
|
|
|
'ru' => 'Порт прокси', |
|
194
|
|
|
], |
|
195
|
|
|
'desc' => [ |
|
196
|
|
|
'ru' => 'Порт прокси.', |
|
197
|
|
|
], |
|
198
|
|
|
], |
|
199
|
|
|
DeCaptchaBase::ACTION_FIELD_PROXYLOGIN => [ |
|
200
|
|
|
'name' => [ |
|
201
|
|
|
'ru' => 'Логин прокси', |
|
202
|
|
|
], |
|
203
|
|
|
'desc' => [ |
|
204
|
|
|
'ru' => 'Логин от прокси-сервера.', |
|
205
|
|
|
], |
|
206
|
|
|
], |
|
207
|
|
|
DeCaptchaBase::ACTION_FIELD_PROXYPASS => [ |
|
208
|
|
|
'name' => [ |
|
209
|
|
|
'ru' => 'Пароль прокси', |
|
210
|
|
|
], |
|
211
|
|
|
'desc' => [ |
|
212
|
|
|
'ru' => 'Пароль от прокси-сервера.', |
|
213
|
|
|
], |
|
214
|
|
|
], |
|
215
|
|
|
DeCaptchaBase::ACTION_FIELD_USERAGENT => [ |
|
216
|
|
|
'name' => [ |
|
217
|
|
|
'ru' => 'User-Agent браузера', |
|
218
|
|
|
], |
|
219
|
|
|
'desc' => [ |
|
220
|
|
|
'ru' => 'User-Agent браузера, используемый в эмуляции. Необходимо использовать подпись современного браузера, |
|
221
|
|
|
иначе Google будет возвращать ошибку, требуя обновить браузер.', |
|
222
|
|
|
], |
|
223
|
|
|
], |
|
224
|
|
|
DeCaptchaBase::ACTION_FIELD_COOKIES => [ |
|
225
|
|
|
'name' => [ |
|
226
|
|
|
'ru' => 'Куки', |
|
227
|
|
|
], |
|
228
|
|
|
'desc' => [ |
|
229
|
|
|
'ru' => 'Дополнительные cookies которые мы должны использовать во время взаимодействия с целевой страницей.', |
|
230
|
|
|
], |
|
231
|
|
|
], |
|
232
|
|
|
]; |
|
233
|
|
|
} |
|
234
|
|
|
|
|
235
|
|
|
public function view() |
|
236
|
|
|
{ |
|
237
|
|
|
$rucaptcha = new RuCaptcha([]); |
|
238
|
|
|
/* |
|
239
|
|
|
* Markdown | Less | Pretty |
|
240
|
|
|
--- | --- | --- |
|
241
|
|
|
*Still* | `renders` | **nicely** |
|
242
|
|
|
1 | 2 | 3 |
|
243
|
|
|
* |
|
244
|
|
|
* */ |
|
245
|
|
|
echo ' Название | Код | Тип | Обязательное значение | Значение по умолчания | Возможные значения | Описание '.PHP_EOL; |
|
246
|
|
|
echo ' --- | --- | --- | --- | --- | ---| --- '.PHP_EOL; |
|
247
|
|
|
$rr = (new \ReflectionClass($rucaptcha))->getConstants(); |
|
248
|
|
|
// print_r($rr); |
|
|
|
|
|
|
249
|
|
|
foreach ($rucaptcha->actions[RuCaptcha::ACTION_RECOGNIZE][RuCaptcha::ACTION_FIELDS] as $param => $setting) { |
|
250
|
|
|
if (array_key_exists(RuCaptcha::PARAM_SLUG_NOTWIKI, $setting) && $setting[RuCaptcha::PARAM_SLUG_NOTWIKI] === true) { |
|
251
|
|
|
continue; |
|
252
|
|
|
} |
|
253
|
|
View Code Duplication |
if (isset($this->texts[$param])) { |
|
|
|
|
|
|
254
|
|
|
echo " {$this->texts[$param]['name']['ru']} |"; |
|
255
|
|
|
} else { |
|
256
|
|
|
echo " |"; |
|
257
|
|
|
} |
|
258
|
|
|
echo " {$this->ggg($rr, 'ACTION_FIELD_', $param)} |"; |
|
259
|
|
|
echo ' '.substr($this->ggg($rr, 'PARAM_FIELD_TYPE_', $setting[RuCaptcha::PARAM_SLUG_TYPE]), 17).' |'; |
|
260
|
|
|
echo ' '.(array_key_exists(RuCaptcha::PARAM_SLUG_REQUIRE, $setting) ? '+' : '-').' |'; |
|
261
|
|
|
echo ' '.(array_key_exists(RuCaptcha::PARAM_SLUG_DEFAULT, $setting) ? $setting[RuCaptcha::PARAM_SLUG_DEFAULT] : '').' |'; |
|
262
|
|
|
echo ' |'; |
|
263
|
|
View Code Duplication |
if (isset($this->texts[$param])) { |
|
|
|
|
|
|
264
|
|
|
echo " {$this->texts[$param]['desc']['ru']} "; |
|
265
|
|
|
} else { |
|
266
|
|
|
echo " "; |
|
267
|
|
|
} |
|
268
|
|
|
echo PHP_EOL; |
|
269
|
|
|
// echo " --- | --- | --- | --- | ---| --- " . PHP_EOL; |
|
|
|
|
|
|
270
|
|
|
// print_r($params); |
|
271
|
|
|
} |
|
272
|
|
|
// $rr = get_defined_constants(true); |
|
|
|
|
|
|
273
|
|
|
// print_r(array_keys($rr)); |
|
274
|
|
|
// print_r($rr); |
|
275
|
|
|
// file_put_contents(__DIR__ . '/12331123', json_encode(get_defined_constants(true))); |
|
276
|
|
|
} |
|
277
|
|
|
|
|
278
|
|
|
public function ggg($constants, $keyMask, $value) |
|
279
|
|
|
{ |
|
280
|
|
|
foreach ($constants as $key => $val) { |
|
281
|
|
|
if (stripos($key, $keyMask) !== false && $val === $value) { |
|
282
|
|
|
return $key; |
|
283
|
|
|
} |
|
284
|
|
|
} |
|
285
|
|
|
|
|
286
|
|
|
return null; |
|
287
|
|
|
} |
|
288
|
|
|
} |
|
289
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.