10

Гобелен - кликните для возврата на главную

Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.

Так почему бы не начать использовать обход блокировки YouTube при том что техническая возможность используя расширение nikolaevevge для браузера Mozilla Firefox уже появилась, а объем полезной(и не очень) информации на видеохостинге YouTube, по мнению некоторых диванных экспертов, меньше не стал.

Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.

Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.

На очередном конкурсе танцев, школьница отлично выступила.

Что использовать вместо Юбуст

Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.

Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.

Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!

104 549 руб.

Описание товара

Замечательно. Ещё одна доработка. Удалённый сервер в ответе для каждого прокси(ru, en) может так же вернуть(наряду с ip и port) логин и пароль от прокси сервера(поля login и password соответственно). Если поля login и пароль для конкретного прокси удалённый сервер прислал - их необходимо использовать для авторизации на сервере.

Вот полный обновлённый код background.js с поддержкой логина и пароля для прокси-серверов:

JavaScript
    
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 остаются без изменений, так как они не участвуют в работе с прокси-серверами.

Другие товары

Вы так же можете прочитать следующие статьи: