Загрузка...

UI Automation Utility Expansion for quick and profitable exchanges in P2P section | Interest in exchanges in exchanges and much friend

Thread in Extentions created by APT29388 Mar 21, 2025. (bumped Jul 26, 2025 at 5:07 PM) 1083 views

  1. APT29388
    APT29388 Topic starter Mar 21, 2025 ГУРУ ИНВАЙТА - lolz.live/threads/8567181 :admin:
    [IMG]


    Вид в сообщениях:
    [IMG]


    Вид в разделе p2p:
    [IMG]
    [IMG]

    Вид отфильтрованных тем:
    [IMG]


    Как поставить?
    1) Качаете Tampermonkey
    2) Включаете режим разработчика в браузере
    3) Нажимаете на него
    4) Нажимаете Создать новый скрипт
    5) Копируете туда скрипт из ссылки (PasteBin)
    6) Файл -> Сохранить
    7) Заходите в раздел P2P
    8) Обновляете страницу


    На данный момент (29.03.25) это самая актуальная версия скрипта, всё под темой - устаревшие версии, но тоже рабочие, правда с урезанным функционалом:


    ЭТО НЕ ОКОНЧАТЕЛЬНАЯ ВЕРСИЯ СКРИПТА, СОВЕТУЮ СЛЕДИТЬ ЗА ЕГО ОБНОВЛЕНИЯМИ, ЧТОБЫ ПОПОЛНИТЬ ДЕП НА 10К, ЗАПУСТИТЬ СКРИПТ И ПОЛУЧАТЬ ПРОФИТ


    Если у вам есть какие то вопросы по его работе, то не стесняйтесь и пишите мне в ТГ - Telegram: APT29388
     
    1. 3645483
    2. APT29388 Topic starter
      3645483, момент иметтся
    3. 3645483
      APT29388, написал 700 строчек на жс = говнокодер по твоему, зря ты так :despair: :obdance:
  2. vrodefrik
    vrodefrik Mar 21, 2025 похуй, работаем 2286 May 8, 2022
    ебать спасибо
     
  3. Весть
    Весть Mar 21, 2025 Моментальная покупка TRX - https://lolz.live/threads/8610296/ 9551 Aug 8, 2019
    uncpfiae пора бы это со стороны форума реализовывать...
     
    1. vrodefrik
      Весть, создавал как то тему, ответили, что это не биржа и это не нужно
    2. Весть
      vrodefrik, так не нужно, что пользователи скрипты делают
    3. Toil
      Весть,
      РайсМорган на нг отвечал, что планируют полностью переделать раздел p2p, но это процесс не быстрый. Мб вместе с этим и сделают все по красоте
    4. View the next comments (2)
  4. APT29388
    APT29388 Topic starter Mar 22, 2025 ГУРУ ИНВАЙТА - lolz.live/threads/8567181 :admin:
    ОБНОВЛЕНИЕ:
    Добавлены фильтры "от/до" для каждого из направлений обменов и кнопка быстрой отправки предложения обмена

    [IMG]

    JS
    // ==UserScript==
    // @name P2P Фильтр обменов
    // @namespace http://tampermonkey.net/
    // @version 1.0
    // @description P2P
    // @author APT29388
    // @match https://lolz.live/forums/1001/*
    // @grant none
    // ==/UserScript==

    (function() {
    'use strict';

    const styles = `
    .p2p-filter-container {
    background-color: #1c1c1c;
    border: 1px solid #242424;
    border-radius: 10px;
    padding: 15px;
    margin-bottom: 15px;
    color: #d6d6d6;
    }

    .p2p-filter-title {
    font-size: 16px;
    font-weight: bold;
    margin-bottom: 10px;
    color: #00ba78;
    }

    .p2p-filter-section {
    margin-bottom: 15px;
    }

    .p2p-filter-section:not(:last-child) {
    border-bottom: 1px solid #333;
    padding-bottom: 15px;
    margin-bottom: 20px;
    }

    .p2p-filter-section-title {
    font-size: 14px;
    font-weight: bold;
    margin-bottom: 5px;
    display: flex;
    align-items: center;
    }

    .p2p-filter-section-title .direction-icon {
    margin: 0 5px;
    color: #00ba78;
    }

    .p2p-filter-options {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-bottom: 10px;
    }

    .p2p-filter-checkbox {
    display: flex;
    align-items: center;
    margin-right: 10px;
    }

    .p2p-filter-checkbox input {
    margin-right: 5px;
    }

    .p2p-filter-percent {
    display: flex;
    align-items: center;
    margin-top: 5px;
    }

    .p2p-filter-percent input {
    width: 60px;
    margin: 0 5px;
    padding: 5px;
    background-color: #242424;
    border: 1px solid #333;
    color: #d6d6d6;
    border-radius: 5px;
    }

    .p2p-filter-button {
    background-color: #00ba78;
    color: #fff;
    border: none;
    padding: 8px 15px;
    border-radius: 5px;
    cursor: pointer;
    font-weight: bold;
    margin-right: 10px;
    }

    .p2p-filter-button:hover {
    background-color: #008c5a;
    }

    .p2p-filter-reset {
    background-color: #444;
    color: #fff;
    border: none;
    padding: 8px 15px;
    border-radius: 5px;
    cursor: pointer;
    font-weight: bold;
    }

    .p2p-filter-reset:hover {
    background-color: #555;
    }

    .p2p-highlight {
    border-left: 3px solid #00ba78 !important;
    }

    .p2p-filter-info {
    font-size: 12px;
    color: #888;
    margin-top: 5px;
    }

    .p2p-filter-example {
    background-color: #242424;
    padding: 5px 10px;
    border-radius: 5px;
    margin-top: 5px;
    font-size: 12px;
    }

    .p2p-filter-example-good {
    color: #00ba78;
    }

    .p2p-filter-example-bad {
    color: #ff5555;
    text-decoration: line-through;
    }

    .p2p-filter-actions {
    margin-top: 15px;
    }

    .p2p-filter-auto-refresh {
    display: flex;
    align-items: center;
    gap: 15px;
    margin-bottom: 5px;
    }

    .p2p-filter-interval {
    display: flex;
    align-items: center;
    }

    .p2p-filter-interval input {
    width: 60px;
    margin: 0 5px;
    padding: 5px;
    background-color: #242424;
    border: 1px solid #333;
    color: #d6d6d6;
    border-radius: 5px;
    }

    .p2p-filter-button-small {
    padding: 5px 10px;
    font-size: 12px;
    margin-left: 10px;
    }

    .p2p-filter-amount {
    display: flex;
    align-items: center;
    margin-top: 10px;
    gap: 10px;
    }

    .p2p-filter-amount input {
    width: 80px;
    padding: 5px;
    background-color: #242424;
    border: 1px solid #333;
    color: #d6d6d6;
    border-radius: 5px;
    }

    .quick-offer-button {
    background-color: #00ba78;
    color: #fff;
    border: none;
    padding: 3px 6px;
    border-radius: 3px;
    cursor: pointer;
    font-size: 11px;
    margin-right: 5px;
    display: inline-flex;
    align-items: center;
    opacity: 1 !important;
    transition: background-color 0.2s;
    }

    .quick-offer-button:hover {
    background-color: #008c5a;
    }

    .quick-offer-button i {
    margin-right: 3px;
    font-size: 10px;
    }

    .discussionListItem .controls {
    opacity: 1 !important;
    }
    `;

    const styleElement = document.createElement('style');
    styleElement.textContent = styles;
    document.head.appendChild(styleElement);

    const banks = ['Тинькофф', 'СБП', 'Сбербанк', 'Юмани', 'Альфа-Банк'];

    function getDefaultSettings() {
    return {
    marketToBank: true,
    bankToMarket: true,
    tinkoff: true,
    sbp: true,
    sber: true,
    yoomoney: true,
    alpha: true,
    marketToBankPercent: 5,
    bankToMarketPercent: 3,
    autoRefresh: false,
    refreshInterval: 30,
    marketToBankMinAmount: 0,
    marketToBankMaxAmount: 0,
    bankToMarketMinAmount: 0,
    bankToMarketMaxAmount: 0
    };
    }

    let settings = loadFilterSettings() || getDefaultSettings();

    function createFilterHTML() {
    return `
    <div class="p2p-filter-container">
    <div class="p2p-filter-title">Фильтр P2P обменов</div>

    <div class="p2p-filter-section">
    <div class="p2p-filter-section-title">
    <span>Банк</span>
    <span class="direction-icon">→</span>
    <span>Маркет (пополнение маркета)</span>
    </div>
    <div class="p2p-filter-options" id="bank-to-market">
    ${banks.map(bank => `
    <div class="p2p-filter-checkbox">
    <input type="checkbox" id="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}">
    <label for="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label>
    </div>
    `).join('')}
    </div>
    <div class="p2p-filter-percent">
    <label for="bank-to-market-percent">Максимальный процент:</label>
    <input type="number" id="bank-to-market-percent" value="3" min="-10" max="20" step="0.5">
    <span>%</span>
    </div>
    <div class="p2p-filter-amount">
    <label for="bank-to-market-min-amount">Сумма от:</label>
    <input type="number" id="bank-to-market-min-amount" value="0" min="0">
    <label for="bank-to-market-max-amount">до:</label>
    <input type="number" id="bank-to-market-max-amount" value="0" min="0">
    <span class="p2p-filter-info">(0 = без ограничений)</span>
    </div>
    </div>

    <div class="p2p-filter-section">
    <div class="p2p-filter-section-title">
    <span>Маркет</span>
    <span class="direction-icon">→</span>
    <span>Банк (вывод с маркета)</span>
    </div>
    <div class="p2p-filter-options" id="market-to-bank">
    ${banks.map(bank => `
    <div class="p2p-filter-checkbox">
    <input type="checkbox" id="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}">
    <label for="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label>
    </div>
    `).join('')}
    </div>
    <div class="p2p-filter-percent">
    <label for="market-to-bank-percent">Минимальный процент:</label>
    <input type="number" id="market-to-bank-percent" value="5" min="0" max="20" step="0.5">
    <span>%</span>
    </div>
    <div class="p2p-filter-amount">
    <label for="market-to-bank-min-amount">Сумма от:</label>
    <input type="number" id="market-to-bank-min-amount" value="0" min="0">
    <label for="market-to-bank-max-amount">до:</label>
    <input type="number" id="market-to-bank-max-amount" value="0" min="0">
    <span class="p2p-filter-info">(0 = без ограничений)</span>
    </div>
    </div>

    <div class="p2p-filter-section">
    <div class="p2p-filter-section-title">
    <span>Автообновление ленты</span>
    </div>
    <div class="p2p-filter-auto-refresh">
    <div class="p2p-filter-checkbox">
    <input type="checkbox" id="auto-refresh-enabled">
    <label for="auto-refresh-enabled">Включить автообновление</label>
    </div>
    <div class="p2p-filter-interval">
    <label for="auto-refresh-interval">Интервал (сек):</label>
    <input type="number" id="auto-refresh-interval" value="30" min="5" max="300" step="1">
    </div>
    <button id="save-auto-refresh" class="p2p-filter-button p2p-filter-button-small">Сохранить</button>
    </div>
    <div class="p2p-filter-info">
    Автоматически нажимает кнопку "Обновить ленту" с указанным интервалом
    </div>
    </div>

    <div class="p2p-filter-actions">
    <button id="apply-filter" class="p2p-filter-button">Применить фильтр</button>
    <button id="reset-filter" class="p2p-filter-reset">Сбросить</button>
    </div>
    </div>
    `;
    }

    function checkThreadMatchesFilter(
    threadTitle,
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    ) {
    let marketAmount = null;
    let bankAmount = null;
    let direction = null;

    const bracketMatch = threadTitle.match(/\[(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\s*>\s*(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\]/i);

    const marketToBankMatch = threadTitle.match(/(?:Маркет|Market|LZT|Lolz)\s*(?:>|→|-)\s*(Тинькофф|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa)/i);
    const bankToMarketMatch = threadTitle.match(/(Тинькофф|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa)\s*(?:>|→|-)\s*(?:Маркет|Market|LZT|Lolz)/i);

    if (marketToBankMatch) {
    direction = 'market-to-bank';

    const bank = marketToBankMatch[1];
    const bankMatches = selectedBanksMarketToBank.some(selectedBank =>
    bank.toLowerCase().includes(selectedBank.toLowerCase()) ||
    selectedBank.toLowerCase().includes(bank.toLowerCase())
    );

    if (!bankMatches || selectedBanksMarketToBank.length === 0) {
    return false;
    }

    if (bracketMatch) {
    const firstAmount = parseFloat(bracketMatch[1].replace(',', '.'));
    const secondAmount = parseFloat(bracketMatch[2].replace(',', '.'));

    marketAmount = firstAmount;
    bankAmount = secondAmount;

    const percent = (marketAmount - bankAmount) / (marketAmount / 100);

    if ((marketToBankMinAmount > 0 || marketToBankMaxAmount > 0) && marketAmount) {
    if (marketToBankMinAmount > 0 && marketAmount < marketToBankMinAmount) {
    return false;
    }
    if (marketToBankMaxAmount > 0 && marketAmount > marketToBankMaxAmount) {
    return false;
    }
    }

    return percent >= marketToBankPercent;
    }

    return true;
    }
    else if (bankToMarketMatch) {
    direction = 'bank-to-market';

    const bank = bankToMarketMatch[1];
    const bankMatches = selectedBanksBankToMarket.some(selectedBank =>
    bank.toLowerCase().includes(selectedBank.toLowerCase()) ||
    selectedBank.toLowerCase().includes(bank.toLowerCase())
    );

    if (!bankMatches || selectedBanksBankToMarket.length === 0) {
    return false;
    }

    if (bracketMatch) {
    const firstAmount = parseFloat(bracketMatch[1].replace(',', '.'));
    const secondAmount = parseFloat(bracketMatch[2].replace(',', '.'));

    bankAmount = firstAmount;
    marketAmount = secondAmount;

    const percent = (marketAmount - bankAmount) / (bankAmount / 100);

    if ((bankToMarketMinAmount > 0 || bankToMarketMaxAmount > 0) && bankAmount) {
    if (bankToMarketMinAmount > 0 && bankAmount < bankToMarketMinAmount) {
    return false;
    }
    if (bankToMarketMaxAmount > 0 && bankAmount > bankToMarketMaxAmount) {
    return false;
    }
    }

    return percent <= bankToMarketPercent;
    }

    return true;
    }

    return false;
    }

    function applyFilterToThreads(
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    ) {
    const threads = document.querySelectorAll('.discussionListItem');

    threads.forEach(thread => {
    const titleElement = thread.querySelector('.spanTitle');
    if (!titleElement) return;

    const threadTitle = titleElement.textContent.trim();

    const shouldShow = checkThreadMatchesFilter(
    threadTitle,
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    );

    if (shouldShow) {
    thread.style.display = 'block';
    thread.classList.add('p2p-highlight');
    } else {
    thread.style.display = 'none';
    thread.classList.remove('p2p-highlight');
    }
    });

    addQuickOfferButtons();

    return threads.length;
    }

    function applyFilter() {
    const selectedBanksMarketToBank = [];
    const selectedBanksBankToMarket = [];

    document.querySelectorAll('#market-to-bank input[type="checkbox"]:checked').forEach(checkbox => {
    selectedBanksMarketToBank.push(checkbox.value);
    });

    document.querySelectorAll('#bank-to-market input[type="checkbox"]:checked').forEach(checkbox => {
    selectedBanksBankToMarket.push(checkbox.value);
    });

    const marketToBankPercent = parseFloat(document.getElementById('market-to-bank-percent').value);
    const bankToMarketPercent = parseFloat(document.getElementById('bank-to-market-percent').value);

    const marketToBankMinAmount = parseInt(document.getElementById('market-to-bank-min-amount').value) || 0;
    const marketToBankMaxAmount = parseInt(document.getElementById('market-to-bank-max-amount').value) || 0;

    const bankToMarketMinAmount = parseInt(document.getElementById('bank-to-market-min-amount').value) || 0;
    const bankToMarketMaxAmount = parseInt(document.getElementById('bank-to-market-max-amount').value) || 0;

    saveFilterSettings(
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    );

    applyFilterToThreads(
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    );
    }

    function saveFilterSettings(
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    ) {
    const settings = {
    marketToBank: selectedBanksMarketToBank,
    bankToMarket: selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    };

    localStorage.setItem('p2pFilterSettings', JSON.stringify(settings));
    }

    function loadFilterSettings() {
    const settingsJson = localStorage.getItem('p2pFilterSettings');
    if (settingsJson) {
    const settings = JSON.parse(settingsJson);

    if (settings.marketToBankMinAmount === undefined) {
    settings.marketToBankMinAmount = 0;
    }
    if (settings.marketToBankMaxAmount === undefined) {
    settings.marketToBankMaxAmount = 0;
    }
    if (settings.bankToMarketMinAmount === undefined) {
    settings.bankToMarketMinAmount = 0;
    }
    if (settings.bankToMarketMaxAmount === undefined) {
    settings.bankToMarketMaxAmount = 0;
    }

    return settings;
    }
    return null;
    }

    function resetFilter() {
    document.querySelectorAll('.p2p-filter-checkbox input').forEach(checkbox => {
    checkbox.checked = false;
    });

    document.getElementById('market-to-bank-percent').value = 5;
    document.getElementById('bank-to-market-percent').value = 3;

    const threads = document.querySelectorAll('.discussionListItem');
    threads.forEach(thread => {
    thread.style.display = 'block';
    thread.classList.remove('p2p-highlight');
    });

    localStorage.removeItem('p2pFilterSettings');
    }

    function applyFilterSettings(settings) {
    if (!settings) return;

    settings.marketToBank.forEach(bank => {
    const checkbox = document.getElementById(`market-to-${bank.toLowerCase().replace(/\s+/g, '-')}`);
    if (checkbox) checkbox.checked = true;
    });

    settings.bankToMarket.forEach(bank => {
    const checkbox = document.getElementById(`bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}`);
    if (checkbox) checkbox.checked = true;
    });

    document.getElementById('market-to-bank-percent').value = settings.marketToBankPercent;
    document.getElementById('bank-to-market-percent').value = settings.bankToMarketPercent;

    applyFilterToThreads(
    settings.marketToBank,
    settings.bankToMarket,
    settings.marketToBankPercent,
    settings.bankToMarketPercent,
    settings.marketToBankMinAmount,
    settings.marketToBankMaxAmount,
    settings.bankToMarketMinAmount,
    settings.bankToMarketMaxAmount
    );
    }

    function autoLoadAllThreads() {
    return new Promise((resolve) => {
    const maxScrollAttempts = 30;
    let scrollAttempts = 0;
    let noNewThreadsCounter = 0;

    const checkAllResultsShowing = () => {
    return document.querySelector('.AllResultsShowing') !== null;
    };

    const scrollDown = () => {
    window.scrollTo(0, document.body.scrollHeight);
    };

    const checkIfLoading = () => {
    const loadingIndicator = document.querySelector('.loading');
    return loadingIndicator && loadingIndicator.style.display !== 'none';
    };

    let previousThreadCount = 0;
    const checkForNewThreads = () => {
    const currentThreadCount = document.querySelectorAll('.discussionListItem').length;
    const hasNewThreads = currentThreadCount > previousThreadCount;
    previousThreadCount = currentThreadCount;
    return hasNewThreads;
    };

    const loadMoreThreads = () => {
    scrollAttempts++;

    if (scrollAttempts > maxScrollAttempts || checkAllResultsShowing()) {
    console.log('Загрузка завершена, всего тем: ' + previousThreadCount);
    resolve();
    return;
    }

    if (checkIfLoading()) {
    setTimeout(loadMoreThreads, 500);
    return;
    }

    scrollDown();

    setTimeout(() => {
    if (checkForNewThreads()) {
    noNewThreadsCounter = 0;
    loadMoreThreads();
    } else if (checkIfLoading()) {
    loadMoreThreads();
    } else {
    noNewThreadsCounter++;

    if (noNewThreadsCounter >= 3) {
    console.log('Загрузка завершена после ' + scrollAttempts + ' попыток, всего тем: ' + previousThreadCount);
    resolve();
    } else {
    setTimeout(loadMoreThreads, 1000);
    }
    }
    }, 1000);
    };

    loadMoreThreads();
    });
    }

    let autoRefreshInterval = null;

    function toggleAutoRefresh() {
    const isEnabled = document.getElementById('auto-refresh-enabled').checked;
    const intervalSeconds = parseInt(document.getElementById('auto-refresh-interval').value) || 30;

    if (autoRefreshInterval) {
    clearInterval(autoRefreshInterval);
    autoRefreshInterval = null;
    }

    if (isEnabled && intervalSeconds >= 5) {
    autoRefreshInterval = setInterval(() => {
    const refreshButton = document.querySelector('.UpdateFeedButton');
    if (refreshButton) {
    if (window.getComputedStyle(refreshButton).display !== 'none') {
    refreshButton.click();
    console.log('Лента обновлена автоматически');
    } else {
    console.log('Кнопка обновления ленты скрыта, пропускаем обновление');
    }
    } else {
    console.log('Кнопка обновления ленты не найдена');
    }
    }, intervalSeconds * 1000);

    console.log(`Автообновление ленты включено с интервалом ${intervalSeconds} сек`);
    } else {
    console.log('Автообновление ленты выключено');
    }

    saveAutoRefreshSettings(isEnabled, intervalSeconds);
    }

    function saveAutoRefreshSettings(isEnabled, intervalSeconds) {
    localStorage.setItem('p2pAutoRefreshEnabled', isEnabled);
    localStorage.setItem('p2pAutoRefresh
     
    1. APT29388 Topic starter
      Прошлая версия, актуальная в закрепе выше
  5. APT29388
    APT29388 Topic starter Mar 22, 2025 ГУРУ ИНВАЙТА - lolz.live/threads/8567181 :admin:
    ОБНОВЛЕНИЕ:
    Добавлены добавочный текст к предложению обмена и расчёт для тем с CryptoBot
    [IMG]

    JS
        // ==UserScript==
    // @name Lolz P2P Фильтр обменов
    // @namespace http://tampermonkey.net/
    // @version 1.0
    // @description Фильтрация P2P обменов на Lolz.live с возможностью выбора направлений и процентов
    // @author APT29388
    // @match https://lolz.live/forums/1001/*
    // @grant none
    // ==/UserScript==

    (function() {
    'use strict';

    const styles = `
    .p2p-filter-container {
    background-color: #1c1c1c;
    border: 1px solid #242424;
    border-radius: 10px;
    padding: 15px;
    margin-bottom: 15px;
    color: #d6d6d6;
    }

    .p2p-filter-title {
    font-size: 16px;
    font-weight: bold;
    margin-bottom: 10px;
    color: #00ba78;
    }

    .p2p-filter-section {
    margin-bottom: 15px;
    }

    .p2p-filter-section:not(:last-child) {
    border-bottom: 1px solid #333;
    padding-bottom: 15px;
    margin-bottom: 20px;
    }

    .p2p-filter-section-title {
    font-size: 14px;
    font-weight: bold;
    margin-bottom: 5px;
    display: flex;
    align-items: center;
    }

    .p2p-filter-section-title .direction-icon {
    margin: 0 5px;
    color: #00ba78;
    }

    .p2p-filter-options {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-bottom: 10px;
    }

    .p2p-filter-checkbox {
    display: flex;
    align-items: center;
    margin-right: 10px;
    }

    .p2p-filter-checkbox input {
    margin-right: 5px;
    }

    .p2p-filter-percent {
    display: flex;
    align-items: center;
    margin-top: 5px;
    }

    .p2p-filter-percent input {
    width: 60px;
    margin: 0 5px;
    padding: 5px;
    background-color: #242424;
    border: 1px solid #333;
    color: #d6d6d6;
    border-radius: 5px;
    }

    .p2p-filter-button {
    background-color: #00ba78;
    color: #fff;
    border: none;
    padding: 8px 15px;
    border-radius: 5px;
    cursor: pointer;
    font-weight: bold;
    margin-right: 10px;
    }

    .p2p-filter-button:hover {
    background-color: #008c5a;
    }

    .p2p-filter-reset {
    background-color: #444;
    color: #fff;
    border: none;
    padding: 8px 15px;
    border-radius: 5px;
    cursor: pointer;
    font-weight: bold;
    }

    .p2p-filter-reset:hover {
    background-color: #555;
    }

    .p2p-highlight {
    border-left: 3px solid #00ba78 !important;
    }

    .p2p-filter-info {
    font-size: 12px;
    color: #888;
    margin-top: 5px;
    }

    .p2p-filter-example {
    background-color: #242424;
    padding: 5px 10px;
    border-radius: 5px;
    margin-top: 5px;
    font-size: 12px;
    }

    .p2p-filter-example-good {
    color: #00ba78;
    }

    .p2p-filter-example-bad {
    color: #ff5555;
    text-decoration: line-through;
    }

    .p2p-filter-actions {
    margin-top: 15px;
    }

    .p2p-filter-auto-refresh {
    display: flex;
    align-items: center;
    gap: 15px;
    margin-bottom: 5px;
    }

    .p2p-filter-interval {
    display: flex;
    align-items: center;
    }

    .p2p-filter-interval input {
    width: 60px;
    margin: 0 5px;
    padding: 5px;
    background-color: #242424;
    border: 1px solid #333;
    color: #d6d6d6;
    border-radius: 5px;
    }

    .p2p-filter-button-small {
    padding: 5px 10px;
    font-size: 12px;
    margin-left: 10px;
    }

    .p2p-filter-amount {
    display: flex;
    align-items: center;
    margin-top: 10px;
    gap: 10px;
    }

    .p2p-filter-amount input {
    width: 80px;
    padding: 5px;
    background-color: #242424;
    border: 1px solid #333;
    color: #d6d6d6;
    border-radius: 5px;
    }

    .quick-offer-button {
    background-color: #00ba78;
    color: #fff;
    border: none;
    padding: 3px 6px;
    border-radius: 3px;
    cursor: pointer;
    font-size: 11px;
    margin-right: 5px;
    display: inline-flex;
    align-items: center;
    opacity: 1 !important;
    }

    .quick-offer-button:hover {
    background-color: #008c5a;
    }

    .quick-offer-button i {
    margin-right: 0;
    }

    .discussionListItem .controls {
    opacity: 1 !important;
    }

    /* Стили для настройки дополнительного текста */
    .p2p-filter-custom-message {
    margin-top: 10px;
    }

    .p2p-filter-custom-message textarea {
    width: 100%;
    height: 40px;
    background-color: #242424;
    border: 1px solid #333;
    color: #d6d6d6;
    border-radius: 5px;
    padding: 5px;
    margin-top: 5px;
    resize: vertical;
    font-size: 12px;
    line-height: 1.3;
    }

    .p2p-filter-custom-message .p2p-filter-button-small {
    padding: 3px 8px;
    font-size: 11px;
    margin-top: 3px;
    }

    .p2p-filter-custom-message .p2p-filter-info {
    font-size: 11px;
    margin-top: 3px;
    opacity: 0.8;
    }
    `;

    const styleElement = document.createElement('style');
    styleElement.textContent = styles;
    document.head.appendChild(styleElement);

    const banks = ['Т-Банк', 'СБП', 'Сбербанк', 'Юмани', 'Альфа-Банк', 'CryptoBot'];

    function getDefaultSettings() {
    return {
    marketToBank: true,
    bankToMarket: true,
    tinkoff: true,
    sbp: true,
    sber: true,
    yoomoney: true,
    alpha: true,
    marketToBankPercent: 5,
    bankToMarketPercent: 3,
    autoRefresh: false,
    refreshInterval: 30,
    marketToBankMinAmount: 0,
    marketToBankMaxAmount: 0,
    bankToMarketMinAmount: 0,
    bankToMarketMaxAmount: 0
    };
    }

    let settings = loadFilterSettings() || getDefaultSettings();

    function createFilterHTML() {
    return `
    <div class="p2p-filter-container">
    <div class="p2p-filter-title">Фильтр P2P обменов</div>

    <div class="p2p-filter-section">
    <div class="p2p-filter-section-title">
    <span>Банк</span>
    <span class="direction-icon">→</span>
    <span>Маркет (пополнение маркета)</span>
    </div>
    <div class="p2p-filter-options" id="bank-to-market">
    ${banks.map(bank => `
    <div class="p2p-filter-checkbox">
    <input type="checkbox" id="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}">
    <label for="bank-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label>
    </div>
    `).join('')}
    </div>
    <div class="p2p-filter-percent">
    <label for="bank-to-market-percent">Максимальный процент:</label>
    <input type="number" id="bank-to-market-percent" value="3" min="-10" max="20" step="0.5">
    <span>%</span>
    </div>
    <div class="p2p-filter-amount">
    <label for="bank-to-market-min-amount">Сумма от:</label>
    <input type="number" id="bank-to-market-min-amount" value="0" min="0">
    <label for="bank-to-market-max-amount">до:</label>
    <input type="number" id="bank-to-market-max-amount" value="0" min="0">
    <span class="p2p-filter-info">(0 = без ограничений)</span>
    </div>
    </div>

    <div class="p2p-filter-section">
    <div class="p2p-filter-section-title">
    <span>Маркет</span>
    <span class="direction-icon">→</span>
    <span>Банк (вывод с маркета)</span>
    </div>
    <div class="p2p-filter-options" id="market-to-bank">
    ${banks.map(bank => `
    <div class="p2p-filter-checkbox">
    <input type="checkbox" id="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}" value="${bank}">
    <label for="market-to-${bank.toLowerCase().replace(/\s+/g, '-')}">${bank}</label>
    </div>
    `).join('')}
    </div>
    <div class="p2p-filter-percent">
    <label for="market-to-bank-percent">Минимальный процент:</label>
    <input type="number" id="market-to-bank-percent" value="5" min="0" max="20" step="0.5">
    <span>%</span>
    </div>
    <div class="p2p-filter-amount">
    <label for="market-to-bank-min-amount">Сумма от:</label>
    <input type="number" id="market-to-bank-min-amount" value="0" min="0">
    <label for="market-to-bank-max-amount">до:</label>
    <input type="number" id="market-to-bank-max-amount" value="0" min="0">
    <span class="p2p-filter-info">(0 = без ограничений)</span>
    </div>
    </div>

    <div class="p2p-filter-section">
    <div class="p2p-filter-section-title">
    <span>Автообновление ленты</span>
    </div>
    <div class="p2p-filter-auto-refresh">
    <div class="p2p-filter-checkbox">
    <input type="checkbox" id="auto-refresh-enabled">
    <label for="auto-refresh-enabled">Включить автообновление</label>
    </div>
    <div class="p2p-filter-interval">
    <label for="auto-refresh-interval">Интервал (сек):</label>
    <input type="number" id="auto-refresh-interval" value="30" min="5" max="300" step="1">
    </div>
    <button id="save-auto-refresh" class="p2p-filter-button p2p-filter-button-small">Сохранить</button>
    </div>
    <div class="p2p-filter-info">
    Автоматически нажимает кнопку "Обновить ленту" с указанным интервалом
    </div>
    </div>

    <div class="p2p-filter-section">
    <div class="p2p-filter-section-title">
    <span>Текст сообщения</span>
    </div>
    <div class="p2p-filter-custom-message">
    <label for="custom-message-text">Дополнительный текст:</label>
    <textarea id="custom-message-text" placeholder="Введите текст, который будет добавлен к стандартному сообщению"></textarea>
    <div class="p2p-filter-info">
    Добавляется после "Здравствуйте, интересует обмен: [ссылка]"
    </div>
    <button id="save-custom-message" class="p2p-filter-button p2p-filter-button-small">Сохранить</button>
    </div>
    </div>

    <div class="p2p-filter-actions">
    <button id="apply-filter" class="p2p-filter-button">Применить фильтр</button>
    <button id="reset-filter" class="p2p-filter-reset">Сбросить</button>
    </div>
    </div>
    `;
    }

    function checkThreadMatchesFilter(
    threadTitle,
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    ) {
    let marketAmount = null;
    let bankAmount = null;
    let direction = null;

    const bracketMatch = threadTitle.match(/\[(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\s*>\s*(\d+(?:[.,]\d+)?)\s*(?:RUB|р|₽)\]/i);

    const marketToBankMatch = threadTitle.match(/(?:Маркет|Market|LZT|Lolz)\s*(?:>|→|-)\s*(Т-Банк|Т\s*Банк|Т-банк|Т\s*банк|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa|CryptoBot|Crypto\s*Bot|крипто\s*бот)/i);
    const bankToMarketMatch = threadTitle.match(/(Т-Банк|Т\s*Банк|Т-банк|Т\s*банк|СБП|Сбербанк|Юмани|Альфа-Банк|Tinkoff|Sberbank|Yoomoney|Alfa|CryptoBot|Crypto\s*Bot|крипто\s*бот)\s*(?:>|→|-)\s*(?:Маркет|Market|LZT|Lolz)/i);

    if (marketToBankMatch) {
    direction = 'market-to-bank';

    const bank = marketToBankMatch[1];
    const bankMatches = selectedBanksMarketToBank.some(selectedBank => {
    if (selectedBank === 'Т-Банк') {
    return /Т-Банк|Т\s*Банк|Т-банк|Т\s*банк|Tinkoff/i.test(bank);
    }
    if (selectedBank === 'CryptoBot') {
    return /CryptoBot|Crypto\s*Bot|крипто\s*бот/i.test(bank);
    }
    return bank.toLowerCase().includes(selectedBank.toLowerCase()) ||
    selectedBank.toLowerCase().includes(bank.toLowerCase());
    });

    if (!bankMatches || selectedBanksMarketToBank.length === 0) {
    return false;
    }

    if (bracketMatch) {
    const firstAmount = parseFloat(bracketMatch[1].replace(',', '.'));
    const secondAmount = parseFloat(bracketMatch[2].replace(',', '.'));

    marketAmount = firstAmount;
    bankAmount = secondAmount;

    const percent = (marketAmount - bankAmount) / (marketAmount / 100);

    if ((marketToBankMinAmount > 0 || marketToBankMaxAmount > 0) && marketAmount) {
    if (marketToBankMinAmount > 0 && marketAmount < marketToBankMinAmount) {
    return false;
    }
    if (marketToBankMaxAmount > 0 && marketAmount > marketToBankMaxAmount) {
    return false;
    }
    }

    return percent >= marketToBankPercent;
    }

    return true;
    }
    else if (bankToMarketMatch) {
    direction = 'bank-to-market';

    const bank = bankToMarketMatch[1];
    const bankMatches = selectedBanksBankToMarket.some(selectedBank => {
    if (selectedBank === 'Т-Банк') {
    return /Т-Банк|Т\s*Банк|Т-банк|Т\s*банк|Tinkoff/i.test(bank);
    }
    if (selectedBank === 'CryptoBot') {
    return /CryptoBot|Crypto\s*Bot|крипто\s*бот/i.test(bank);
    }
    return bank.toLowerCase().includes(selectedBank.toLowerCase()) ||
    selectedBank.toLowerCase().includes(bank.toLowerCase());
    });

    if (!bankMatches || selectedBanksBankToMarket.length === 0) {
    return false;
    }

    if (bracketMatch) {
    const firstAmount = parseFloat(bracketMatch[1].replace(',', '.'));
    const secondAmount = parseFloat(bracketMatch[2].replace(',', '.'));

    bankAmount = firstAmount;
    marketAmount = secondAmount;

    const percent = (marketAmount - bankAmount) / (bankAmount / 100);

    if ((bankToMarketMinAmount > 0 || bankToMarketMaxAmount > 0) && bankAmount) {
    if (bankToMarketMinAmount > 0 && bankAmount < bankToMarketMinAmount) {
    return false;
    }
    if (bankToMarketMaxAmount > 0 && bankAmount > bankToMarketMaxAmount) {
    return false;
    }
    }

    return percent <= bankToMarketPercent;
    }

    return true;
    }

    return false;
    }

    function applyFilterToThreads(
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    ) {
    const threads = document.querySelectorAll('.discussionListItem');

    threads.forEach(thread => {
    const titleElement = thread.querySelector('.spanTitle');
    if (!titleElement) return;

    const threadTitle = titleElement.textContent.trim();

    const shouldShow = checkThreadMatchesFilter(
    threadTitle,
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    );

    if (shouldShow) {
    thread.style.display = 'block';
    thread.classList.add('p2p-highlight');
    } else {
    thread.style.display = 'none';
    thread.classList.remove('p2p-highlight');
    }
    });

    addQuickOfferButtons();

    return threads.length;
    }

    function applyFilter() {
    const selectedBanksMarketToBank = [];
    const selectedBanksBankToMarket = [];

    document.querySelectorAll('#market-to-bank input[type="checkbox"]:checked').forEach(checkbox => {
    selectedBanksMarketToBank.push(checkbox.value);
    });

    document.querySelectorAll('#bank-to-market input[type="checkbox"]:checked').forEach(checkbox => {
    selectedBanksBankToMarket.push(checkbox.value);
    });

    const marketToBankPercent = parseFloat(document.getElementById('market-to-bank-percent').value);
    const bankToMarketPercent = parseFloat(document.getElementById('bank-to-market-percent').value);

    const marketToBankMinAmount = parseInt(document.getElementById('market-to-bank-min-amount').value) || 0;
    const marketToBankMaxAmount = parseInt(document.getElementById('market-to-bank-max-amount').value) || 0;

    const bankToMarketMinAmount = parseInt(document.getElementById('bank-to-market-min-amount').value) || 0;
    const bankToMarketMaxAmount = parseInt(document.getElementById('bank-to-market-max-amount').value) || 0;

    saveFilterSettings(
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    );

    applyFilterToThreads(
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    );
    }

    function saveFilterSettings(
    selectedBanksMarketToBank,
    selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    ) {
    const settings = {
    marketToBank: selectedBanksMarketToBank,
    bankToMarket: selectedBanksBankToMarket,
    marketToBankPercent,
    bankToMarketPercent,
    marketToBankMinAmount,
    marketToBankMaxAmount,
    bankToMarketMinAmount,
    bankToMarketMaxAmount
    };

    localStorage.setItem('p2pFilterSettings', JSON.stringify(settings));
    }

    function loadFilterSettings() {
    const settingsJson = localStorage.getItem('p2pFilterSettings');
    if (settingsJson) {
    const settings = JSON.parse(settingsJson);

    if (settings.marketToBankMinAmount === undefined) {
    settings.marketToBankMinAmount = 0;
    }
    if (settings.marketToBankMaxAmount === undefined) {
    settings.marketToBankMaxAmount = 0;
    }
    if (settings.bankToMarketMinAmount === undefined) {
    settings.bankToMarketMinAmount = 0;
    }
    if (settings.bankToMarketMaxAmount === undefined) {
    settings.bankToMarketMaxAmount = 0;
    }

    return settings;
    }
    return null;
    }

    function resetFilter() {
    document.querySelectorAll('.p2p-filter-checkbox input').forEach(checkbox => {
    checkbox.checked = false;
    });

    document.getElementById('market-to-bank-percent').value = 5;
    document.getElementById('bank-to-market-percent').value = 3;

    const threads = document.querySelectorAll('.discussionListItem');
    threads.forEach(thread => {
    thread.style.display = 'block';
    thread.classList.remove('p2p-highlight');
    });

    localStorage.removeItem('p2pFilterSettings');
    }

    function applyFilterSettings(settings) {
    if (!settings) return;

    settings.marketToBank.forEach(bank => {
    const checkbox = document.getElementById(`market-to-${bank.toLowerCase().replace(/\s+/g, '-')}`);
    if (checkbox) checkbox.check
     
    1. APT29388 Topic starter
      Прошлая версия, актуальная в самой теме
  6. vrodefrik
    vrodefrik Mar 24, 2025 похуй, работаем 2286 May 8, 2022
    +rep, накидал челу идей, все реализовал и очень быстро[IMG][IMG][IMG]
     
  7. Coober
    Coober Mar 25, 2025 Путь становится труднее всего за минуту до рассвета. 6227 Apr 11, 2019
    Ну что, пора арбитражником p2p становиться !
    Ждите, дополню отзыв когда по 115 - му ФЗ карту блокнут
     
    1. АртёмАнгел
      Coober, не забудь пополнить депозит на 10к
    2. Coober
  8. Coober
    Coober Mar 25, 2025 Путь становится труднее всего за минуту до рассвета. 6227 Apr 11, 2019
    APT29388
    [IMG]

    Как включить эти процентики брат ! Очень надо, бэмвэ куплю )
     
    1. View previous comments (3)
    2. Darret
      Coober, 115 фз еще ладно, но у тебя будет карьера до 161 фз ☠☠☠
    3. Coober
      Darret, На девушку сделаю карты :owo_type:
    4. Darret
      Coober, я и ей откинул))
  9. ЧАЛЛИК
    ЧАЛЛИК Jun 24, 2025 Лучшие, антиабуз домены - lolz.live/threads/111111 3008 Oct 2, 2022
    Неплохо
     
  10. МиланаХаметова
    МиланаХаметова Jul 11, 2025 https://lolz.live/threads/8885866/ - СКУПОЧКА НФТ ПОДАРОЧКОВ 1098 Jun 19, 2020
    Ого,сохраню
     
Loading...
Top