Автозаполнение опроса FBX

Автоматически заполняет опрос, выбирая 'Соответствует ожиданиям' для всех вопросов

Size

9.0 KB

Version

1.1.1

Created

Dec 23, 2025

Updated

about 1 month ago

1// ==UserScript==
2// @name		Автозаполнение опроса FBX
3// @description		Автоматически заполняет опрос, выбирая 'Соответствует ожиданиям' для всех вопросов
4// @version		1.1.1
5// @match		https://*.survey.fbx.happy-inc.ru/*
6// @icon		https://survey.fbx.happy-inc.ru/evaluate/img/favicon.png
7// ==/UserScript==
8(function() {
9    'use strict';
10
11    console.log('Автозаполнение опроса FBX загружено');
12
13    // Функция для создания кнопки виджета
14    function createAutoFillButton() {
15        // Проверяем, не создана ли уже кнопка
16        if (document.getElementById('fbx-autofill-button')) {
17            console.log('Кнопка уже существует');
18            return;
19        }
20
21        // Создаем контейнер для кнопки
22        const buttonContainer = document.createElement('div');
23        buttonContainer.id = 'fbx-autofill-button';
24        buttonContainer.style.cssText = `
25            position: fixed;
26            top: 20px;
27            right: 20px;
28            z-index: 10000;
29            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
30            padding: 12px 24px;
31            border-radius: 8px;
32            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
33            cursor: pointer;
34            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
35            font-size: 14px;
36            font-weight: 600;
37            color: white;
38            transition: all 0.3s ease;
39            user-select: none;
40        `;
41        buttonContainer.textContent = '✨ Заполнить опрос';
42
43        // Добавляем эффекты при наведении
44        buttonContainer.addEventListener('mouseenter', () => {
45            buttonContainer.style.transform = 'translateY(-2px)';
46            buttonContainer.style.boxShadow = '0 6px 20px rgba(0, 0, 0, 0.3)';
47        });
48
49        buttonContainer.addEventListener('mouseleave', () => {
50            buttonContainer.style.transform = 'translateY(0)';
51            buttonContainer.style.boxShadow = '0 4px 15px rgba(0, 0, 0, 0.2)';
52        });
53
54        // Обработчик клика
55        buttonContainer.addEventListener('click', async () => {
56            console.log('Начинаем автозаполнение опроса');
57            await autoFillSurvey();
58        });
59
60        document.body.appendChild(buttonContainer);
61        console.log('Кнопка автозаполнения создана');
62    }
63
64    // Функция для автоматического заполнения опроса
65    async function autoFillSurvey() {
66        const button = document.getElementById('fbx-autofill-button');
67        
68        // Меняем текст кнопки на индикатор загрузки
69        if (button) {
70            button.textContent = '⏳ Заполняю...';
71            button.style.pointerEvents = 'none';
72        }
73
74        try {
75            // Ищем все элементы с текстом "Соответствует ожиданиям"
76            const allElements = document.querySelectorAll('*');
77            const targetElements = [];
78
79            allElements.forEach(element => {
80                // Проверяем, содержит ли элемент точный текст "Соответствует ожиданиям"
81                if (element.textContent.trim() === 'Соответствует ожиданиям') {
82                    // Проверяем, что это не вложенный элемент (берем только самые внешние)
83                    let isNested = false;
84                    targetElements.forEach(existing => {
85                        if (existing.contains(element)) {
86                            isNested = true;
87                        }
88                    });
89                    
90                    if (!isNested) {
91                        targetElements.push(element);
92                    }
93                }
94            });
95
96            console.log(`Найдено элементов "Соответствует ожиданиям": ${targetElements.length}`);
97
98            // Кликаем по каждому элементу с небольшой задержкой
99            for (let i = 0; i < targetElements.length; i++) {
100                const element = targetElements[i];
101                
102                // Пробуем кликнуть по самому элементу или его родителю
103                let clickTarget = element;
104                
105                // Если элемент - это span или div без обработчика клика, ищем кликабельного родителя
106                if (element.tagName === 'SPAN' || element.tagName === 'DIV') {
107                    let parent = element.parentElement;
108                    let attempts = 0;
109                    while (parent && attempts < 5) {
110                        // Проверяем, есть ли у родителя обработчики событий или это кнопка/ссылка
111                        const hasClickHandler = parent.onclick || 
112                                              parent.getAttribute('onclick') || 
113                                              parent.hasAttribute('@click') ||
114                                              parent.hasAttribute('v-on:click') ||
115                                              parent.tagName === 'BUTTON' ||
116                                              parent.tagName === 'A' ||
117                                              parent.getAttribute('role') === 'button';
118                        
119                        if (hasClickHandler) {
120                            clickTarget = parent;
121                            break;
122                        }
123                        parent = parent.parentElement;
124                        attempts++;
125                    }
126                }
127
128                // Проверяем, не активна ли уже кнопка (цвет фона rgb(219, 225, 77))
129                const computedStyle = window.getComputedStyle(clickTarget);
130                const backgroundColor = computedStyle.backgroundColor;
131                
132                // Проверяем цвет фона - если уже активна, пропускаем
133                if (backgroundColor === 'rgb(219, 225, 77)') {
134                    console.log(`Элемент ${i + 1}/${targetElements.length} уже активен, пропускаем`);
135                    continue;
136                }
137
138                console.log(`Кликаем по элементу ${i + 1}/${targetElements.length}`, clickTarget);
139                
140                // Выполняем клик
141                clickTarget.click();
142                
143                // Небольшая задержка между кликами
144                await new Promise(resolve => setTimeout(resolve, 300));
145            }
146
147            console.log('Автозаполнение завершено');
148            
149            // Меняем текст кнопки на успех
150            if (button) {
151                button.textContent = '✅ Готово!';
152                button.style.background = 'linear-gradient(135deg, #11998e 0%, #38ef7d 100%)';
153                
154                // Через 2 секунды возвращаем исходный вид
155                setTimeout(() => {
156                    button.textContent = '✨ Заполнить опрос';
157                    button.style.background = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';
158                    button.style.pointerEvents = 'auto';
159                }, 2000);
160            }
161
162        } catch (error) {
163            console.error('Ошибка при автозаполнении:', error);
164            
165            // Показываем ошибку
166            if (button) {
167                button.textContent = '❌ Ошибка';
168                button.style.background = 'linear-gradient(135deg, #eb3349 0%, #f45c43 100%)';
169                
170                setTimeout(() => {
171                    button.textContent = '✨ Заполнить опрос';
172                    button.style.background = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';
173                    button.style.pointerEvents = 'auto';
174                }, 2000);
175            }
176        }
177    }
178
179    // Ждем загрузки страницы
180    function init() {
181        // Проверяем, загружена ли страница
182        if (document.readyState === 'loading') {
183            document.addEventListener('DOMContentLoaded', () => {
184                setTimeout(createAutoFillButton, 1000);
185            });
186        } else {
187            // Страница уже загружена
188            setTimeout(createAutoFillButton, 1000);
189        }
190    }
191
192    // Запускаем инициализацию
193    init();
194
195})();
Автозаполнение опроса FBX | Robomonkey