Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
Так почему бы не начать использовать обход блокировки YouTube при том что техническая возможность используя расширение nikolaevevge для браузера Mozilla Firefox уже появилась, а объем полезной(и не очень) информации на видеохостинге YouTube, по мнению некоторых диванных экспертов, меньше не стал.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
На очередном конкурсе танцев, школьница отлично выступила.
Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.
Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.
Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!
Висит на инициализации. Вот что возвращает php скрипт инициализации: {"en":{"ip":"1.1.1.1","port":1088},"ru":{"ip":"2.2.2.2","port":1088}}
Понял проблему. Давайте исправим код, чтобы он корректно обрабатывал ответ от PHP скрипта. Вот исправленные файлы:
Файл background.js
const DEFAULT_SETTINGS = {
masterSwitch: true,
googlevideo: true,
youtube: true,
ytimg: true,
ggpht: true
};
let currentSettings = {...DEFAULT_SETTINGS};
let proxyListener = null;
let PROXY = null;
let PROXY2 = null;
let proxyStatus = "initializing"; // "initializing", "ready", "error"
async function fetchProxies() {
try {
proxyStatus = "initializing";
sendStatusUpdate();
const response = await fetch('https://10-11/getProxDataBeta.php');
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
console.log("Received proxy data:", data);
if (!data.en || !data.ru) throw new Error("Invalid proxy data format");
PROXY = {
host: data.en.ip,
port: data.en.port
};
PROXY2 = {
host: data.ru.ip,
port: data.ru.port
};
proxyStatus = "ready";
console.log('Прокси успешно получены:', { PROXY, PROXY2 });
} catch (error) {
proxyStatus = "error";
console.error('Ошибка при получении прокси:', error);
PROXY = null;
PROXY2 = null;
} finally {
sendStatusUpdate();
}
}
function sendStatusUpdate() {
browser.runtime.sendMessage({
type: "statusUpdate",
status: proxyStatus
}).catch(e => console.log("Не удалось отправить статус:", e));
}
// Обработчик запросов статуса из popup
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.type === "getStatus") {
sendResponse({ status: proxyStatus });
}
});
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 (!currentSettings.masterSwitch || proxyStatus !== "ready" || !PROXY || !PROXY2) {
return { type: "direct" };
}
// Первая группа сайтов (всегда через PROXY)
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 {
type: "socks",
host: PROXY.host,
port: PROXY.port,
proxyDNS: true,
failoverTimeout: 5
};
}
// Вторая группа сайтов (зависит от настроек)
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 {
type: "socks",
host: PROXY2.host,
port: PROXY2.port,
proxyDNS: true,
failoverTimeout: 5
};
}
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);
}
// Инициализация
browser.runtime.onStartup.addListener(() => {
browser.storage.local.set(DEFAULT_SETTINGS);
setupProxy();
});
browser.runtime.onInstalled.addListener(() => {
browser.storage.local.set(DEFAULT_SETTINGS);
setupProxy();
});
browser.storage.onChanged.addListener(async (changes, area) => {
if (area === "local") {
console.log("Обнаружены изменения настроек", changes);
await setupProxy();
}
});
// Обновляем прокси каждые 5 минут
setInterval(fetchProxies, 5 * 60 * 1000);
setupProxy();
Вы так же можете прочитать следующие статьи: