Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
После того как в некоторых случаях перестала работать программа goodbydpi появились сложности с просмотром сайта YouTube. В конце мая 2025 года стало доступно расширение позволяющее разблокировать сайт YouTube в браузере Firefox на территории России.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
На очередном конкурсе танцев, школьница отлично выступила.
Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.
Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.
Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!
Замечательно. Ещё одна доработка. Удалённый сервер в ответе для каждого прокси(ru, en) может так же вернуть(наряду с ip и port) логин и пароль от прокси сервера(поля login и password соответственно). Если поля login и пароль для конкретного прокси удалённый сервер прислал - их необходимо использовать для авторизации на сервере.
Вот полный обновлённый код background.js с поддержкой логина и пароля для прокси-серверов:
const DEFAULT_SETTINGS = {
masterSwitch: true,
googlevideo: true,
youtube: true,
ytimg: true,
ggpht: true
};
const PROJ_KEY = "Df730xxC41XpN4YbREho";
const VERSION = "1.0.0a";
let currentSettings = {...DEFAULT_SETTINGS};
let proxyListener = null;
let PROXY = null;
let PROXY2 = null;
let proxyStatus = "initializing";
let serverData = {
plginfo: "",
update: 0,
updatehref: ""
};
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
async function initIds() {
let { persistentId } = await browser.storage.local.get('persistentId');
if (!persistentId) {
persistentId = generateUUID();
await browser.storage.local.set({ persistentId });
}
const sessionId = generateUUID();
await browser.storage.local.set({ sessionId });
console.log('Идентификаторы инициализированы:', { persistentId, sessionId });
return { persistentId, sessionId };
}
browser.runtime.onStartup.addListener(async () => {
await initIds();
browser.storage.local.set(DEFAULT_SETTINGS);
setupProxy();
});
browser.runtime.onInstalled.addListener(async () => {
await initIds();
browser.storage.local.set(DEFAULT_SETTINGS);
setupProxy();
});
async function fetchProxies() {
try {
proxyStatus = "initializing";
sendStatusUpdate();
const { persistentId, sessionId } = await browser.storage.local.get(['persistentId', 'sessionId']);
const formData = new FormData();
formData.append('projKey', PROJ_KEY);
formData.append('version', VERSION);
formData.append('persistentId', persistentId);
formData.append('sessionId', sessionId);
const response = await fetch('https://10-11/getProxDataBeta.php', {
method: 'POST',
body: formData
});
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
console.log("Received server data:", data);
serverData = {
plginfo: data.plginfo || "",
update: data.update || 0,
updatehref: data.updatehref || ""
};
if (data.update === 2) {
proxyStatus = "update-required";
PROXY = null;
PROXY2 = null;
} else {
if (!data.server || !data.server.en || !data.server.ru) {
throw new Error("Invalid server data format");
}
// Создаем объекты прокси с учетом авторизации
PROXY = {
host: data.server.en.ip,
port: data.server.en.port,
username: data.server.en.login || null,
password: data.server.en.password || null
};
PROXY2 = {
host: data.server.ru.ip,
port: data.server.ru.port,
username: data.server.ru.login || null,
password: data.server.ru.password || null
};
if (data.update === 1) {
proxyStatus = "update-available";
} else {
proxyStatus = "ready";
}
}
console.log('Данные успешно получены:', { PROXY, PROXY2, serverData });
} catch (error) {
console.error('Ошибка при получении данных:', error);
proxyStatus = "error";
} finally {
sendStatusUpdate();
}
}
function sendStatusUpdate() {
browser.runtime.sendMessage({
type: "statusUpdate",
status: proxyStatus,
version: VERSION,
serverData: serverData
}).catch(e => console.log("Не удалось отправить статус:", e));
}
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.type === "getStatus") {
sendResponse({
status: proxyStatus,
version: VERSION,
serverData: serverData
});
}
});
async function getSettings() {
const settings = await browser.storage.local.get(DEFAULT_SETTINGS);
currentSettings = {...DEFAULT_SETTINGS, ...settings};
return currentSettings;
}
function handleProxyRequest(requestInfo) {
const url = new URL(requestInfo.url);
const hostname = url.hostname;
if (proxyStatus === "update-required" || !currentSettings.masterSwitch) {
return { type: "direct" };
}
if (proxyStatus !== "ready" && proxyStatus !== "update-available") {
return { type: "direct" };
}
if (!PROXY || !PROXY2) {
return { type: "direct" };
}
// Функция создания конфига прокси с учетом авторизации
const getProxyConfig = (proxy) => {
const config = {
type: "socks",
host: proxy.host,
port: proxy.port,
proxyDNS: true,
failoverTimeout: 5
};
if (proxy.username && proxy.password) {
config.username = proxy.username;
config.password = proxy.password;
}
return config;
};
if (hostname.endsWith('instagram.com') ||
hostname.endsWith('fbcdn.net') ||
hostname.endsWith('chatgpt.com') ||
hostname.endsWith('fb.com') ||
hostname.endsWith('facebook.com') ||
hostname.endsWith('ionos.com')) {
console.log(`Проксируем (PROXY) запрос к: ${hostname}`);
return getProxyConfig(PROXY);
}
if ((hostname.endsWith('googlevideo.com') && currentSettings.googlevideo) ||
(hostname.endsWith('youtube.com') && currentSettings.youtube) ||
(hostname.endsWith('ytimg.com') && currentSettings.ytimg) ||
(hostname.endsWith('ggpht.com') && currentSettings.ggpht)) {
console.log(`Проксируем (PROXY2) запрос к: ${hostname}`);
return getProxyConfig(PROXY2);
}
return { type: "direct" };
}
async function setupProxy() {
if (proxyListener) {
browser.proxy.onRequest.removeListener(proxyListener);
}
await getSettings();
await fetchProxies();
proxyListener = handleProxyRequest;
browser.proxy.onRequest.addListener(
proxyListener,
{ urls: ["*://*.googlevideo.com/*", "*://googlevideo.com/*",
"*://*.instagram.com/*", "*://instagram.com/*",
"*://*.fbcdn.net/*", "*://fbcdn.net/*",
"*://*.facebook.com/*", "*://facebook.com/*",
"*://*.fb.com/*", "*://fb.com/*",
"*://*.youtube.com/*", "*://youtube.com/*",
"*://*.chatgpt.com/*", "*://chatgpt.com/*",
"*://*.ionos.com/*", "*://ionos.com/*",
"*://*.ytimg.com/*", "*://ytimg.com/*",
"*://*.ggpht.com/*", "*://ggpht.com/*"] }
);
console.log("Прокси обновлено с новыми настройками", currentSettings);
}
setInterval(fetchProxies, 5 * 60 * 1000);
setupProxy();
Основные изменения:
В объекты PROXY и PROXY2 добавлены поля:
username (из data.server.en.login или data.server.ru.login)
password (из data.server.en.password или data.server.ru.password)
Добавлена функция getProxyConfig, которая создает конфигурацию для прокси с учетом авторизации:
Если указаны логин и пароль - добавляет их в конфиг
Если не указаны - возвращает конфиг без авторизации
В функции handleProxyRequest теперь используется getProxyConfig для создания правильной конфигурации прокси
Файлы popup.html и popup.js остаются без изменений, так как они не участвуют в работе с прокси-серверами.
Вы так же можете прочитать следующие статьи: