Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
Так почему бы не начать использовать обход блокировки YouTube при том что техническая возможность используя расширение nikolaevevge для браузера Mozilla Firefox уже появилась, а объем полезной(и не очень) информации на видеохостинге YouTube, по мнению некоторых диванных экспертов, меньше не стал.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
На очередном конкурсе танцев, школьница отлично выступила.
Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.
Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.
Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!
Есть некоторое расширение для Firefox. Ниже я приведу его код. Его требуется доработать, а именно в файле background.js требуется чтобы 2 указанных в нём прокси сервера получались в результате запроса к 10-11/getProxDataBeta.php, запрос возвращает массив(в JSON, кстати именно массив а не объект) такого вида: ["ru" => ["ip" => "IP1", "port" => "НомерПорта1"], "en" => ["ip" => "IP2", "port" => "НомерПорта2"]](IP2 заменяет вот этот адрес 1.1.1.1, соответственно IP1 тот который в PROXY2) Вот файлы текущей версии расширения(разделитель между файлами несколько знаков =(равно)):
Файл backgroung.js
const PROXY = {
host: "1.1.1.1",
port: 1088
};
const PROXY2 = {
host: "2.2.2.2",
port: 1088
};
const DEFAULT_SETTINGS = {
masterSwitch: true,
googlevideo: true,
youtube: true,
ytimg: true,
ggpht: true
};
let currentSettings = {...DEFAULT_SETTINGS};
let proxyListener = null;
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) {
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(`Проксируем (PROXY1) запрос к: ${hostname}`);
return {
type: "socks",
host: PROXY.host,
port: PROXY.port,
proxyDNS: true,
failoverTimeout: 5
};
}
// Вторая группа сайтов (зависит от настроек)
if (hostname.endsWith('googlevideo.com') && currentSettings.googlevideo) {
console.log(`Проксируем (PROXY2) запрос к: ${hostname}`);
return {
type: "socks",
host: PROXY2.host,
port: PROXY2.port,
proxyDNS: true,
failoverTimeout: 5
};
}
if (hostname.endsWith('youtube.com') && currentSettings.youtube) {
console.log(`Проксируем (PROXY2) запрос к: ${hostname}`);
return {
type: "socks",
host: PROXY2.host,
port: PROXY2.port,
proxyDNS: true,
failoverTimeout: 5
};
}
if (hostname.endsWith('ytimg.com') && currentSettings.ytimg) {
console.log(`Проксируем (PROXY2) запрос к: ${hostname}`);
return {
type: "socks",
host: PROXY2.host,
port: PROXY2.port,
proxyDNS: true,
failoverTimeout: 5
};
}
if (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();
// Создаем новый слушатель с актуальными настройками
proxyListener = handleProxyRequest;
browser.proxy.onRequest.addListener(
proxyListener,
{ urls: ["*://*.googlevideo.com/*", "*://googlevideo.com/*",
"*://*.instagram.com/*", "*://instagram.com/*",
"*://*.fbcdn.net/*", "*://fbcdn.net/*",
"*://*.facebook.com/*", "*://facebook.com/*",
"*://*.fbcom/*", "*://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();
}
});
setupProxy();
Файл manifest.json
{
"manifest_version": 2,
"name": "2ip.ru через SOCKS5",
"version": "2.0",
"description": "Корректное проксирование только 2ip.ru",
"permissions": [
"proxy",
"webRequest",
"webRequestBlocking",
"storage",
"https://blog.ivru.net/",
"*://*.googlevideo.com/*",
"*://googlevideo.com/*",
"*://*.instagram.com/*",
"*://instagram.com/*",
"*://*.fbcdn.net/*",
"*://fbcdn.net/*",
"*://*.facebook.com/*",
"*://facebook.com/*",
"*://*.fbcom/*",
"*://fb.com/*",
"*://*.chatgpt.com/*",
"*://chatgpt.com/*",
"*://*.youtube.com/*",
"*://youtube.com/*",
"*://*.ionos.com/*",
"*://ionos.com/*",
"*://*.ytimg.com/*",
"*://ytimg.com/*",
"*://*.ggpht.com/*",
"*://ggpht.com/*"
],
"background": {
"scripts": ["background.js"],
"persistent": true
},
"browser_action": {
"default_popup": "popup.html",
"default_icon": {
"48": "icon.png"
}
},
"content_security_policy": "script-src 'self'; object-src 'self'; connect-src 'self' https://blog.ivru.net/",
"web_accessible_resources": [
"popup.html",
"popup.js"
]
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body {
background-color: #000;
display: flex;
justify-content: center;
align-items: center;
min-height: 200px;
width: 200px;
margin: 0;
font-family: Arial, sans-serif;
color: white;
padding: 10px;
box-sizing: border-box;
}
.container {
width: 100%;
}
.header {
text-align: center;
margin-bottom: 15px;
font-weight: bold;
}
.switch-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
}
.switch-label {
font-size: 14px;
}
.checkbox-container {
width: 24px;
height: 24px;
border: 2px solid white;
position: relative;
box-sizing: border-box;
}
.switch-track {
position: absolute;
width: 4px;
height: calc(100% - 8px);
top: 4px;
background-color: #ff0000;
transition: all 0.2s ease;
}
.switch-track {
left: 4px;
}
input:checked ~ .checkbox-container .switch-track {
right: 4px;
left: auto;
background-color: #00ff00;
}
input[type="checkbox"] {
display: none;
}
label {
display: block;
cursor: pointer;
}
.divider {
height: 1px;
background-color: #333;
margin: 10px 0;
}
</style>
</head>
<body>
<div class="container">
<div class="header">Proxy Control</div>
<div class="switch-row">
<span class="switch-label">Master Switch</span>
<label>
<input type="checkbox" id="master-switch" checked>
<div class="checkbox-container">
<div class="switch-track"></div>
</div>
</label>
</div>
<div class="divider"></div>
<div class="switch-row">
<span class="switch-label">googlevideo.com</span>
<label>
<input type="checkbox" id="googlevideo-switch" checked>
<div class="checkbox-container">
<div class="switch-track"></div>
</div>
</label>
</div>
<div class="switch-row">
<span class="switch-label">youtube.com</span>
<label>
<input type="checkbox" id="youtube-switch" checked>
<div class="checkbox-container">
<div class="switch-track"></div>
</div>
</label>
</div>
<div class="switch-row">
<span class="switch-label">ytimg.com</span>
<label>
<input type="checkbox" id="ytimg-switch" checked>
<div class="checkbox-container">
<div class="switch-track"></div>
</div>
</label>
</div>
<div class="switch-row">
<span class="switch-label">ggpht.com</span>
<label>
<input type="checkbox" id="ggpht-switch" checked>
<div class="checkbox-container">
<div class="switch-track"></div>
</div>
</label>
</div>
</div>
<script src="popup.js"></script>
</body>
</html>
"permissions": [
...
"https://10-11/getProxDataBeta.php",
...
],
"content_security_policy": "script-src 'self'; object-src 'self'; connect-src 'self' https://blog.ivru.net/ https://10-11/"
Этот код корректно не заработал, так как расширение зависало в момент инициализации, исправление этой ситуации в статье по ссылке.
Вы так же можете прочитать следующие статьи: