Под заказ делаю веб-сервисы, расширения, плагины, парсеры, ботов. Выполняю интеграцию ИИ, платежных систем и в принципе занимаюсь правками / модификациями любых существующих сайтов, проектов, сервисов. Для проверенных клиентов делаю мобильные приложения и нативные программы под ПК.
Контакты
Местоположение
Россия, Челябинская обл., Челябинск

Достижения

Все достижения (22)

Наибольший вклад в теги

Все теги (180)

Лучшие ответы пользователя

Все ответы (1559)
  • Как делать запросы через множество 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, чтобы получше замаскироваться.
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (257)