Ответы пользователя по тегу JavaScript
  • Проблема с CORS policy: No 'Access-Control-Allow-Origin', при загрузке изображений?

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

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

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

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

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

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

    zkrvndm
    @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
    @zkrvndm
    Архитектор решений
    У вас не указан размер тела запроса Content-Lenght, без него запрос считается не валидным.
    Ответ написан
    Комментировать
  • Можно ли как то по другому подключать виджет, что бы он не портил оценку сайта в google pageseed?

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

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

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

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

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

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

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

    zkrvndm
    @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() из консоли и посмотрите результат.
    Ответ написан
    Комментировать
  • Как получить доступ к вложенному массиву?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Выполните в консоли:
    arr = await (await fetch('https://sheetdb.io/api/v1/j0s93lmrv0uwi')).json();
    
    key = arr[8]['KEYWORDS'];
    link = arr[8]['LINK'];
    
    console.log('Ключ: ' + key);
    console.log('Ссылка: ' + link);
    Ответ написан
    Комментировать
  • Как автоматически подставить параметр к URL?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ответ написан
    Комментировать
  • Как сохранять и считывать настройки расширения для браузера на JS?

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

    P. S. Есть риск потерять данные, если юзер очистит полностью историю и кеш или переустановит расширение. Если нужна высокая надежность, можно данные и вовсе хранить у себя на сервере, либо предлагать функцию экспорта и импорта данных специальным файлом настроек. Насчет chrome.storage ничего не могу сказать, никогда не пользовался им.
    Ответ написан
    Комментировать
  • Как получить данные (Form Data) из POST-запроса WooCommerce, используя JS (jQuery)?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Найдите код инициатор запроса и выстраивайтесь в него, код инициатор можно спокойно посмотреть во вкладке network у консоли браузера. Если не понимайте как это сделать, лучше вам обратится на фрилансим.
    Ответ написан
    Комментировать
  • Почему не скачивается файл?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Artem Kirsov, делайте так. Все ваши параметры засуньте в FormData и уже его отправляйте:
    async function getFile() {
    	
    	var formData = new FormData();
    	formData.append('id', 'Ваш ID');
    	formData.append('test', 'Значение параметра test');
    	
    	var blob = await (await fetch('https://адрес_для_совершения_запроса', {
    		method: 'POST',
    		body: formData
    	})).blob();
    	
    	console.log('Файл успешно скачан:');
    	console.dir(blob);
    	
    	var link = document.createElement('a');
    	link.download = 'filename.xlsx';
    	link.href = URL.createObjectURL(blob);
    	link.click();
    	
    	return blob;
    	
    }

    Вызов функции getFile() будет возвращать промис результатом которого будет файл. Обратите внимание, что в FormData у меня всего лишь пример, как указывать параметры - вы должны там добавить свои параметры и их значения.
    Ответ написан
    4 комментария
  • Как сохранить данные в переменную в ajax запросе с циклом?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Используйте асинхронность. Если добавить к функции приставку async, то внутри такой функции можно делать остановки для того, чтобы дождаться результатов работы другой асинхроной функции. jQuery функция ajax, может работать асинхронно, а значит можно сделать банально вот так:
    async function test() {
    	var out = ''
    	for (var n = 0; n < links.length; n++) {
    		var result = await $.ajax({ url: links[n], data: { 'id': 1 } });
    		// И далее делаем что-нибудь с result, внутри него будет результат запроса
    	}
    }
    
    test(); // Запускаем функцию test

    Обращаю внимание, это просто пример. Приставка await говорит, что надо дождутся выполнения запроса справа, записать результат запроса в переменную result и только потом продолжить выполнять кода дальше.
    Ответ написан
    6 комментариев
  • Как определить истинный IP пользователя с Opera VPN?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Если в браузере включен WebRTC, то можно определить реальный IP-адрес через него. Также существуют системы аналитики, что следят за пользователями и могут не только определить IP-адрес, но и даже почту с телефоном.
    Ответ написан
    Комментировать
  • Как записать данные в переменную из GET запроса?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Все куда проще, чем вы думайте, просто выполните в консоли:
    let allDots = await (await fetch('http://mysite.ru/json.php')).json();
    console.log('Содержимое переменной allDots:');
    console.dir(allDots);

    Разумеется адрес для загрузки JSON замените на свой.
    Ответ написан
  • Как из URL вырезать домен без www. с помощью RegExp на js?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Это делается так:
    new URL('https://www.rohrreinigung-schneemann.de/berlin').hostname.replace(/^www\./, '');

    Класс URL парcит адрес, из адреса берем хост и удаляем www. в начале, если оно там есть.
    Ответ написан
    2 комментария