Вячеслав Скоблей

Вячеслав Скоблей
Рейтинг
109
Регистрация
31.07.2012
Должность
Типичный интернетчик
Вячеслав Скоблей (ака FILES) - типичный интернетчик

Я использую такой простейший анализатор access.log файлов, для выявления проблемных UА і IP (более 200 запросов в минуту - можно уменьшить под себя). Может кому пригодиться.



Сохраняем файл, например, index.html и запускаем в своем браузере

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Log Dashboard (Drag & Drop)</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
body {font-family:Arial; background:#f4f6f9; padding:20px;}
.dropzone {
    border:2px dashed #aaa;
    padding:40px;
    text-align:center;
    border-radius:12px;
    background:#fff;
    cursor:pointer;
    transition:0.3s;
}
.dropzone.dragover {
    border-color:#4361ee;
    background:#eef2ff;
}
.card {background:#fff; padding:20px; border-radius:12px; margin-top:20px;}
.grid-2 {display:grid; grid-template-columns:1fr 1fr; gap:20px;}
.grid-3 {display:grid; grid-template-columns:1fr 1fr 1fr 1fr; gap:20px;}
table {width:100%; border-collapse:collapse;}
th,td {padding:8px; border-bottom:1px solid #ddd; font-size:13px;}
textarea {width:100%; height:120px;}
</style>
</head>

<body>
<div class="dropzone" id="dropzone">
    📂 Перетащи сюда access.log или кликни
    <input type="file" id="fileInput" hidden>
</div>

<div id="app" style="display:none;">

<div class="grid-2">
    <div class="card">
        <h3>Status Codes</h3>
        <canvas id="statusChart"></canvas>
    </div>
<div class="card">
        <h3>Total Requests: <span id="total"></span></h3>
        <canvas id="hourChart"></canvas>
        <h3>🚨 Burst IP (200+ req/min)</h3>
        <textarea id="burstBox"></textarea>
    </div>
</div>
<div class="grid-3">
    <div class="card"><h3>Top IP</h3><table id="ipTable"></table></div>
    <div class="card"><h3>Top Agents</h3><table id="agentTable"></table></div>
    <div class="card"><h3>Top URL</h3><table id="urlTable"></table></div>
    <div class="card"><h3>Top 404</h3><table id="errTable"></table></div>
</div>
</div>
<script>
const dropzone = document.getElementById('dropzone');
const fileInput = document.getElementById('fileInput');
dropzone.addEventListener('click', () => fileInput.click());
dropzone.addEventListener('dragover', e => {
    e.preventDefault();
    dropzone.classList.add('dragover');
});

dropzone.addEventListener('dragleave', () => {
    dropzone.classList.remove('dragover');
});

dropzone.addEventListener('drop', e => {
    e.preventDefault();
    dropzone.classList.remove('dragover');
    handleFile(e.dataTransfer.files[0]);
});

fileInput.addEventListener('change', e => {
    handleFile(e.target.files[0]);
});

function handleFile(file){
    const reader = new FileReader();

    reader.onload = function(){
        const lines = reader.result.split('\n');
        const pattern = /^(\S+) \S+ \S+ \[([^\]]+)\] "(\S+) (\S+) (\S+)" (\d{3}) .* "([^"]*)"$/;
        let logs = [];
        lines.forEach(line=>{
            let m = line.match(pattern);
            if(m){
                logs.push({
                    ip: m[1],
                    datetime: m[2],
                    url: m[4],
                    status: m[6],
                    agent: m[7]
                });
            }
        });
        process(logs);
        document.getElementById('app').style.display = 'block';
    };

    reader.readAsText(file);
}

function process(logs){
    let statusStats={}, ipStats={}, agentStats={}, urlStats={}, err404={}, hourStats=Array(24).fill(0), minuteStats={};
    logs.forEach(l=>{
        statusStats[l.status]=(statusStats[l.status]||0)+1;
        ipStats[l.ip]=(ipStats[l.ip]||0)+1;
        agentStats[l.agent]=(agentStats[l.agent]||0)+1;
        urlStats[l.url]=(urlStats[l.url]||0)+1;

        if(l.status==404) err404[l.url]=(err404[l.url]||0)+1;

        let h=l.datetime.match(/:(\d{2}):/);
        if(h) hourStats[+h[1]]++;

        let m=l.datetime.match(/:(\d{2}:\d{2}):/);
        if(m){
            let minute=m[1];
            if(!minuteStats[minute]) minuteStats[minute]={};
            minuteStats[minute][l.ip]=(minuteStats[minute][l.ip]||0)+1;
        }
    });

let burstSet = new Set();
for(let minute in minuteStats){
    for(let ip in minuteStats[minute]){
        if(minuteStats[minute][ip] >= 200){
            burstSet.add(ip);
        }
    }
}
let burst = Array.from(burstSet);

    document.getElementById('burstBox').value =
        burst.map(ip=>"Deny from "+ip).join("\n");

    document.getElementById('total').innerText = logs.length;

    new Chart(statusChart, {
        type:'pie',
        data:{labels:Object.keys(statusStats), datasets:[{data:Object.values(statusStats)}]}
    });

    new Chart(hourChart, {
        type:'bar',
        data:{labels:[...Array(24).keys()], datasets:[{data:hourStats}]}
    });

function fill(el, data, type){
    let html = "";

    Object.entries(sort(data)).slice(0,30).forEach(([k,v]) => {

        let key = k;
        // 🔴 подсветка burst IP
        if(type === 'ip' && burstSet.has(k)){
            key = `<span style="color:red;font-weight:bold">${k}</span>`;
        }
        if(type === 'ip'){
            key = `<a href="https://ipinfo.io/${encodeURIComponent(k)}" target="_blank" rel="noopener noreferrer">${key}</a>`;
        }
        html += `<tr><td>${key}</td><td>${v}</td></tr>`;
    });
    el.innerHTML = html;
}
fill(ipTable, ipStats, 'ip');
fill(agentTable, agentStats);
fill(urlTable, urlStats);
fill(errTable, err404);
}
function sort(obj){
    return Object.fromEntries(
        Object.entries(obj).sort((a,b)=>b[1]-a[1])
    );
}
</script></body></html>
vovchansky #:

что-то ИИшка говорит что вообще никаких компов для этого не нужно... может мы о разных вещах говорим?

там типа достаточно одного домена и всё если ты владелец домена - то уже можешь майнить

Вот вы и подвели плавно к "майнингу на доменах" - в этом майнинге действительно необходимо лишь подтвердить право владения доменом через TXT запись в DNS.

В основе этой затеи лежит токен Domain (DMN) с нулевой капитализацией.  Соответственно. и платить за такой "майнинг" нечем. 

У меня реализовано так. В блоке стоит код рекламы и если по какой-то причине рекламы нет (высота контейнера = 0), то показываю свой баннер:

<script>
setTimeout(function () {
    var container = document.querySelector("#blok");

    if (container.clientHeight == 0) {

//если в контейнере ничего нет, то делаете то, что вам нужно

         }

}, 2000);
</script>

Майнить можно, если большой трафик (вы майните в таком случае не на домене, а на устройстве пользователя). И то не долго - пару дней от силы, домен вылетает из поиска как вирусный.

Разработчики из России могут регистрироваться в Google Play Console, но сталкиваются с ограничениями по оплате и распространению платных приложений из-за санкций.

1) Для начала привяжите платежную карту в аккаунт Google (если ее приняло, дает возможность платить - значит все ОК)

2) Везде указываете свой адрес, так как его попросят подтвердить документально.

3) Если пройдете этот квест, вас ждет следующий: все новые аккаунты проходят закрытое тестирование приложений (минимим 12 человек на протяжении 14 дней)

Аккаунт разработчика в Google Play Console попросит у вас:

- адрес проживания (подтвердить его документами)

- какой картой платить? Без разницы в принципе, какую привяжете в Google аккаунт, такой и платите

BrickLayer #:
А делистинга всё нет и нет. Тем временем в GoGetlinks нет ни USDT ни USTC
Есть USDC, но этот метод вывода то включается, то выключается
sotex2 #:
Всем спасибо, регулярка работает. не могли бы вы еще подсказать, есть ли такие сервисы, где вбиваешь нужный код html и прописываешь, что нужно вытащить и создавалась бы готовая регулярка

Попробуйте https://tools.100zona.com/regular.html

В госуслугах (в некоторых странах)

Про звонки конкурентов, которые предлагают свои услуги сразу же посетителям сайта по телефону, я слышал много - от людей, просивших им помочь.

В некоторых случаях. на сайте вообще ничего не было, кроме Я.Метрики. 

Ну и в теории, телефоны посетителей сайта может перехватывать сам Я.Браузер (даже если на сайте нет Я.Метрики). 

Нет никаких сомнений. что это делается завуалировано через Я.

Всего: 141