Я использую такой простейший анализатор 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>
что-то ИИшка говорит что вообще никаких компов для этого не нужно... может мы о разных вещах говорим?
там типа достаточно одного домена и всё если ты владелец домена - то уже можешь майнить
Вот вы и подвели плавно к "майнингу на доменах" - в этом майнинге действительно необходимо лишь подтвердить право владения доменом через 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 аккаунт, такой и платите
Попробуйте https://tools.100zona.com/regular.html
Про звонки конкурентов, которые предлагают свои услуги сразу же посетителям сайта по телефону, я слышал много - от людей, просивших им помочь.
В некоторых случаях. на сайте вообще ничего не было, кроме Я.Метрики.
Ну и в теории, телефоны посетителей сайта может перехватывать сам Я.Браузер (даже если на сайте нет Я.Метрики).
Нет никаких сомнений. что это делается завуалировано через Я.