• Как создать и открыть в новой вкладке html страницу с помощью js?

    @zkrvndm
    Софт для автоматизации
    new_window = window.open();
    new_window.document.write('html код новой странички');
    new_window.document.close();
    Ответ написан
    1 комментарий
  • Какие есть курсы по натяжке вёрстки на разные cms?

    @zkrvndm
    Софт для автоматизации
    Не надейтесь на курсы, лучше поищите репетитора. Разместите заказ на любой доске фриланса, что надо вам сделать натяжку под какой-то движок и обязательно нужен человек с опытом, а уже затем согласовывайте с ним обучение.
    Ответ написан
  • Почему не отрабатывает move_uploaded_file?

    @zkrvndm
    Софт для автоматизации
    Так на вскидку вижу ошибку при отправке файлов:
    for(let i = 0; i < filesCount; i++) {
              data.append(i, filesBlock[i]);
            }
    Ответ написан
  • Как запустить код из консоли хрома при перезагрузке страницы?

    @zkrvndm
    Софт для автоматизации
    Сокрытие блоков с лишними товарами вам никак не поможет ускорить загрузку сайта, это наоборот создаст дополнительную нагрузку и будет все еще тормозное. Вам нужно написать парсер, который аяксом загрузит страницу, вытащит только нужные вам данные и отправит их на почту, это будет быстрее и проще.
    Ответ написан
    Комментировать
  • Как реализовать https прокси с авторизацией в своем расширении хрома?

    @zkrvndm
    Софт для автоматизации
    В фоновом процессе расширения background.js прописываете:
    Развернуть
    // Записываем параметры прокси в глобальную переменную:
    
    window.proxy_auth = {
    	'address': 'Адрес_прокси:Порт_прокси',
    	'proxy_user': 'Логин от прокси',
    	'proxy_password': 'Пароль от прокси'
    };
    
    // Устсновка прокси через назначение PAC-скрипта:
    
    chrome.proxy.settings.set(
    	{
    		value: {
    			mode: 'pac_script',
    			pacScript: {
    				data: 'function FindProxyForURL(url, host) { return "PROXY '+proxy_auth.addres+'"; }'
    			}
    		},
    		scope: 'regular'
    	},
    	function() {
    		console.log('Прокси '+proxy_auth.addres+' установлен');
    	}
    );
    
    // Автоматическая авторизация для установленного прокси:
    
    chrome.webRequest.onAuthRequired.addListener(
    	function(info, callback) {
    		if (info.isProxy && typeof window.proxy_auth !== 'undefined') {
    			callback({
    				authCredentials: {
    					username: window.proxy_auth.proxy_user,
    					password: window.proxy_auth.proxy_password
    				}
    			});
    		}
    		else {
    			callback();
    		}
    	},
    	{ urls: [ '<all_urls>' ] },
    	[ 'asyncBlocking' ]
    );

    В манифесте расширения у вас должны быть прописаны разрешения:
    Развернуть
    {
    	
    	"name" : "Имя расширения",
    	
    	"manifest_version" : 2,
    		
    	"permissions" : [ "proxy", "webRequest", "webRequestBlocking", "<all_urls>" ],
    	
    	"background" : { "persistent": true, "scripts": [ "background.js" ] }
    
    }


    P. S. Сбросить ранее установленный прокси можно установив пустой PAC-скрипт, примерно так:
    Развернуть
    chrome.proxy.settings.set(
    	{
    		value: {
    			mode: 'pac_script',
    			pacScript: {
    				data: 'function FindProxyForURL(url, host) { return "DIRECT"; }'
    			}
    		},
    		scope: 'regular'
    	},
    	function() {
    		console.log('Прокси сброшены');
    	}
    );
    Ответ написан
    2 комментария
  • Заполнение и отправка формы в точно указанное время, можно ли?

    @zkrvndm
    Софт для автоматизации
    Тут все зависит от маленького нюанса, а именно, что будет если отправить форму на секунду раньше? Форма не отправится? Или отправится, но скидку не получишь?
    Ответ написан
    3 комментария
  • Как увеличить длину заголовков в nginx?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Всем спасибо за внимание, я не правильно диагностировал проблему. Оказалось, что у меня nginx падал не потому, что я много GET-параметров засылал, а из-за того, что я в своем php-скрипте слишком большие заголовки возвращал. В общем, оказывается это плохая идея передавать слишком много информации в заголовках.
    Ответ написан
    Комментировать
  • Как передать картинку на бэк как бинарный файл?

    @zkrvndm
    Софт для автоматизации
    Пример отправки файла, чтобы было как у вас на скриншоте:
    async function sendFile() {
    	
    	// Берём из поля выбора файлов самый первый файл за номером 0:
    	var file = document.querySelector('input[type="file"]').files[0];
    	
    	// Создаем форму конструктором:
    	var form_data = new FormData();
    	
    	// Добавляем в форму наш файл из поля:
    	form_data.append('image', file, file.name);
    	
    	// Добавляем остальные данные:
    	
    	form_data.append('title', 'www');
    	form_data.append('body', 'ghghghghgh');
    	form_data.append('tag', '123456');
    	form_data.append('lang', 'ru');
    	form_data.append('published_at', '2020-01-01 20:00:00');
    	
    	// Отправляем форму на сервер (замените адрес обработчика на свой):
    	
    	var response = await (await fetch('https://nadim.work/test.php', {
    		method: 'POST',
    		body: form_data
    	})).text();
    	
    	// Выводим ответ сервера в консоли:
    	
    	console.log("Ответ сервера: " + response);
    	
    	return response;
    	
    }

    Вызывайте функцию sendFile() и смотрите результат.
    Ответ написан
    3 комментария
  • Как ускорить работу если надо одновременно использовать 20 вкладок?

    @zkrvndm
    Софт для автоматизации
    Исправить этот никак нельзя, но можно переделать сам механизм парсинга. Нахрена вам вообще отображать страницу, если вам чисто нужен его html-код? Берете и POST / GET запросом напрямую дергаете информацию и тогда можете парсить хоть в 20 потоков, хоть в 200 потоков.
    Ответ написан
    2 комментария
  • Как получить конкретное форматирование из textarea?

    @zkrvndm
    Софт для автоматизации
    Вам нужно использовать split, чтобы разбить вбитое на 2 части:
    txt = '{{ значение 1/значение 2 }}';
    
    arr = txt.split('/'); // Разбиваем строку по делителю в виде слеша
    left = arr[0].replace(/^\{\{/, '').trim(); // Берем левую часть и убираем скоби в начале
    right = arr[1].replace(/\}\}$/, '').trim(); // Берем правую часть и убираем скобки в конце
    
    console.log(left, right);
    Ответ написан
  • Возможно ли реализовать экспорт текста из WhatsApp в VK?

    @zkrvndm
    Софт для автоматизации
    Да, возможно. Вы можете для этого использовать WhatsApp Business API, либо написать расширение для браузера, через которое парсить информацию из веб-версии мессенджера и передавать на ваш сервер.
    Ответ написан
    Комментировать
  • Переписать Jquery -> JS?

    @zkrvndm
    Софт для автоматизации
    Примерно так:
    document.querySelectorAll('a').forEach(function(element) {
        if (element.innerText.includes('Текст')) {
            element.addEventListener('click', function() {
                alert('Нажат элемент: ' + element.innerText);
            });
        }
    });
    Ответ написан
    Комментировать
  • Как расширения хрома проксируют сайты?

    @zkrvndm
    Софт для автоматизации
    Есть бесплатное расширение AdGuard VPN, там можно настраивать на каких сайтах использовать VPN, а на каких нет.
    Ответ написан
    Комментировать
  • Kubuntu, скайп выходит из аккаунта после перезагрузки, как решить?

    @zkrvndm
    Софт для автоматизации
    У меня такая же проблема на KDE Manjaro:
    https://manjaro.ru/soft/kak-organizovat-avtovhod-v...
    Выяснилось, что проблема наблюдается только на KDE, на гноме таких проблем нет. Нужен менеджер ключей от гнома, чтобы Skype мог сохранять авторизацию.
    Ответ написан
    4 комментария
  • Как вернуть результат асинхронного запроса?

    @zkrvndm
    Софт для автоматизации
    Используйте await:
    var test = await postAjax(url, data);
    console.log(test);

    Если вы этот код будете использовать не в консоли, а где-то в своем коде внутри какой-нибудь функции, то добавьте к этой функции приставку async, чтобы не было ошибки.
    Ответ написан
  • Как с jquery лучше отследить изменение класса?

    @zkrvndm
    Софт для автоматизации
    Используйте MutationObserver.
    Ответ написан
  • Поему ajax не возвращает ответ?

    @zkrvndm
    Софт для автоматизации
    Попробуйте так:
    $(function () {
    	$("#ajax_form").submit(
    		async function(event) {
    			var form = new FormData(event.target);
    			event.preventDefault();
    			try {
    				var response = await $.ajax({
    					url: 'create-article.php',
    					type: 'POST',
    					data: form,
    					processData: false,
    					contentType: false
    				});
    				console.log("Ответ серввера:\n" + response);
    				alert("Ответ серввера:\n" + response);
    			}
    			catch(err) {
    				alert('Ошибка отправки, детали см. в консоли!');
    				console.log('Не удалось отправить форму:');
    				console.error(err);
    			}
    		}
    	);
    });
    Ответ написан
  • Как нажать кнопку на чужом сайте через консоль?

    @zkrvndm
    Софт для автоматизации
    Нажимать надо чекбокс, а не бордюр вокруг него. Попробуйте прожжать сам чекбокс, при этом не забудьте переключить консоль браузера в контекст того iframe, в котором висит галочка.
    Ответ написан
  • Перестал работать прокси-расширение на Хроме, что делать?

    @zkrvndm
    Софт для автоматизации
    Установите AdGuard VPN:
    https://adguard-vpn.com/ru/welcome.html
    Он бесплатный в пределах 3 Гб в месяц, можно настроить автовключение только на определенных сайтах. Плюс, у них там под капотом используется своя собственная разработка, которая отлично маскирует трафик от всяких блокировщиков.
    Ответ написан
    Комментировать
  • JavaScript. Цикл. Кнопка?

    @zkrvndm
    Софт для автоматизации
    Я дам вам функцию кликер с одного из своих расширений, используйте его:
    Асинхронная функция кликер
    function clickElements(selector, regexp, where) {
    	
    	return new Promise(function(returnResult) {
    		
    		var search_result = false;
    		
    		var local_reactive_function = function() {
    			
    			var click_elements = searchElements(selector, regexp, where);
    			
    			if (click_elements.length > 0) {
    				
    				if (search_result === false) {
    					
    					search_result = true;
    					
    					await wait(100);
    					
    					var click_elements = searchElements(selector, regexp, where);
    					
    					if (click_elements.length > 0) {
    						
    						observer.disconnect();
    						
    						for (var n = 0; n < click_elements.length; n++) {
    							click_elements[n].click();
    						}
    						
    						returnResult(click_elements.length);
    						
    					}
    					
    					else {
    						
    						search_result = false;
    						local_reactive_function();
    						
    					}
    					
    				}
    				
    			}
    			
    		}
    		
    		var observer = new MutationObserver(local_reactive_function);
    		
    		observer.observe(document.body, {
    			characterData: true,
    			attributes: true,
    			childList: true,
    			subtree: true
    		});
    		
    		local_reactive_function();
    		
    	});
    	
    }
    
    function searchElements(selector, regexp, where) {
    
    	var search_elements = [];
    	
    	if (typeof where !== 'undefined') {
    		
    		var all_elements = where.querySelectorAll(selector);
    		
    	}
    	
    	else {
    		
    		var all_elements = document.querySelectorAll(selector);
    		
    	}
    	
    	for (var n = 0; n < all_elements.length; n++) {
    		
    		if (typeof regexp == 'object') {
    			
    			if (typeof regexp.test == 'function') {
    				
    				if (regexp.test(all_elements[n].innerText.trim())) {
    					
    					search_elements.push(all_elements[n]);
    					
    				}
    				
    			}
    			
    			
    		}
    		
    		else {
    			
    			search_elements.push(all_elements[n]);
    			
    		}
    	}
    	
    	return search_elements;
    
    }
    
    function wait(ms) {
    	
    	return new Promise(function(success) {
    		
    		setTimeout(function() {
    			success(true);
    		}, ms);
    		
    	});
    	
    }

    Чтобы кликнуть элемент с заранее известным классом просто вызывайте clickElements:
    (async function() {
        await clickElements('CSS-селектор');
    })();

    Функция clickElements обязательно дождется появления кнопок соответствующих указанному CSS-селектору, подождет 100 мс. после появления кнопок, после чего все их нажмёт. Обратите внимание, что если кнопок соответствующих селектору будет несколько, будут нажаты они все, поэтому тщательно подбирайте селектор.

    P. S. Если вам нужно после появления кнопки кликать его безостановочно, просто используйте цикл:
    (async function() {
        while(true) {
            await clickElements('CSS-селектор');
            console.log('Успешно выполнен клик');
        }
    })();

    После появления кнопки клики на него начнут сыпаться с частой один клик каждые 100 мс. пока кнопка не исчезнет.
    Ответ написан
    Комментировать