Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
Так почему бы не начать использовать обход блокировки YouTube при том что техническая возможность используя расширение nikolaevevge для браузера Mozilla Firefox уже появилась, а объем полезной(и не очень) информации на видеохостинге YouTube, по мнению некоторых диванных экспертов, меньше не стал.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
На очередном конкурсе танцев, школьница отлично выступила.
Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.
Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.
Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!
Не скажу умышленно Вы это сделали или нет, при этом при статусе обновления 1 проксирование не работает, а должно. То есть update = 1 только предупреждает о том что есть обновление, при это работу можно продолжить и с текущей версией, а вот при статусе 2 работа с прокси уже не возможно(при этом статусе не предполагается предоставление удалённым сервером информации о прокси, то-есть проксировать просто будет не чем).
Понял, исправляю логику работы с обновлениями. Вот корректные версии файлов:
Файл 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 || ""
};
// При update=2 сервер не должен возвращать прокси
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
};
PROXY2 = {
host: data.server.ru.ip,
port: data.server.ru.port
};
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;
// При update=2 полностью отключаем проксирование
if (proxyStatus === "update-required" || !currentSettings.masterSwitch) {
return { type: "direct" };
}
// При других статусах проверяем наличие прокси
if (proxyStatus !== "ready" && proxyStatus !== "update-available") {
return { type: "direct" };
}
if (!PROXY || !PROXY2) {
return { type: "direct" };
}
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);
}
setInterval(fetchProxies, 5 * 60 * 1000);
setupProxy();
popup.html (без изменений, как в предыдущем сообщении)
popup.js (без изменений, как в предыдущем сообщении)
Основные изменения в логике:
При update=2:
Устанавливается статус "update-required"
Прокси-серверы не сохраняются (PROXY = null, PROXY2 = null)
Проксирование полностью отключается
При update=1:
Устанавливается статус "update-available"
Прокси-серверы сохраняются (если сервер их прислал)
Проксирование продолжает работать
При update=0:
Устанавливается статус "ready"
Прокси-серверы сохраняются
Проксирование работает в обычном режиме
При ошибке:
Устанавливается статус "error"
Прокси-серверы не изменяются
Проксирование продолжает работать с последними известными прокси (если они есть)
При инициализации:
Устанавливается статус "initializing"
Прокси-серверы не изменяются
Проксирование продолжает работать с последними известными прокси (если они есть)
Вы так же можете прочитать следующие статьи: