Загрузка...

Маркет Утилита Проверка аккаунтов стима на кт (для маркета) + новое решение с отдельным сервером и ******

Тема в разделе Дополнения создана пользователем 666 8 янв 2025. (поднята 21 май 2025) 1033 просмотра

Загрузка...
  1. 666
    666 Автор темы 8 янв 2025 Качественная отработка ***** - https://lolz.live/threads/8135594 50 545 27 июн 2019
    Для работы скрипта нужен тамперманки.
    Скачать https://www.tampermonkey.net/index.php?browser=chrome&locale=ru

    Сам скрипт - https://greasyfork.org/ru/scripts/523222-lzt-кт-чекер-масс

    Для его работы нужно перейти на https://lolz.live/market/user/items (Или любую страницу где он вам нужен в ваших обьявлениях)
    И подождать пару секунд. Если не видите меток о кт или его отсутствии, обновите страницу
    [IMG]


    P.S.
    Для тех кто шарит в коде, прошу сильно не пинать. Пытался сделать еще давно проксирование через тамперманки, но в конечном счете оно не работает и псевдопрокси там указаны как заглушка для работы скрипта.


    Если что то не работает, пишите в лс


    Код для самостоятельной вставки
    Код
    // ==UserScript==
    // @name LZT КТ ЧЕКЕР МАСС
    // @namespace http://tampermonkey.net/
    // @version 2.9
    // @description rtggdfd
    // @author steamuser
    // @match https://lzt.market/*
    // @grant GM_xmlhttpRequest
    // @grant GM_addStyle
    // @grant GM_log
    // @license MIT
    // ==/UserScript==

    (function() {
    'use strict';

    // Настройка для включения/отключения лога
    const logEnabled = false;

    // Массив ******-серверов в формате ip:port:login:password
    const proxyServers = [
    // Добавьте до 20 ******
    '113.35.11.121:2002:233232312:321312c',
    '113.35.11.126:2002:233232312:321312c',
    '113.35.11.116:2002:233232312:321312c',
    '113.35.11.126:2002:233232312:321312c',
    '113.35.11.156:2002:233232312:321312c',
    '113.35.11.176:2002:233232312:321312c',
    '113.35.11.126:2002:233232312:321312c',
    '113.35.11.196:2002:233232312:321312c',
    '113.35.11.123:2002:233232312:321312c',
    '113.35.11.121:2002:233232312:321312c'
    ];

    const MAX_CONCURRENT_REQUESTS = 40; // Лимит на количество одновременных запросов
    const MAX_RETRIES = 5; // Максимальное количество повторных попыток при ошибке

    let currentRequests = 0; // Текущий счетчик активных потоков

    // Добавляем CSS для лога и флага КТ
    GM_addStyle(`
    .kt-flag, .no-flag, .error-flag {
    display: inline-block;
    width: 65px;
    height: 50px;
    padding: 0;
    color: white;
    font-size: 20px;
    font-weight: bold;
    border-radius: 5px;
    border: 2px solid #3a3a3a;
    box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
    text-align: center;
    line-height: 50px;
    }
    .kt-flag {
    background-color: rgb(136, 68, 68); /* Цвет для КТ (красный) */
    }
    .no-flag {
    background-color: rgb(34, 142, 93); /* Цвет для NO (зеленый) */
    }
    .error-flag {
    background-color: orange;
    }
    `);

    // Функция для добавления флага справа от контейнера
    function addFlag(container, flagType) {
    const mainContainer = container.closest('.marketIndexItem'); // Находим родительский контейнер
    if (mainContainer && !mainContainer.querySelector('.kt-flag, .no-flag, .error-flag')) { // Проверка на наличие флага
    const flag = document.createElement('div');
    flag.className = flagType;
    if (flagType === 'kt-flag') {
    flag.textContent = 'KT';
    } else if (flagType === 'no-flag') {
    flag.textContent = 'NO';
    } else {
    flag.textContent = 'ER';
    }

    // Вставляем флаг рядом с контейнером
    mainContainer.style.position = 'relative';
    flag.style.position = 'absolute';
    flag.style.right = '-80px'; // Смещение на границу контейнера
    flag.style.top = '10px'; // Выравнивание по верху контейнера
    mainContainer.appendChild(flag);

    // Добавляем класс для предотвращения повторной проверки
    container.classList.add('processed');
    }
    }

    // Функция для выбора случайного ******
    function getRandomProxy() {
    const proxy = proxyServers[Math.floor(Math.random() * proxyServers.length)];
    const [proxyIpPort, proxyLogin, proxyPassword] = proxy.split(':');
    const proxyUrl = `http://${proxyLogin}:${proxyPassword}@${proxyIpPort}`;
    const proxyAuth = 'Basic ' + btoa(`${proxyLogin}:${proxyPassword}`);
    return { proxyUrl, proxyAuth };
    }

    // Функция для проверки одного аккаунта с ретри
    async function checkAccount(accountElement, retries = 0) {
    const steamLinkElement = accountElement.querySelector('a[href^="https://steamcommunity.com/profiles/"]');

    if (steamLinkElement) {
    const steamProfileUrl = steamLinkElement.href;
    const { proxyUrl, proxyAuth } = getRandomProxy(); // Используем случайный ******

    return new Promise((resolve) => {
    GM_xmlhttpRequest({
    method: 'GET',
    url: steamProfileUrl,
    proxy: proxyUrl,
    headers: {
    'Proxy-Authorization': proxyAuth // Авторизация для ******
    },
    onload: function(response) {
    if (response.status === 200) {
    const parser = new DOMParser();
    const doc = parser.parseFromString(response.responseText, 'text/html');

    // Ищем элемент на странице Steam
    const element = doc.querySelector('div.responsive_count_link_area');

    if (element) {
    addFlag(accountElement, 'no-flag'); // Обнаружен элемент, значит, NO
    } else {
    addFlag(accountElement, 'kt-flag'); // Элемент не найден, значит, это КТ
    }
    } else {
    if (retries < MAX_RETRIES) {
    setTimeout(() => {
    checkAccount(accountElement, retries + 1); // Повторная попытка
    }, 5000); // Таймаут 5 секунд перед повторной попыткой
    } else {
    addFlag(accountElement, 'error-flag'); // Ошибка загрузки страницы Steam
    }
    }
    currentRequests--;
    resolve();
    },
    onerror: function() {
    if (retries < MAX_RETRIES) {
    setTimeout(() => {
    checkAccount(accountElement, retries + 1); // Повторная попытка при ошибке
    }, 1000); // Таймаут 5 секунд перед повторной попыткой
    } else {
    addFlag(accountElement, 'error-flag'); // Ошибка при запросе
    }
    currentRequests--;
    resolve();
    }
    });
    });
    } else {
    addFlag(accountElement, 'error-flag'); // Ссылка на профиль Steam не найдена
    currentRequests--;
    return Promise.resolve();
    }
    }

    // Функция для очереди запросов с контролем количества потоков
    async function processQueue(accountElements) {
    const queue = [];
    for (const accountElement of accountElements) {
    if (currentRequests < MAX_CONCURRENT_REQUESTS) {
    currentRequests++;
    queue.push(checkAccount(accountElement)); // Создаем задачу проверки аккаунта
    }

    if (queue.length >= MAX_CONCURRENT_REQUESTS) {
    await Promise.race(queue); // Ждем завершения любой задачи перед добавлением новой
    queue.splice(queue.findIndex(p => p.resolved), 1); // Убираем завершённую задачу
    }
    }

    await Promise.all(queue); // Ждем завершения всех оставшихся задач
    }

    // Основная функция для проверки всех аккаунтов
    async function checkAccounts() {
    const accountElements = document.querySelectorAll('.marketIndexItem--otherInfo:not(.processed)'); // Ищем только необработанные элементы
    await processQueue(accountElements); // Запускаем очередь задач
    }

    // Запуск проверки аккаунтов каждые 1000 мс (1 секунда)
    setInterval(checkAccounts, 1000);
    })();


    Когда вы первый раз запускаете скрипт, он спрашивает, можно ли ему кидать запросы на другой домен. ВЫ ДОЛЖНЫ НАЖАТЬ, ВСЕГДА РАЗРЕШАТЬ ДЛЯ ЭТОГО ДОМЕНА!!!!
    Стало очень нужно чекать много акков на кт и тогда Я понял что мне нужно более оптимальное решение с поддержкой ******.

    Код
    // ==UserScript==
    // @name LZT KT Checker (single + retry on error)
    // @namespace http://tampermonkey.net/
    // @version 5.2
    // @description Серый placeholder → KT / NO / ER / OFF + повторная проверка ТОЛЬКО при ER или OFF
    // @author ChatGPT
    // @match https://lzt.market/*
    // @grant GM_xmlhttpRequest
    // @grant GM_addStyle
    // @connect 127.0.0.1 /* если сервер на VPS — поменяйте домен */
    // ==/UserScript==

    (function () {
    'use strict';

    /* ─────────── НАСТРОЙКИ ─────────── */
    const API = 'http://127.0.0.1:3000/check-one'; // адрес сервера
    const MAX_WORKERS = 6; // параллельных запросов к API
    const SCAN_INTERVAL = 2000; // мс между сканами DOM
    const REQ_TIMEOUT = 6000; // мс ожидания ответа сервера
    /* ───────────────────────────────── */

    /* ─────────── СТИЛИ ФЛАЖКОВ ─────── */
    GM_addStyle(`
    .kt-flag,.no-flag,.error-flag,.srv-off-flag,.loading-flag{
    display:inline-block;width:65px;height:50px;border-radius:5px;
    color:#fff;font-weight:bold;font-size:20px;text-align:center;
    line-height:50px;position:absolute;right:-80px;top:10px;
    cursor:pointer;
    }
    .kt-flag { background:red; } /* KT */
    .no-flag { background:green; } /* NO */
    .error-flag { background:orange; } /* ER / OFF (Steam) */
    .srv-off-flag { background:red; } /* OFF (сервер) */
    .loading-flag{
    background:rgb(214,214,214);overflow:hidden;cursor:default;
    }
    .loading-flag::after{
    content:"";display:block;box-sizing:border-box;width:20px;height:20px;
    border:3px solid #fff;border-top-color:transparent;border-radius:50%;
    animation:spin 1s linear infinite;position:absolute;top:15px;left:22px;
    }
    @keyframes spin{to{transform:rotate(360deg)}}
    `);

    /* ─────────── DOM-УТИЛИТЫ ───────── */
    const SEL_LINK = '.marketIndexItem--topContainer a[href*="steamcommunity.com/profiles/"]';

    function findSteam(card){
    return card.querySelector(SEL_LINK)?.href || '';
    }

    function ensurePlaceholder(card){
    if(card.querySelector('.loading-flag,.kt-flag,.no-flag,.error-flag,.srv-off-flag')) return;
    const div = document.createElement('div');
    div.className = 'loading-flag';
    card.appendChild(div);
    }

    function clearFlags(card){
    card.querySelectorAll('.kt-flag,.no-flag,.error-flag,.srv-off-flag,.loading-flag')
    .forEach(el => el.remove());
    }

    function setFlag(card, cls, text){
    clearFlags(card);
    const div = document.createElement('div');
    div.className = cls;
    div.textContent = text;
    card.appendChild(div);
    card.classList.add('processed');
    }

    /* ─────────── ОЧЕРЕДЬ + ВОРКЕРЫ ─── */
    const queue = []; // [{url, card}]
    const inflight = new Set(); // URL, которые уже отправлены
    let running = 0;

    function enqueue(task){
    if (inflight.has(task.url)) return; // уже в работе
    queue.push(task);
    inflight.add(task.url);
    runNext();
    }

    function runNext(){
    if(running >= MAX_WORKERS || !queue.length) return;

    const { url, card } = queue.shift();
    running++;

    GM_xmlhttpRequest({
    method : 'GET',
    url : `${API}?url=${encodeURIComponent(url)}`,
    timeout: REQ_TIMEOUT,

    onload : res => {
    let status = 'ER';
    try { status = JSON.parse(res.responseText).status || 'ER'; } catch {}

    if (status === 'KT') setFlag(card,'kt-flag','KT');
    else if (status === 'NO') setFlag(card,'no-flag','NO');
    else if (status === 'OFF') setFlag(card,'error-flag','OFF'); // Steam 5xx
    else setFlag(card,'error-flag','ER'); // 10 фейлов

    finish();
    },
    ontimeout: () => { setFlag(card,'srv-off-flag','OFF'); finish(); }, // сервер недоступен
    onerror : () => { setFlag(card,'srv-off-flag','OFF'); finish(); }
    });

    function finish(){
    running--;
    inflight.delete(url);
    runNext();
    }
    }

    /* ─────────── RETRY ПО КЛИКУ ────── */
    function attachRetry(card){
    if(card.dataset.ktRetry) return;
    card.dataset.ktRetry = '1';

    card.addEventListener('click', e=>{
    if(e.target.closest(SEL_LINK)) return; // клик по ссылке Steam

    const hasError = card.querySelector('.error-flag, .srv-off-flag');
    if(!hasError) return; // повторяем ТОЛЬКО при ER / OFF

    const url = findSteam(card);
    if(!url) return;

    card.classList.remove('processed');
    clearFlags(card);
    ensurePlaceholder(card);
    enqueue({ url, card });
    });
    }

    /* ─────────── SCAN DOM ──────────── */
    function scan(){
    const cards = [...document.querySelectorAll('.marketIndexItem:not(.processed)')];

    cards.forEach(card=>{
    const url = findSteam(card);
    if(!url){ card.classList.add('processed'); return; }

    ensurePlaceholder(card);
    attachRetry(card);
    enqueue({ url, card });
    });
    }

    /* ─────────── ЗАПУСК ────────────── */
    const obs = new MutationObserver(scan);
    obs.observe(document.body, { childList:true, subtree:true });
    setInterval(scan, SCAN_INTERVAL);
    })();
    JS
    /**
    * Steam KT-checker backend (timeout 2 s, cache log)
    * ──────────────────────────────────────────────────────────
    * ▸ node server.js – файл сам установит недостающие пакеты
    * ▸ proxies.txt – host:port[:user:pass] построчно
    */

    import { execSync } from 'child_process';
    import fs from 'fs';

    /* ── auto-install ─────────────────────────────────────────── */
    async function need(pkg) {
    try { return await import(pkg); }
    catch {
    console.log(`[auto] installing ${pkg} …`);
    execSync(`npm install ${pkg}`, { stdio: 'inherit' });
    return await import(pkg);
    }
    }

    /* ── настройки ────────────────────────────────────────────── */
    const PORT = 3000;
    const PROXY_TYPE = 'http'; // 'http' | 'socks'
    const CONCURRENCY = 10;
    const TIMEOUT = 2000; // ← 2 с на запрос к Steam
    const MAX_RETRIES = 10;
    const CACHE_TTL = 10 * 60_000; // 10 мин
    const DEAD_TTL = 30_000; // «плохой» ****** отдыхает 30 с

    /* ── зависимости ──────────────────────────────────────────── */
    const express = (await need('express')).default;
    const axios = (await need('axios')).default;
    const pLimit = (await need('p-limit')).default;

    let makeAgent;
    if (PROXY_TYPE === 'socks') {
    const { SocksProxyAgent } = await need('socks-proxy-agent');
    makeAgent = uri => new SocksProxyAgent(uri);
    } else {
    const { HttpsProxyAgent } = await need('https-proxy-agent');
    makeAgent = uri => new HttpsProxyAgent(uri);
    }

    /* ── загрузка proxy-пула ─────────────────────────────────── */
    const proxies = fs.existsSync('proxies.txt')
    ? fs.readFileSync('proxies.txt','utf8')
    .split('\n').map(l=>l.trim()).filter(Boolean)
    .map(l=>{
    const [h,p,u,s] = l.split(':');
    const auth = u ? `${u}:${s}@` : '';
    return `${PROXY_TYPE}://${auth}${h}:${p}`;
    })
    : [];
    let pIdx = 0;

    /* ── карантин «плохих» IP ────────────────────────────────── */
    const deadUntil = new Map();
    function nextProxy() {
    if (!proxies.length) return null;
    const now = Date.now();
    for (let i = 0; i < proxies.length; i++) {
    const uri = proxies[pIdx++ % proxies.length];
    if ((deadUntil.get(uri) || 0) < now) return makeAgent(uri);
    }
    return null; // все в карантине → прямой
    }

    /* ── in-memory кэш ───────────────────────────────────────── */
    const cache = new Map();
    setInterval(()=>{ const now=Date.now();
    for(const [u,v] of cache) if(now-v.ts > CACHE_TTL) cache.delete(u);
    }, 60_000);

    /* ── утилиты ─────────────────────────────────────────────── */
    function norm(raw){
    if (/^7656119\d+$/.test(raw))
    return `https://steamcommunity.com/profiles/${raw}`;
    if (raw.startsWith('https://'))
    return raw.split('?')[0];
    return null;
    }
    function idOk(url){
    const id = url.match(/profiles\/(\d+)/)?.[1];
    return id?.startsWith('7656119');
    }

    /* ── главный запрос ─────────────────────────────────────── */
    const limit = pLimit(CONCURRENCY);

    async function fetchStatus(raw){
    const url = norm(raw);
    if(!url || !idOk(url)){ console.log('[FILTER] skip', raw); return 'OFF'; }

    const mem = cache.get(url);
    if (mem && Date.now() - mem.ts < CACHE_TTL) {
    console.log(`[CACHE] ${mem.status} ${url}`);
    return mem.status;
    }

    for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
    const agent = nextProxy();
    const label = agent ? (agent.proxy?.href || agent.options?.protocol+'//') : 'DIRECT';
    const t0 = Date.now();

    try {
    const resp = await axios.get(url, {
    timeout: TIMEOUT,
    httpsAgent: agent,
    httpAgent: agent,
    proxy: false,
    validateStatus: () => true
    });
    const ms = Date.now() - t0;

    let st;
    if (resp.status >= 500) st = 'OFF';
    else if (resp.data.includes('responsive_count_link_area')) st = 'NO';
    else st = 'KT';

    console.log(`[OK] ${st} ${resp.status} ${label.padEnd(35)} ${ms}ms ${url}`);

    if (st === 'KT' || st === 'NO') // кэшируем только удачные
    cache.set(url, { status: st, ts: Date.now() });

    return st;

    } catch (err) {
    const ms = Date.now() - t0;
    console.log(`[ERR] ${(err.code||'err').padEnd(6)} ${label.padEnd(35)} ${ms}ms (try ${attempt}/${MAX_RETRIES})`);
    if (label !== 'DIRECT') deadUntil.set(label, Date.now() + DEAD_TTL);
    if (attempt === MAX_RETRIES) return 'ER'; // не кладём в кэш
    }
    }
    }

    /* ── Express API ─────────────────────────────────────────── */
    const app = express();
    app.use(express.json({ limit: '1mb' }));

    app.get('/check-one', async (req, res) => {
    const raw = req.query.url || '';
    const status = await limit(() => fetchStatus(raw));
    res.json({ status });
    });

    app.post('/check', async (req, res) => {
    const urls = Array.isArray(req.body) ? req.body : [];
    const out = {};
    await Promise.all(urls.map(u => limit(() =>
    fetchStatus(u).then(s => (out[u] = s))
    )));
    res.json(out);
    });

    /* ── старт ──────────────────────────────────────────────── */
    app.listen(PORT, () =>
    console.log(`Checker on ${PORT} | proxies=${proxies.length} | mode=${PROXY_TYPE}`)
    );
    Как установить?
    Подробного обьяснения не будет, лишь поверхностно.

    Тампер манки - Создать новый скрипт - уронить туда тампер манки часть.

    Серверная часть - Делайте любую папку, создаете файл server.js
    вставляете туда весь скрипт серверной части.
    Создаете start.bat туда пишите
    JS
    node server.js
    pause
    У ВАС ДОЛЖНЫ БЫТЬ ВИДНЫ РАСШИРЕНИЯ ДЛЯ ЗАРЕГИСТРИРОВАННЫХ ТИПОВ ФАЙЛОВ!!!
    Потом создаете файл
    proxies.txt
    Туда обязательно пишите ****** в формате ip:port:log:pass - без ****** работать не будет
    ****** по дефолту поддерживаются http если нужно, можно сделать socks, изменив параметр в коде.
    Но это вам не нужно если вы не понимаете для чего это.

    Запускаете сервер. Заходите на маркет с включенным скриптом тампер манки и обязательно включенным режимом разработчика в расширениях в гугл хроме ( и в других браузерах тоже)
    Получаете это
    https://imgur.com/a/5tP9QFM

    По итогу чекалка через сервер умеет
    1. Чекать через ******
    2. Ретраить ошибки при нажатии на них ( В целом можно и прошлую научить, но мне лень, перешел на серверную)
    3. Имеет кэш в 10 минут, чтобы не задрачивать стим запросами лишними.
    4. Систему ретраев ошибок \ понимание когда стим не работает (через ошибки 5хх)

    • KT (есть КТ),
    • NO (Валид),
    • ER (ошибка Steam\******),
    • OFF (сервер проверки недоступен).
    • OFF (Steam упал),
     
    8 янв 2025 Изменено
    1. jesse
      666, ну там опять хуячит аккаунты по почтам имяфамилияцифры уже 8 день пошел а эта маска до сих пор на маркете
      14 янв 2025 Изменено
  2. 005
    005 8 янв 2025 Заблокирован(а)
    Норм, спасибо, полезно
     
    1. Посмотреть предыдущие комментарии (2)
    2. 005
      God_likeGL, че мне тут расписывать на то какой это пиздатый софт? Как же я без него раньше то жил ну нихуя себе. У меня вся семья этим софтом пользуется спасибо большое tampermonkey что благодаря нему я могу воспользоваться данным скриптом для того чтобы узнать кт на аккаунте, иначе я бы в трусы себе насрал если бы не знал есть кт на аккаунте или нет
  3. Okila
    Okila 8 янв 2025 Заблокирован(а) 1094 26 дек 2020
    Полезно, очень даже. Надеюсь такое добавят в виде параметров для поиска аккаунтов.
     
    8 янв 2025 Изменено
  4. CONS
    CONS 8 янв 2025 #1 нищий
    спасибо за гайдик! !
     
  5. qwq
    qwq 8 янв 2025 https://lolz.live/threads/8777760 сигны с милой кисой ^-^
    что-то у меня неворк. режим разраба включен
     
    1. 666 Автор темы
      qwq, ща домой зайду, чекну
    2. qwq
      ну только показывает у каждого ака, что валидный, хотя на нем кт
  6. soal
    soal 8 янв 2025 14 979 26 ноя 2021
     
  7. 666
    666 Автор темы 8 янв 2025 Качественная отработка ***** - https://lolz.live/threads/8135594 50 545 27 июн 2019
    Пофиксил скрипт на сайте, перекачайте у кого не работал, вроде должно заработать.
     
    1. Tomodachi
      666, не переходит на сайт скрипта
  8. 666
    666 Автор темы 8 янв 2025 Качественная отработка ***** - https://lolz.live/threads/8135594 50 545 27 июн 2019
    Добавил скрипт в виде кода для самостоятельной вставки в тампер манки
     
    1. Посмотреть предыдущие комментарии (13)
    2. 666 Автор темы
      Tomodachi, [IMG]Нормально все твои акки отработали, хз в чем трабл у тебя
    3. RomaT
      Так же и на всех аках показывает,хотя валид и без КТ: [IMG]
      9 янв 2025 Изменено
    4. 666 Автор темы
      RomaT, когда скрипт ставишь, при первом запуске он просит разрешение. Ты для домена разрешить тыкаешь?
  9. 666
    666 Автор темы 21 май 2025 Качественная отработка ***** - https://lolz.live/threads/8135594 50 545 27 июн 2019
    Поднято кнопкой.
    Выложил последнюю версию браузерного чекера, которой пользовался сам.

    Выложил новую версию основанную на отдельном сервере. Позволяет проверять сколько угодно строк без зависаний и прочего бреда.
     
Top