Completed
Push — master ( 44753c...7d9c12 )
by Владислав
02:17
created

DeCaptchaWiki::getText()   B

Complexity

Conditions 6
Paths 2

Size

Total Lines 22
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 22
rs 8.6737
c 0
b 0
f 0
cc 6
eloc 15
nc 2
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
        $this->lang = $lang;
19
    }
20
21
    public function __construct($class)
22
    {
23
        $this->class = $class;
24
        $this->texts = [
25
            'constructor_data' => [
26
                ($this->class)::ACTION_FIELD_KEY => '94f39af4bb295c40546fba5c932e0d32',
27
            ],
28
            'recognize_file' => true,
29
            'recognize_data_file' => 'http://site.com/captcha.jpg',
30
            'recognize_data' => [
31
                ($this->class)::ACTION_FIELD_FILE => 'http://site.com/captcha.jpg',
32
            ],
33
            'field_main_name_' . ($this->class)::ACTION_FIELD_KEY => [
34
                'ru' => 'Ключ',
35
            ],
36
            'field_main_desc_' . ($this->class)::ACTION_FIELD_KEY => [
37
                'ru' => 'Ключ от учетной записи',
38
            ],
39
            'field_main_name_' . ($this->class)::ACTION_FIELD_LANGUAGE => [
40
                'ru' => 'Язык',
41
            ],
42
            'field_main_desc_' . ($this->class)::ACTION_FIELD_LANGUAGE => [
43
                'ru' => 'На каком языке текст на капче',
44
            ],
45
            'field_main_name_' . ($this->class)::ACTION_FIELD_FILE => [
46
                'ru' => 'Картинка',
47
            ],
48
            'field_main_desc_' . ($this->class)::ACTION_FIELD_FILE => [
49
                'ru' => 'Путь на файл с картинкой или ссылка на него',
50
            ],
51
            'field_main_name_' . ($this->class)::ACTION_FIELD_PHRASE => [
52
                'ru' => 'Несколько слов',
53
            ],
54
            'field_main_desc_' . ($this->class)::ACTION_FIELD_PHRASE => [
55
                'ru' => 'Работник должен ввести текст с одним или несколькими пробелами',
56
            ],
57
            'field_main_name_' . ($this->class)::ACTION_FIELD_REGSENSE => [
58
                'ru' => 'Регистр',
59
            ],
60
            'field_main_desc_' . ($this->class)::ACTION_FIELD_REGSENSE => [
61
                'ru' => 'Работник должен ввсести ответ с учетом регистра',
62
            ],
63
            'field_main_name_' . ($this->class)::ACTION_FIELD_NUMERIC => [
64
                'ru' => 'Символы',
65
            ],
66
            'field_main_desc_' . ($this->class)::ACTION_FIELD_NUMERIC => [
67
                'ru' => 'Какие символы используется в капче',
68
            ],
69
            'field_main_name_' . ($this->class)::ACTION_FIELD_CALC => [
70
                'ru' => 'Вычисление',
71
            ],
72
            'field_main_desc_' . ($this->class)::ACTION_FIELD_CALC => [
73
                'ru' => 'На капче изображенно математичекая выражение и её необходимо решить',
74
            ],
75
            'field_main_name_' . ($this->class)::ACTION_FIELD_MIN_LEN => [
76
                'ru' => 'Длина min',
77
            ],
78
            'field_main_desc_' . ($this->class)::ACTION_FIELD_MIN_LEN => [
79
                'ru' => 'Минимальная длина капчи',
80
            ],
81
            'field_main_name_' . ($this->class)::ACTION_FIELD_MAX_LEN => [
82
                'ru' => 'Длина max',
83
            ],
84
            'field_main_desc_' . ($this->class)::ACTION_FIELD_MAX_LEN => [
85
                'ru' => 'Максимальная длина капчи',
86
            ],
87
            'field_main_name_' . ($this->class)::ACTION_FIELD_QUESTION => [
88
                'ru' => 'Вопрос',
89
            ],
90
            'field_main_desc_' . ($this->class)::ACTION_FIELD_QUESTION => [
91
                'ru' => 'На изображении задан вопрос, работник должен написать ответ',
92
            ],
93
            'field_main_name_' . ($this->class)::ACTION_FIELD_IS_RUSSIAN => [
94
                'ru' => 'Кириллица',
95
            ],
96
            'field_main_desc_' . ($this->class)::ACTION_FIELD_IS_RUSSIAN => [
97
                'ru' => 'На изображении присутствуют русские символы',
98
            ],
99
            'field_main_name_' . ($this->class)::ACTION_FIELD_LANGUAGE => [
100
                'ru' => 'Язык',
101
            ],
102
            'field_main_desc_' . ($this->class)::ACTION_FIELD_LANGUAGE => [
103
                'ru' => 'Символы какого языка размещенны на капче',
104
            ],
105
            'field_main_name_' . ($this->class)::ACTION_FIELD_HEADER_ACAO => [
106
                'ru' => 'Кросс-доменный',
107
            ],
108
            'field_main_desc_' . ($this->class)::ACTION_FIELD_HEADER_ACAO => [
109
                'ru' => 'Необходимо для кросс-доменных AJAX запросов в браузерных приложениях.',
110
            ],
111
            'field_main_name_' . ($this->class)::ACTION_FIELD_INSTRUCTIONS => [
112
                'ru' => 'Инструкция',
113
            ],
114
            'field_main_desc_' . ($this->class)::ACTION_FIELD_INSTRUCTIONS => [
115
                'ru' => 'Текстовая капча или инструкция для прохождения капчи.',
116
            ],
117
            'field_main_name_' . ($this->class)::ACTION_FIELD_PINGBACK => [
118
                'ru' => 'Ответ на',
119
            ],
120
            'field_main_desc_' . ($this->class)::ACTION_FIELD_PINGBACK => [
121
                'ru' => 'Указание для сервера, что после распознания изображения, нужно отправить ответ на указанный адрес.',
122
            ],
123
            'field_main_name_' . ($this->class)::ACTION_FIELD_LABEL => [
124
                'ru' => 'От куда',
125
            ],
126
            'field_main_desc_' . ($this->class)::ACTION_FIELD_LABEL => [
127
                'ru' => 'Пояснение от куда пришла капча ("vk", "google", "recaptcha", "yandex", "mailru", "yahoo" и т.д.).',
128
            ],
129
            'field_main_name_' . ($this->class)::ACTION_FIELD_PAGEURL => [
130
                'ru' => 'Адрес',
131
            ],
132
            'field_main_desc_' . ($this->class)::ACTION_FIELD_PAGEURL => [
133
                'ru' => 'Адрес страницы на которой решается капча.',
134
            ],
135
            'field_main_name_' . ($this->class)::ACTION_FIELD_GOOGLEKEY => [
136
                'ru' => 'Google key',
137
            ],
138
            'field_main_desc_' . ($this->class)::ACTION_FIELD_GOOGLEKEY => [
139
                'ru' => 'Ключ-индентификатор рекапчи на целевой странице. <div class="g-recaptcha" data-sitekey="ВОТ_ЭТОТ"></div>',
140
            ],
141
            'field_main_name_' . ($this->class)::ACTION_FIELD_GOOGLETOKEN => [
142
                'ru' => 'Google token',
143
            ],
144
            'field_main_desc_' . ($this->class)::ACTION_FIELD_GOOGLETOKEN => [
145
                'ru' => 'Секретный токен для предыдущей версии рекапчи. В большинстве случаев сайты используют новую версию и этот токен не требуется. Секретный токен генерируется на сервере Google и вставляется на страницу в атрибуте data-stoken. Выглядит это примерно так: <script type="text/javascript" src="...." data-type="normal"  data-ray="..." async data-sitekey="..." data-stoken="ВОТ_ЭТОТ"></script> Токен действует пару минут после генерации, затем нужно снова зайти на страницу и получить его.',
146
            ],
147
            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXYTYPE => [
148
                'ru' => 'Тип прокси',
149
            ],
150
            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXYTYPE => [
151
                'ru' => 'Тип прокси (http, socks4, ...)',
152
            ],
153
            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXY => [
154
                'ru' => 'Адрес прокси',
155
            ],
156
            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXY => [
157
                'ru' => 'IP адрес прокси ipv4/ipv6.',
158
            ],
159
            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXYPORT => [
160
                'ru' => 'Порт прокси',
161
            ],
162
            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXYPORT => [
163
                'ru' => 'Порт прокси.',
164
            ],
165
            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXYLOGIN => [
166
                'ru' => 'Логин прокси',
167
            ],
168
            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXYLOGIN => [
169
                'ru' => 'Логин от прокси-сервера.',
170
            ],
171
            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXYPASS => [
172
                'ru' => 'Пароль прокси',
173
            ],
174
            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXYPASS => [
175
                'ru' => 'Пароль от прокси-сервера.',
176
            ],
177
            'field_main_name_' . ($this->class)::ACTION_FIELD_USERAGENT => [
178
                'ru' => 'User-Agent браузера',
179
            ],
180
            'field_main_desc_' . ($this->class)::ACTION_FIELD_USERAGENT => [
181
                'ru' => 'User-Agent браузера, используемый в эмуляции. Необходимо использовать подпись современного браузера, иначе Google будет возвращать ошибку, требуя обновить браузер.',
182
            ],
183
            'field_main_name_' . ($this->class)::ACTION_FIELD_COOKIES => [
184
                'ru' => 'Куки',
185
            ],
186
            'field_main_desc_' . ($this->class)::ACTION_FIELD_COOKIES => [
187
                'ru' => 'Дополнительные cookies которые мы должны использовать во время взаимодействия с целевой страницей.',
188
            ],
189
        ];
190
    }
191
192
    /**
193
     * @param string|array $name
194
     * @param string|array $value
195
     */
196
    public function setText($name, $value) {
197
        if (is_array($name)) {
198
            $name = implode('_', $name);
199
        }
200
        $this->texts[$name] = $value;
201
    }
202
203
    /**
204
     * @param string|array $name
205
     * @param string $separator
206
     * @return string
207
     */
208
    public function getText($name, $separator = '; ') {
209
        $getResult = function ($name, $texts) {
210
            if (is_array($name)) {
211
                $name = implode('_', $name);
212
            }
213
            if (!isset($texts[$name])) {
214
                return null;
215
            }
216
            if (is_array($texts[$name])) {
217
                if (isset($texts[$name][$this->lang])) {
218
                    return $texts[$name][$this->lang];
219
                }
220
                return array_values($texts[$name])[0];
221
            }
222
            return $texts[$name];
223
        };
224
        $result = $getResult($name, $this->texts);
225
        if (is_array($result)) {
226
            $result = implode($separator, $result);
227
        }
228
        return $result;
229
    }
230
231
    public function viewFields()
232
    {
233
        echo ' Название | Код | Тип | Обязательное | По умолчания | Возможные значения | Описание '.PHP_EOL;
234
        echo ' --- | --- | --- | --- | --- | ---| --- '.PHP_EOL;
235
        $rr = (new \ReflectionClass($this->class))->getConstants();
236
        foreach ($this->class->actions[($this->class)::ACTION_RECOGNIZE][($this->class)::ACTION_FIELDS] as $param => $setting) {
237
            if (array_key_exists(($this->class)::ACTION_FIELDS, $setting) && is_array($setting[($this->class)::ACTION_FIELDS])) {
238
                foreach ($setting[($this->class)::ACTION_FIELDS] as $param1 => $setting1) {
239
                    if (array_key_exists(($this->class)::PARAM_SLUG_NOTWIKI, $setting1) && $setting1[($this->class)::PARAM_SLUG_NOTWIKI] === true) {
240
                        continue;
241
                    }
242
                    $this->line($rr, $param1, $setting1);
243
                }
244
            }
245
            if (array_key_exists(($this->class)::PARAM_SLUG_NOTWIKI, $setting) && $setting[($this->class)::PARAM_SLUG_NOTWIKI] === true) {
246
                continue;
247
            }
248
            $this->line($rr, $param, $setting);
249
        }
250
    }
251
252
    public function line($rr, $param, $setting)
253
    {
254
        echo " {$this->getText(['field', 'main','name',$param])} |";
255
        echo " {$this->ggg($rr, 'ACTION_FIELD_', $param)} |";
256
        echo ' '.substr($this->ggg($rr, 'PARAM_FIELD_TYPE_', $setting[($this->class)::PARAM_SLUG_TYPE]), 17).' |';
257
        echo ' '.(array_key_exists(($this->class)::PARAM_SLUG_REQUIRE, $setting) ? '+' : '-').' |';
258
        echo ' '.(array_key_exists(($this->class)::PARAM_SLUG_DEFAULT, $setting) ? $setting[($this->class)::PARAM_SLUG_DEFAULT] : '').' |';
259
        echo " {$this->getText(['field', 'slug', ($this->class)::PARAM_SLUG_ENUM,$param])} |";
260
        echo " {$this->getText(['field', 'main','desc',$param])} |";
261
        echo PHP_EOL;
262
    }
263
264
    public function ggg($constants, $keyMask, $value)
265
    {
266
        foreach ($constants as $key => $val) {
267
            if (stripos($key, $keyMask) !== false && $val === $value) {
268
                return $key;
269
            }
270
        }
271
272
        return null;
273
    }
274
}
275