Completed
Push — master ( 100fdc...1aa5b0 )
by Владислав
02:06
created

DeCaptchaWiki::getText()   C

Complexity

Conditions 7
Paths 3

Size

Total Lines 28
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 28
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 16
nc 3
nop 2
1
<?php
2
3
namespace jumper423\decaptcha\core;
4
5
/**
6
 * Class DeCaptchaAbstract.
7
 */
8
class DeCaptchaWiki
9
{
10
    private $texts = [];
11
    /**
12
     * @var DeCaptchaBase
13
     */
14
    private $class;
15
    private $lang = 'en';
16
17
    public function setLang($lang)
18
    {
19
        $this->lang = $lang;
20
    }
21
22
    public function __construct($class)
23
    {
24
        $this->class = $class;
25
        $this->texts = [
26
            'constructor_data' => [
27
                ($this->class)::ACTION_FIELD_KEY => '94f39af4bb295c40546fba5c932e0d32',
28
            ],
29
            'recognize_file'      => true,
30
            'recognize_data_file' => 'http://site.com/captcha.jpg',
31
            'recognize_data'      => [
32
                ($this->class)::ACTION_FIELD_FILE => 'http://site.com/captcha.jpg',
33
            ],
34
            'field_main_name_'.($this->class)::ACTION_FIELD_KEY => [
35
                'ru' => 'Ключ',
36
            ],
37
            'field_main_desc_'.($this->class)::ACTION_FIELD_KEY => [
38
                'ru' => 'Ключ от учетной записи',
39
            ],
40
            'field_main_name_'.($this->class)::ACTION_FIELD_LANGUAGE => [
41
                'ru' => 'Язык',
42
            ],
43
            'field_main_desc_'.($this->class)::ACTION_FIELD_LANGUAGE => [
44
                'ru' => 'На каком языке текст на капче',
45
            ],
46
            'field_main_name_'.($this->class)::ACTION_FIELD_FILE => [
47
                'ru' => 'Картинка',
48
            ],
49
            'field_main_desc_'.($this->class)::ACTION_FIELD_FILE => [
50
                'ru' => 'Путь на файл с картинкой или ссылка на него',
51
            ],
52
            'field_main_name_'.($this->class)::ACTION_FIELD_PHRASE => [
53
                'ru' => 'Несколько слов',
54
            ],
55
            'field_main_desc_'.($this->class)::ACTION_FIELD_PHRASE => [
56
                'ru' => 'Работник должен ввести текст с одним или несколькими пробелами',
57
            ],
58
            'field_main_name_'.($this->class)::ACTION_FIELD_REGSENSE => [
59
                'ru' => 'Регистр',
60
            ],
61
            'field_main_desc_'.($this->class)::ACTION_FIELD_REGSENSE => [
62
                'ru' => 'Работник должен ввсести ответ с учетом регистра',
63
            ],
64
            'field_main_name_'.($this->class)::ACTION_FIELD_NUMERIC => [
65
                'ru' => 'Символы',
66
            ],
67
            'field_main_desc_'.($this->class)::ACTION_FIELD_NUMERIC => [
68
                'ru' => 'Какие символы используется в капче',
69
            ],
70
            'field_main_name_'.($this->class)::ACTION_FIELD_CALC => [
71
                'ru' => 'Вычисление',
72
            ],
73
            'field_main_desc_'.($this->class)::ACTION_FIELD_CALC => [
74
                'ru' => 'На капче изображенно математичекая выражение и её необходимо решить',
75
            ],
76
            'field_main_name_'.($this->class)::ACTION_FIELD_MIN_LEN => [
77
                'ru' => 'Длина min',
78
            ],
79
            'field_main_desc_'.($this->class)::ACTION_FIELD_MIN_LEN => [
80
                'ru' => 'Минимальная длина капчи',
81
            ],
82
            'field_main_name_'.($this->class)::ACTION_FIELD_MAX_LEN => [
83
                'ru' => 'Длина max',
84
            ],
85
            'field_main_desc_'.($this->class)::ACTION_FIELD_MAX_LEN => [
86
                'ru' => 'Максимальная длина капчи',
87
            ],
88
            'field_main_name_'.($this->class)::ACTION_FIELD_QUESTION => [
89
                'ru' => 'Вопрос',
90
            ],
91
            'field_main_desc_'.($this->class)::ACTION_FIELD_QUESTION => [
92
                'ru' => 'На изображении задан вопрос, работник должен написать ответ',
93
            ],
94
            'field_main_name_'.($this->class)::ACTION_FIELD_IS_RUSSIAN => [
95
                'ru' => 'Кириллица',
96
            ],
97
            'field_main_desc_'.($this->class)::ACTION_FIELD_IS_RUSSIAN => [
98
                'ru' => 'На изображении присутствуют русские символы',
99
            ],
100
            'field_main_name_'.($this->class)::ACTION_FIELD_LANGUAGE => [
101
                'ru' => 'Язык',
102
            ],
103
            'field_main_desc_'.($this->class)::ACTION_FIELD_LANGUAGE => [
104
                'ru' => 'Символы какого языка размещенны на капче',
105
            ],
106
            'field_main_name_'.($this->class)::ACTION_FIELD_HEADER_ACAO => [
107
                'ru' => 'Кросс-доменный',
108
            ],
109
            'field_main_desc_'.($this->class)::ACTION_FIELD_HEADER_ACAO => [
110
                'ru' => 'Необходимо для кросс-доменных AJAX запросов в браузерных приложениях.',
111
            ],
112
            'field_main_name_'.($this->class)::ACTION_FIELD_INSTRUCTIONS => [
113
                'ru' => 'Инструкция',
114
            ],
115
            'field_main_desc_'.($this->class)::ACTION_FIELD_INSTRUCTIONS => [
116
                'ru' => 'Текстовая капча или инструкция для прохождения капчи.',
117
            ],
118
            'field_main_name_'.($this->class)::ACTION_FIELD_PINGBACK => [
119
                'ru' => 'Ответ на',
120
            ],
121
            'field_main_desc_'.($this->class)::ACTION_FIELD_PINGBACK => [
122
                'ru' => 'Указание для сервера, что после распознания изображения, нужно отправить ответ на указанный адрес.',
123
            ],
124
            'field_main_name_'.($this->class)::ACTION_FIELD_LABEL => [
125
                'ru' => 'От куда',
126
            ],
127
            'field_main_desc_'.($this->class)::ACTION_FIELD_LABEL => [
128
                'ru' => 'Пояснение от куда пришла капча ("vk", "google", "recaptcha", "yandex", "mailru", "yahoo" и т.д.).',
129
            ],
130
            'field_main_name_'.($this->class)::ACTION_FIELD_PAGEURL => [
131
                'ru' => 'Адрес',
132
            ],
133
            'field_main_desc_'.($this->class)::ACTION_FIELD_PAGEURL => [
134
                'ru' => 'Адрес страницы на которой решается капча.',
135
            ],
136
            'field_main_name_'.($this->class)::ACTION_FIELD_GOOGLEKEY => [
137
                'ru' => 'Google key',
138
            ],
139
            'field_main_desc_'.($this->class)::ACTION_FIELD_GOOGLEKEY => [
140
                'ru' => 'Ключ-индентификатор рекапчи на целевой странице. <div class="g-recaptcha" data-sitekey="ВОТ_ЭТОТ"></div>',
141
            ],
142
            'field_main_name_'.($this->class)::ACTION_FIELD_GOOGLETOKEN => [
143
                'ru' => 'Google token',
144
            ],
145
            'field_main_desc_'.($this->class)::ACTION_FIELD_GOOGLETOKEN => [
146
                'ru' => 'Секретный токен для предыдущей версии рекапчи. В большинстве случаев сайты используют новую версию и этот токен не требуется. Секретный токен генерируется на сервере Google и вставляется на страницу в атрибуте data-stoken. Выглядит это примерно так: <script type="text/javascript" src="...." data-type="normal"  data-ray="..." async data-sitekey="..." data-stoken="ВОТ_ЭТОТ"></script> Токен действует пару минут после генерации, затем нужно снова зайти на страницу и получить его.',
147
            ],
148
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYTYPE => [
149
                'ru' => 'Тип прокси',
150
            ],
151
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYTYPE => [
152
                'ru' => 'Тип прокси (http, socks4, ...)',
153
            ],
154
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXY => [
155
                'ru' => 'Адрес прокси',
156
            ],
157
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXY => [
158
                'ru' => 'IP адрес прокси ipv4/ipv6.',
159
            ],
160
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYPORT => [
161
                'ru' => 'Порт прокси',
162
            ],
163
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYPORT => [
164
                'ru' => 'Порт прокси.',
165
            ],
166
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYLOGIN => [
167
                'ru' => 'Логин прокси',
168
            ],
169
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYLOGIN => [
170
                'ru' => 'Логин от прокси-сервера.',
171
            ],
172
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYPASS => [
173
                'ru' => 'Пароль прокси',
174
            ],
175
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYPASS => [
176
                'ru' => 'Пароль от прокси-сервера.',
177
            ],
178
            'field_main_name_'.($this->class)::ACTION_FIELD_USERAGENT => [
179
                'ru' => 'User-Agent браузера',
180
            ],
181
            'field_main_desc_'.($this->class)::ACTION_FIELD_USERAGENT => [
182
                'ru' => 'User-Agent браузера, используемый в эмуляции. Необходимо использовать подпись современного браузера, иначе Google будет возвращать ошибку, требуя обновить браузер.',
183
            ],
184
            'field_main_name_'.($this->class)::ACTION_FIELD_COOKIES => [
185
                'ru' => 'Куки',
186
            ],
187
            'field_main_desc_'.($this->class)::ACTION_FIELD_COOKIES => [
188
                'ru' => 'Дополнительные cookies которые мы должны использовать во время взаимодействия с целевой страницей.',
189
            ],
190
            'table_th_name' => [
191
                'ru' => 'Название',
192
            ],
193
            'table_th_code' => [
194
                'ru' => 'Код',
195
            ],
196
            'table_th_type' => [
197
                'ru' => 'Тип',
198
            ],
199
            'table_th_req' => [
200
                'ru' => 'Обязательное',
201
            ],
202
            'table_th_def' => [
203
                'ru' => 'По умолчания',
204
            ],
205
            'table_th_enum' => [
206
                'ru' => 'Возможные значения',
207
            ],
208
            'table_th_desc' => [
209
                'ru' => 'Описание',
210
            ],
211
            'slug_link' => [
212
                'ru' => 'Ссылка',
213
            ],
214
            'slug_link_to_service' => [
215
                'ru' => 'Ссылка на сервис',
216
            ],
217
            'slug_price' => [
218
                'ru' => 'Цены',
219
            ],
220
            'slug_service_desc' => [
221
                'ru' => 'Описание сервиса',
222
            ],
223
            'slug_recognize_desc' => [
224
                'ru' => 'Описание распознания',
225
            ],
226
            'slug_fields_desc' => [
227
                'ru' => 'Описание полей',
228
            ],
229
            'example' => [
230
                'ru' => 'Примеры',
231
            ],
232
            'example_initialization' => [
233
                'ru' => 'Инициализация',
234
            ],
235
            'example_recognize' => [
236
                'ru' => 'Распознавание',
237
            ],
238
        ];
239
    }
240
241
    /**
242
     * @param string|array $name
243
     * @param string|array $value
244
     */
245
    public function setText($name, $value)
246
    {
247
        if (is_array($name)) {
248
            $name = implode('_', $name);
249
        }
250
        $this->texts[$name] = $value;
251
    }
252
253
    /**
254
     * @param string|array $name
255
     * @param string       $separator
256
     *
257
     * @return string|array
258
     */
259
    public function getText($name, $separator = '; ')
260
    {
261
        $getResult = function ($name, $texts) {
262
            if (is_array($name)) {
263
                $name = implode('_', $name);
264
            }
265
            if (!isset($texts[$name])) {
266
                return null;
267
            }
268
            if (is_array($texts[$name])) {
269
                if (isset($texts[$name][$this->lang])) {
270
                    return $texts[$name][$this->lang];
271
                }
272
273
                return array_values($texts[$name])[0];
274
            }
275
276
            return $texts[$name];
277
        };
278
        $result = $getResult($name, $this->texts);
279
        if (is_array($result)) {
280
            if ($separator) {
281
                $result = implode($separator, $result);
282
            }
283
        }
284
285
        return $result;
286
    }
287
288
    private function viewInstall()
0 ignored issues
show
Unused Code introduced by
This method is not used, and could be removed.
Loading history...
289
    {
290
    }
291
292
    private function viewExamples()
293
    {
294
        $rc = (new \ReflectionClass($this->class));
295
296
        $str = "#####{$this->getText(['example', 'initialization'])}".PHP_EOL;
297
        $str.= "```".PHP_EOL;
298
        $str.= "use {$rc->getName()};".PHP_EOL;
0 ignored issues
show
Bug introduced by
Consider using $rc->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
299
        $str.= "".PHP_EOL;
300
        $str.= '$captcha = new '.$rc->getShortName().'(['.PHP_EOL;
301 View Code Duplication
        foreach ($this->texts['constructor_data'] as $key => $val) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
302
            $str.= "    {$rc->getShortName()}::{$this->getNameConst('ACTION_FIELD_', $key)} => ";
303
            if (is_string($val)) {
304
                $str.= "'{$val}'";
305
            } else {
306
                $str.= "{$val}";
307
            }
308
            $str.= ",".PHP_EOL;
309
        }
310
        $str.= "]);".PHP_EOL;
311
        $str.= "```".PHP_EOL;
312
313
        $str.= "#####{$this->getText(['example', 'recognize'])}".PHP_EOL;
314
        $str.= "```".PHP_EOL;
315
        $str .= 'if ($captcha->recognize(';
316
        if ($this->texts['recognize_file']) {
317
            $str .= "'{$this->getText(['recognize', 'data', 'file'])}'";
318
        }
319
        if ($this->texts['recognize_data']) {
320
            if ($this->texts['recognize_file']) {
321
                $str.= ", ";
322
            }
323
            $str.= "[".PHP_EOL;
324 View Code Duplication
            foreach ($this->texts['recognize_data'] as $key => $val) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
325
                $str.= "    {$rc->getShortName()}::{$this->getNameConst('ACTION_FIELD_', $key)} => ";
326
                if (is_string($val)) {
327
                    $str.= "'{$val}'";
328
                } else {
329
                    $str.= "{$val}";
330
                }
331
                $str.= ",".PHP_EOL;
332
            }
333
            $str.= "]";
334
        }
335
        $str.= ")) {".PHP_EOL;
336
        $str.= '    $code = $captcha->getCode();'.PHP_EOL;
337
        $str.= "} else {".PHP_EOL;
338
        $str.= '    $error = $captcha->getError());'.PHP_EOL;
339
        $str.= "}".PHP_EOL;
340
        $str.= "```".PHP_EOL;
341
342
        /*  constructor_data
0 ignored issues
show
Unused Code Comprehensibility introduced by
55% of this comment could be valid code. Did you maybe forget this after debugging?

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.

Loading history...
343
        use jumper423\decaptcha\services\Anticaptcha;
344
345
$captcha = new Anticaptcha([
346
    Anticaptcha::PARAM_SPEC_API_KEY => '5464654645646',
347
]);
348
$captcha->setErrorLang(\jumper423\decaptcha\core\DeCaptchaErrors::LANG_RU);
349
$captcha->setCauseAnError(true);
350
351
if ($captcha->recognize(__DIR__.'/data/Captcha.jpg')) {
352
    $code = $captcha->getCode();
353
} else {
354
    $error = $captcha->getError());
355
}
356
357
$balance = $captcha->getBalance();
358
359
$captcha->notTrue();
360
        */
361
        return $str;
362
    }
363
364
    private function viewFields()
365
    {
366
        $str = " {$this->getText(['table', 'th', 'name'])} | {$this->getText(['table', 'th', 'code'])} | {$this->getText(['table', 'th', 'type'])} | {$this->getText(['table', 'th', 'req'])} | {$this->getText(['table', 'th', 'def'])} | {$this->getText(['table', 'th', 'enum'])} | {$this->getText(['table', 'th', 'desc'])} ".PHP_EOL;
367
        $str .= ' --- | --- | --- | --- | --- | --- | --- '.PHP_EOL;
368
        foreach ($this->class->actions[($this->class)::ACTION_RECOGNIZE][($this->class)::ACTION_FIELDS] as $param => $setting) {
369
            if (array_key_exists(($this->class)::ACTION_FIELDS, $setting) && is_array($setting[($this->class)::ACTION_FIELDS])) {
370
                foreach ($setting[($this->class)::ACTION_FIELDS] as $param1 => $setting1) {
371
                    if (array_key_exists(($this->class)::PARAM_SLUG_NOTWIKI, $setting1) && $setting1[($this->class)::PARAM_SLUG_NOTWIKI] === true) {
372
                        continue;
373
                    }
374
                    $str .= $this->viewFieldLine($param1, $setting1);
375
                }
376
            }
377
            if (array_key_exists(($this->class)::PARAM_SLUG_NOTWIKI, $setting) && $setting[($this->class)::PARAM_SLUG_NOTWIKI] === true) {
378
                continue;
379
            }
380
            $str .= $this->viewFieldLine($param, $setting);
381
        }
382
383
        return $str;
384
    }
385
386
    private function viewFieldLine($param, $setting)
387
    {
388
        $str = " {$this->getText(['field', 'main', 'name', $param])} |";
389
        $str .= " {$this->getNameConst('ACTION_FIELD_', $param)} |";
390
        $str .= ' '.substr($this->getNameConst('PARAM_FIELD_TYPE_', $setting[($this->class)::PARAM_SLUG_TYPE]), 17).' |';
391
        $str .= ' '.(array_key_exists(($this->class)::PARAM_SLUG_REQUIRE, $setting) ? '+' : '-').' |';
392
        $str .= ' '.(array_key_exists(($this->class)::PARAM_SLUG_DEFAULT, $setting) ? $setting[($this->class)::PARAM_SLUG_DEFAULT] : '').' |';
393
        $str .= " {$this->getText(['field', 'slug', ($this->class)::PARAM_SLUG_ENUM, $param])} |";
394
        $str .= " {$this->getText(['field', 'main', 'desc', $param])} |";
395
        $str .= PHP_EOL;
396
397
        return $str;
398
    }
399
400
    private function getNameConst($keyMask, $value)
401
    {
402
        $constants = (new \ReflectionClass($this->class))->getConstants();
403
        foreach ($constants as $key => $val) {
404
            if (stripos($key, $keyMask) !== false && $val === $value) {
405
                return $key;
406
            }
407
        }
408
409
        return null;
410
    }
411
412
    public function view()
413
    {
414
        $str = $this->getText(['service', 'name']).PHP_EOL;
415
        $str .= '=============='.PHP_EOL;
416
        $str .= "###{$this->getText(['slug', 'link'])}".PHP_EOL;
417
        $str .= "[{$this->getText(['slug', 'link', 'to_service'])} {$this->getText(['service', 'name'])}]({$this->getText(['service', 'href'])})".PHP_EOL.PHP_EOL;
418
        $str .= "###{$this->getText(['slug', 'service', 'desc'])}".PHP_EOL;
419
        $str .= "{$this->getText(['service', 'desc'])}".PHP_EOL.PHP_EOL;
420
        $str .= "###{$this->getText(['slug', 'price'])}".PHP_EOL;
421
        $str .= "{$this->getText(['recognize', 'price'])}".PHP_EOL.PHP_EOL;
422
        $str .= "###{$this->getText(['slug', 'recognize', 'desc'])}".PHP_EOL;
423
        $str .= "{$this->getText(['recognize', 'desc'])}".PHP_EOL.PHP_EOL;
424
        $str .= "###{$this->getText(['example'])}".PHP_EOL;
425
        $str .= "{$this->viewExamples()}".PHP_EOL.PHP_EOL;
426
        $str .= "###{$this->getText(['slug', 'fields', 'desc'])}".PHP_EOL;
427
        $str .= $this->viewFields().PHP_EOL;
428
429
        return $str;
430
    }
431
}
432