Completed
Push — master ( 2c0c99...21c0e8 )
by Владислав
06:49 queued 04:26
created

DeCaptchaWiki::line()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 10
nc 4
nop 3
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
        ];
212
    }
213
214
    /**
215
     * @param string|array $name
216
     * @param string|array $value
217
     */
218
    public function setText($name, $value)
219
    {
220
        if (is_array($name)) {
221
            $name = implode('_', $name);
222
        }
223
        $this->texts[$name] = $value;
224
    }
225
226
    /**
227
     * @param string|array $name
228
     * @param string       $separator
229
     *
230
     * @return string
231
     */
232
    public function getText($name, $separator = '; ')
233
    {
234
        $getResult = function ($name, $texts) {
235
            if (is_array($name)) {
236
                $name = implode('_', $name);
237
            }
238
            if (!isset($texts[$name])) {
239
                return null;
240
            }
241
            if (is_array($texts[$name])) {
242
                if (isset($texts[$name][$this->lang])) {
243
                    return $texts[$name][$this->lang];
244
                }
245
246
                return array_values($texts[$name])[0];
247
            }
248
249
            return $texts[$name];
250
        };
251
        $result = $getResult($name, $this->texts);
252
        if (is_array($result)) {
253
            $result = implode($separator, $result);
254
        }
255
256
        return $result;
257
    }
258
259
    public function viewFields()
260
    {
261
        $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;
262
        $str .= ' --- | --- | --- | --- | --- | ---| --- '.PHP_EOL;
263
        $rr = (new \ReflectionClass($this->class))->getConstants();
264
        foreach ($this->class->actions[($this->class)::ACTION_RECOGNIZE][($this->class)::ACTION_FIELDS] as $param => $setting) {
265
            if (array_key_exists(($this->class)::ACTION_FIELDS, $setting) && is_array($setting[($this->class)::ACTION_FIELDS])) {
266
                foreach ($setting[($this->class)::ACTION_FIELDS] as $param1 => $setting1) {
267
                    if (array_key_exists(($this->class)::PARAM_SLUG_NOTWIKI, $setting1) && $setting1[($this->class)::PARAM_SLUG_NOTWIKI] === true) {
268
                        continue;
269
                    }
270
                    $str .= $this->viewFieldLine($rr, $param1, $setting1);
271
                }
272
            }
273
            if (array_key_exists(($this->class)::PARAM_SLUG_NOTWIKI, $setting) && $setting[($this->class)::PARAM_SLUG_NOTWIKI] === true) {
274
                continue;
275
            }
276
            $str .= $this->viewFieldLine($rr, $param, $setting);
277
        }
278
279
        return $str;
280
    }
281
282
    public function viewFieldLine($rr, $param, $setting)
283
    {
284
        $str = " {$this->getText(['field', 'main', 'name', $param])} |";
285
        $str .= " {$this->ggg($rr, 'ACTION_FIELD_', $param)} |";
286
        $str .= ' '.substr($this->ggg($rr, 'PARAM_FIELD_TYPE_', $setting[($this->class)::PARAM_SLUG_TYPE]), 17).' |';
287
        $str .= ' '.(array_key_exists(($this->class)::PARAM_SLUG_REQUIRE, $setting) ? '+' : '-').' |';
288
        $str .= ' '.(array_key_exists(($this->class)::PARAM_SLUG_DEFAULT, $setting) ? $setting[($this->class)::PARAM_SLUG_DEFAULT] : '').' |';
289
        $str .= " {$this->getText(['field', 'slug', ($this->class)::PARAM_SLUG_ENUM, $param])} |";
290
        $str .= " {$this->getText(['field', 'main', 'desc', $param])} |";
291
        $str .= PHP_EOL;
292
293
        return $str;
294
    }
295
296
    public function ggg($constants, $keyMask, $value)
297
    {
298
        foreach ($constants as $key => $val) {
299
            if (stripos($key, $keyMask) !== false && $val === $value) {
300
                return $key;
301
            }
302
        }
303
304
        return null;
305
    }
306
}
307