• Как разобрать запись из базы данных записанную как массив?

    @zkrvndm
    Софт для автоматизации
    Такой формат представления данных называется JSON, большинство языков программирования из под коробки умеют работать с JSON. В случае с языком php нужно использовать функцию json_decode()
    Ответ написан
    Комментировать
  • Какая среда разработки на JavaScript для продвинутых?

    @zkrvndm
    Софт для автоматизации
    Notepad++
    Ответ написан
    Комментировать
  • Проблема с CORS policy: No 'Access-Control-Allow-Origin', при загрузке изображений?

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

    @zkrvndm
    Софт для автоматизации
    Обработка результата (ответа сервера) должна проходить там же, где вы отправляйте форму. Просто сделайте отправку формы через AJAX без перезагрузки страницы и тогда сможете обрабатывать ответ JavaScript-ом.
    Ответ написан
    Комментировать
  • Как передавать сообщения из popup.js в content.js?

    @zkrvndm
    Софт для автоматизации
    Для отправки сообщения из popup-окна в content-скрипт нужно выполнить в popup-окне:
    chrome.tabs.query({}, function(tabs) {
    	for (i = 0; i < tabs.length; i++) {
    		chrome.tabs.sendMessage(tabs[i].id, 'Сообщение, которое нужно передать');
    	}
    });

    Код выше перебирает все вкладки и отправляет во все существующие вкладки указанное сообщение.

    На стороне content-скрипта для приема сообщения должен стоять обработчик:
    chrome.extension.onMessage.addListener(function(msg) {
    	console.log('Принято сообщение: ' + msg);
    });
    Ответ написан
    5 комментариев
  • Как отправить FormData при помощи JS?

    @zkrvndm
    Софт для автоматизации
    Если вам нужен реальный переход, то вам не нужен никакой FormData. Вставьте реальную форму на страницу и искусственно вызовите у него сабмит.

    1. Загуглиие как вставлять html-код на страницу при помощи JavaScript
    2. Загуглите, как искусственно отправить форму со страницы при помощи JavaScript

    Привел бы вам пример, но пишу со смартфона, поэтому придется вам обойтись помощью Гугла.
    Ответ написан
    Комментировать
  • Каков оптимальный способ массовых редиректов?

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

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

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

    Если ваша форма отправляется без авторизации, то тогда вместо кук можете использовать токены. Например, когда пользователь выполняет какие-то действия на сайте (скролит страницу, кликает поля формы или еще что-нибудь), то по факту выполнения этих действий выдаете уникальный одноразовый токен. Соответственно, далее при отправке формы передаёте это токен вместе с формой и проверяйте на стороне сервера.
    Ответ написан
  • Как можно массово парсить сайты?

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

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

    @zkrvndm
    Софт для автоматизации
    AdGuard умеет блокировать рекламу на Ютубе, работает с любым браузером.
    Ответ написан
    1 комментарий
  • Как делать запросы через множество http-прокси одновременно?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Поковырял мануалы и узнал, что оказывается Firefox позволяет работать с множеством прокси разом. Набросал код для совершения запросов через произвольные прокси хоть одновременно, хоть в разнобой.

    Содержимое для вашего background.js:
    Нажмите, чтобы раскрыть код
    // Функция для совершения запросов:
    
    function getText(link, timeout, options) {
    	
    	// Возвращаем промис для удобства:
    	
    	return new Promise(function(endPromise) {
    		
    		// Конвертируем опции запроса в строку:
    		var bs64 = btoa(JSON.stringify(options));
    		
    		// Прячем опции в хеше:
    		var uobj = new URL(link);
    		uobj.hash = '#rp:'+bs64;
    		var new_url = uobj.href;
    		
    		// Создаем новое соединение:
    		var xhr = new XMLHttpRequest();
    		
    		// Открываем соединение:
    		xhr.open('GET', new_url);
    		
    		// Указываем таймаут:
    		xhr.timeout = timeout;
    		
    		// Функция для обработки результата:
    		
    		xhr.onreadystatechange = function() {
    			
    			// Если запрос был полностью завершен:
    			
    			if (xhr.readyState === XMLHttpRequest.DONE) {
    				
    				// Если запрос успешный:
    				
    				if (xhr.status === 200) {
    					
    					// Возвращаем текст ответа:
    					endPromise(xhr.responseText);
    					
    				}
    				
    				// Если запрос не успешный:
    				
    				else {
    					
    					endPromise(false); // Возвращаем false
    					
    				}
    				
    			}
    			
    		}
    		
    		xhr.send(); // Отправляем запрос
    		
    	});
    	
    }
    
    // Обработчик для проксирования некоторых запросов:
    
    browser.proxy.onRequest.addListener(function(request) {
    	
    	// Считываем хеш из адреса запроса:
    	var hash = new URL(request.url)['hash'];
    	
    	// Если хеш содержит
    	// параметры запроса:
    	
    	if (/^#rp:/.test(hash)) {
    		
    		// Получаем из хеша параметры запроса и расшифровываем:
    		var options = JSON.parse(atob(hash.replace(/^#rp:/, '')));
    		
    		// Если в параметрах запроса есть прокси:
    		
    		if (typeof options['proxy'] == 'object') {
    			
    			// Используем эту прокси:
    			return options['proxy'];
    			
    		}
    		
    		// Если в опциях нет прокси:
    		
    		else {
    			
    			// Не используем прокси:
    			return { 'type': 'direct' };
    			
    		}
    		
    	}
    	
    	// Если в хеше нет параметров:
    	
    	else {
    		
    		// Не используем прокси:
    		return { 'type': 'direct' };
    		
    	}
    	
    }, { urls: [ '<all_urls>' ] });
    
    // Обработчик для автоматической авторизация на http-прокси:
    
    browser.webRequest.onAuthRequired.addListener(function(request) {
    	
    	// Считываем хеш из адреса запроса:
    	var hash = new URL(request.url)['hash'];
    	
    	// Если хеш содержит
    	// параметры запроса:
    	
    	if (/^#rp:/.test(hash)) {
    		
    		// Получаем из хеша параметры запроса и расшифровываем:
    		var options = JSON.parse(atob(hash.replace(/^#rp:/, '')));
    		
    		// Если в параметрах запроса есть прокси:
    		
    		if (typeof options['proxy'] == 'object') {
    			
    			// Если в параметрах тип прокси http:
    			
    			if (options['proxy']['type'] == 'http') {
    				
    				// Отдаем логин с паролем для авторизации:
    				
    				return {
    					'authCredentials': {
    						'username': options['proxy']['username'],
    						'password': options['proxy']['password']
    					} 
    				};
    				
    			}
    			
    		}
    		
    	}
    	
    }, { urls: [ '<all_urls>' ] }, [ 'blocking' ]);
    
    // Обработчик для редактирования исходящих заголовков в запросах:
    
    browser.webRequest.onBeforeSendHeaders.addListener(function(request) {
    	
    	// Считываем хеш из адреса запроса:
    	var hash = new URL(request.url)['hash'];
    	
    	// Если хеш содержит
    	// параметры запроса:
    	
    	if (/^#rp:/.test(hash)) {
    		
    		// Получаем из хеша параметры запроса и расшифровываем:
    		var options = JSON.parse(atob(hash.replace(/^#rp:/, '')));
    		
    		// Берём массив заголовков запроса:
    		var headers = request.requestHeaders;
    		
    		// Перебираем заголовки в обратном порядке:
    		
    		for (var n = headers.length - 1; n >= 0; n--) {
    			
    			// Вытаскиваем название текущего заголовка:
    			var header = headers[n].name.toLowerCase();
    			
    			// Если текущий заголовок это Origin, Referer или Cookie:
    			
    			if (header == 'origin' || header == 'referer' || header == 'cookie') {
    				
    				// Удаляем заголовок:
    				headers.splice(n, 1);
    				
    			}
    			
    		}
    		
    		// Если передан Origin:
    		
    		if (options['origin']) {
    			
    			// Добавляем заголовок Origin в массив заголовков запроса:
    			headers.push({ name: 'Origin', value: options['origin'] });
    			
    		}
    		
    		// Если передан Referer:
    		
    		if (options['referer']) {
    			
    			// Добавляем заголовок Referer в массив заголовков запроса:
    			headers.push({ name: 'Referer', value: options['referer'] });
    			
    		}
    		
    		// Если передан Cookie:
    		
    		if (options['cookie']) {
    			
    			// Добавляем заголовок Cookie в массив заголовков запроса:
    			headers.push({ name: 'Cookie', value: options['cookie'] });
    			
    		}
    		
    		// Возвращаем изменённый
    		// массив заголовок запроса:
    		return {requestHeaders: headers};
    		
    	}
    	
    }, {urls: [ '<all_urls>' ] }, [ 'blocking', 'requestHeaders' ]);
    
    // Обработчик для редактирования входящих заголовков:
    
    browser.webRequest.onHeadersReceived.addListener(function(request) {
    	
    	// Считываем хеш из адреса запроса:
    	var hash = new URL(request.url)['hash'];
    	
    	// Если хеш содержит
    	// параметры запроса:
    	
    	if (/^#rp:/.test(hash)) {
    		
    		// Берём массив заголовков запроса:
    		var headers = request.responseHeaders;
    		
    		// Перебираем заголовки в обратном порядке:
    		
    		for (var n = headers.length - 1; n >= 0; n--) {
    			
    			// Вытаскиваем название текущего заголовка:
    			var header = headers[n].name.toLowerCase();
    			
    			// Если это установка куков:
    			
    			if (header == 'set-cookie') {
    				
    				// Удаляем заголовок:
    				headers.splice(n, 1);
    				
    			}
    			
    		}
    		
    		// Добавляем заголовок, что ответ должен быть доступен всем:
    		headers.push({ name: 'Access-Control-Allow-Origin', value: '*' });
    		
    		// Возвращаем изменённый
    		// массив заголовок запроса:
    		return {responseHeaders: headers};
    		
    	}
    	
    }, { urls: [ '<all_urls>' ] }, [ 'blocking', 'responseHeaders' ]);

    Пример совершения запроса через socks5-прокси:
    await getText('https://yandex.ru', 60000, {
    	'proxy': {
    		'type': 'socks',
    		'host': '185.38.84.111',
    		'port': '65234',
    		'username': 'тут_логин',
    		'password': 'тут_пароль'
    	},
    	'origin': 'https://yandex.ru',
    	'referer': 'https://yandex.ru/test',
    	'cookie': 'test1=123; iii=ooo'
    });

    Пример совершения запроса через http-прокси:
    await getText('https://yandex.ru', 60000, {
    	'proxy': {
    		'type': 'http',
    		'host': '185.38.84.111',
    		'port': '65233',
    		'username': 'тут_логин',
    		'password': 'тут_пароль'
    	},
    	'origin': 'https://yandex.ru',
    	'referer': 'https://yandex.ru/test',
    	'cookie': 'test1=123; iii=ooo'
    });

    Вы можете также передавать произвольные Origin, Referer и Cookie, чтобы получше замаскироваться.
    Ответ написан
    Комментировать
  • Мне нужно отправить с jquery объект, принять в php и сразу же отправить его в платежную систему?

    @zkrvndm
    Софт для автоматизации
    У вас не указан размер тела запроса Content-Lenght, без него запрос считается не валидным.
    Ответ написан
    Комментировать
  • Можно ли как то по другому подключать виджет, что бы он не портил оценку сайта в google pageseed?

    @zkrvndm
    Софт для автоматизации
    Сделайте подключение виджета ПОСЛЕ того, как Google PageSpeed загрузил страницу и дал ей оценку. Думаю, если привязаться к событию load + выждать секунду или две, то все нормально должно быть.

    P. S. А еще можно сделать ленивую загрузку - вставлять виджет только если пользователь проявил какую-то активность. Например, прокрутил страницу вниз, подвигал мышкой или еще что-нибудь. Я этого не проверял, но почему-то мне кажется, что Google смотрит сайт без имитации активности.
    Ответ написан
  • Как передать данные из формы через cURL?

    @zkrvndm
    Софт для автоматизации
    Если вам просто нужно переслать форму со своего сайта на какой-то левый сайт, делайте так.

    Создайте файл test.php со следующим содержимым:
    Нажмите здесь, чтобы развернуть скрытый текст
    <?php
    
    // Указываем браузеру, что ответ будет текстом:
    header('Content-Type: text/plain; charset=utf-8');
    
    // Включаем показ ошибок:
    
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    
    // Если это POST-запрос:
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    
    	// Адрес для пересылки формы:
    	$url = 'http://diplom/example.php';
    
    	// Конвертируем все полученные данные с формы
    	// в строку application/x-www-form-urlencoded:
    
    	$vars = http_build_query($_POST);
    
    	// Создаём новый сеанс:
    	$curl = curl_init();
    
    	// Указываем адрес целевой страницы:
    	curl_setopt($curl, CURLOPT_URL, $url);
    
    	// О отключаем проверку SSL сертификата:
    	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    
    	// Устанавливаем заголовки для имитации браузера:
    
    	$headers = array(
    		'Accept: */*',
    		'Accept-Encoding: identify',
    		'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    		'Connection: keep-alive',
    		'Content-Length: '.strlen($vars),
    		'Content-Type: application/x-www-form-urlencoded',
    		'Host: '.parse_url($url)['host'],
    		'Origin: '.parse_url($url)['scheme'].'://'.parse_url($url)['host'],
    		'Referer: '.parse_url($url)['scheme'].'://'.parse_url($url)['host'].'/',
    		'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
    		'sec-ch-ua-mobile: ?0',
    		'Sec-Fetch-Dest: empty',
    		'Sec-Fetch-Mode: cors',
    		'Sec-Fetch-Site: cross-site',
    		'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
    	);
    
    	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    
    	// Указываем, что у нас POST запрос:
    	curl_setopt($curl, CURLOPT_POST, 1);
    
    	// Разрешаем переадресацию:
    	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    
    	// Запрещаем прямяой вывод результата запроса:
    	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    
    	// Добавляем данные для отправки:
    	curl_setopt($curl, CURLOPT_POSTFIELDS, $vars);
    
    	// Делаем сам запрос:
    	$result = curl_exec($curl);
    
    	// Завершаем сеанс:
    	curl_close($curl);
    
    	// Выводим результат:
    	echo $result;
    
    }

    Далее, на этот файл test.php отсылайте свою форму и php-скрипт внутри него перешлет форму туда, куда вы указали.
    Ответ написан
    Комментировать
  • Как удалить js-скрипт с html-страницы в Сhrome до его выполнения?

    @zkrvndm
    Софт для автоматизации
    Потому что Google Chrome начиная с этого года потихоньку перекрывает возможность редактирования запросов, типа это небезопасно, как результат - функционал у блокировщиков реклам потихоньку отваливается. Радует что хоть Firefox не стал идти на поводу у Google в этом плане. Конкретно вам же рекомендую использовать системный блокировщик AdGuard для Windows, там можно прописать любые правила наплевав на мнение браузера.
    Ответ написан
  • Как получить данные со второго домена через fetch, если Header set Access-Control-Allow-Origin * уже стоит?

    @zkrvndm
    Софт для автоматизации
    Ваш сервер возвращает не JSON из-за чего ошибка. Попробуйте прочитать ответ второго сайта, как просто текст:
    fetch('http://back.ru/site').then(res => {return res.text()}).then(data => {console.log(data)});
    Ответ написан
    Комментировать
  • Как вывести данные из функции в Jquery?

    @zkrvndm
    Софт для автоматизации
    У тебя console.log отрабатывает раньше, чем запускается функция колбек внутри обработчика.

    Вот ты вставил этот код в консоль и произошло 2 вещи:
    1. Был установлен обработчик на движение мыши
    2. Была выведена надпись в консоли

    Функция внутри обработчика сработает уже после вывода уведомления и лишь тогда, когда ты подвигаешь мышью.
    Ответ написан
    Комментировать
  • Как отправить и получить данные (не formdata) XMLHttpRequest?

    @zkrvndm
    Софт для автоматизации
    Попробуйте так:
    async function send() {
    	
    	// Создаем форму с произвольными данными:
    	
    	var formData = new FormData();
    	formData.append('param1', 'Значение param1');
    	formData.append('param2', 'Значение param2');
    	formData.append('param3', 'Значение param3');
    	
    	// Совершаем POST-запрос в котором передаем ранее созданную форму с нашими данными:
    	
    	var result = await fetch('https://site.ru/test.php', { method: 'POST', body: formData });
    	
    	// Извлекаем из ответа текст:
    	
    	var response = await result.text();
    	
    	// Выводим ответ сервера в консоли:
    	
    	console.log("Ответ сервера:\n" + response);
    	
    	// Завершаем промис
    	// ответом сервера:
    	
    	return response;
    	
    }

    Замените целевой адрес на свой, вызовите функцию send() из консоли и посмотрите результат.
    Ответ написан
    Комментировать