10

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

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

После того как в некоторых случаях перестала работать программа goodbydpi появились сложности с просмотром сайта YouTube. В конце мая 2025 года стало доступно расширение позволяющее разблокировать сайт YouTube в браузере Firefox на территории России.

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

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

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