Автоматически заполняет опрос, выбирая 'Соответствует ожиданиям' для всех вопросов
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})();