From 48353d788d267e01e71577ff725dd5b36a2f3659 Mon Sep 17 00:00:00 2001 From: Sascha Leib Date: Fri, 19 Sep 2025 15:08:25 +0200 Subject: [PATCH] Fine-tuning --- admin.php | 4 +- client.js | 13 +++--- config/known-bots.json | 14 +++++- img/bots.png | Bin 9261 -> 10896 bytes img/referers.png | Bin 10643 -> 14023 bytes plugin.info.txt | 2 +- script.js | 98 ++++++++++++++++++++++++----------------- style.less | 6 +++ 8 files changed, 85 insertions(+), 52 deletions(-) diff --git a/admin.php b/admin.php index 6e1b3e1..2869ebd 100644 --- a/admin.php +++ b/admin.php @@ -55,7 +55,7 @@ class admin_plugin_botmon extends AdminPlugin {
Loading …
- Overview + Bots overview
@@ -63,7 +63,7 @@ class admin_plugin_botmon extends AdminPlugin {
- Web metrics (humans only) + Humans’ web metrics
diff --git a/client.js b/client.js index d1f8018..925ffe0 100644 --- a/client.js +++ b/client.js @@ -1,4 +1,4 @@ -botmon_client = { +({ init: function() { /* send the page view request: */ @@ -27,8 +27,8 @@ botmon_client = { 'lg': navigator.language.substring(0,2), 'lt': ( document._botmon ? Date.now() - document._botmon.t0 : null), 'id': (document._botmon.session || 'null').replaceAll('\"', ''), - 'r': document.referrer /*, - 'tz': new Date().getTimezoneOffset(), + 'r': document.referrer, + 'tz': new Date().getTimezoneOffset() /*, 'url': window.location.href, 'scr': screen.width+':'+screen.height, 'l': navigator.languages */ @@ -64,7 +64,7 @@ botmon_client = { + ( sessionId ? '&id=' + encodeURIComponent(sessionId) : '') + ( uid ? '&u=' + encodeURIComponent(uid) : ''); const response = await fetch(url + req, { - /*method: 'HEAD'*/ + method: 'HEAD' }); if (!response.ok) { throw new Error(response.status + ' ' + response.statusText + ' - ' + url); @@ -76,7 +76,4 @@ botmon_client = { // setTimeout(this._onHeartbeat.bind(this, this._src.replace( this._scriptName, '/tick.php')),this._heartbeat * 1000); } } -} - -// init the script: -botmon_client.init(); \ No newline at end of file +}).init(); \ No newline at end of file diff --git a/config/known-bots.json b/config/known-bots.json index 60ca4a5..48b53c1 100644 --- a/config/known-bots.json +++ b/config/known-bots.json @@ -244,10 +244,22 @@ "rx": ["TikTokSpider"], "url": "https://darkvisitors.com/agents/tiktokspider" }, - {"id": "HaloBot", + {"id": "halobot", "n": "HaloBot", "geo": "FR", "r": ["HaloBot"], "rx": [" HaloBot\\/(\\d+)\\."], "url": "https://darkvisitors.com/agents/tiktokspider" + }, + {"id": "wayback", + "n": "Internet Archive", + "r": ["archive.org_bot"], + "rx": [" archive.org_bot "], + "url": "https://archive.org/details/archive.org_bot" + }, + {"id": "alibaba", + "n": "Alibaba AliyunSec Bot", + "r": ["AliyunSecBot"], + "rx": ["AliyunSecBot/Aliyun"], + "url": "https://www.aqtronix.com/useragents/?Action=ShowAgentDetails&Name=AliyunSecBot" } ] \ No newline at end of file diff --git a/img/bots.png b/img/bots.png index 087993f27be2fc97abbf4f0a314c92f1c6a807b0..20bb90a724cc2f984408ffafa3016dde1d4f31d7 100644 GIT binary patch delta 10722 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 diff --git a/img/referers.png b/img/referers.png index ff68e5bee3fa1d9032f44955617aa7343887d32c..1650a2b33ca197e2d4a71c962a09c87dcf13da7c 100644 GIT binary patch delta 13874 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 A*Z=?k delta 10467 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 diff --git a/plugin.info.txt b/plugin.info.txt index ec31480..26588af 100644 --- a/plugin.info.txt +++ b/plugin.info.txt @@ -1,7 +1,7 @@ base botmon author Sascha Leib email ad@hominem.com -date 2025-09-16 +date 2025-09-19 name Bot Monitoring desc A tool for monitoring and analysing bot traffic to your wiki (under development) url https://www.dokuwiki.org/plugin:botmon diff --git a/script.js b/script.js index c957faa..abfdba8 100644 --- a/script.js +++ b/script.js @@ -7,11 +7,18 @@ const BM_USERTYPE = Object.freeze({ 'UNKNOWN': 'unknown', 'KNOWN_USER': 'user', - 'HUMAN': 'human', + 'PROBABLY_HUMAN': 'human', 'LIKELY_BOT': 'likely_bot', 'KNOWN_BOT': 'known_bot' }); +// enumeration of log types: +const BM_LOGTYPE = Object.freeze({ + 'SERVER': 'srv', + 'CLIENT': 'log', + 'TICKER': 'tck' +}); + /* BotMon root object */ const BotMon = { @@ -189,7 +196,7 @@ BotMon.live = { // are all the flags set? if (data._dispatchBotsLoaded && data._dispatchClientsLoaded && data._dispatchPlatformsLoaded && data._dispatchRulesLoaded) { // chain the log files loading: - BotMon.live.data.loadLogFile('srv', BotMon.live.data._onServerLogLoaded); + BotMon.live.data.loadLogFile(BM_LOGTYPE.SERVER, BotMon.live.data._onServerLogLoaded); } }, // flags to track which data files have been loaded: @@ -203,7 +210,7 @@ BotMon.live = { //console.info('BotMon.live.data._onServerLogLoaded()'); // chain the client log file to load: - BotMon.live.data.loadLogFile('log', BotMon.live.data._onClientLogLoaded); + BotMon.live.data.loadLogFile(BM_LOGTYPE.CLIENT, BotMon.live.data._onClientLogLoaded); }, // event callback, after the client log has been loaded: @@ -211,7 +218,7 @@ BotMon.live = { //console.info('BotMon.live.data._onClientLogLoaded()'); // chain the ticks file to load: - BotMon.live.data.loadLogFile('tck', BotMon.live.data._onTicksLogLoaded); + BotMon.live.data.loadLogFile(BM_LOGTYPE.TICKER, BotMon.live.data._onTicksLogLoaded); }, @@ -237,8 +244,8 @@ BotMon.live = { _visitors: [], // find an already existing visitor record: - findVisitor: function(visitor) { - //console.info('BotMon.live.data.model.findVisitor()'); + findVisitor: function(visitor, type) { + //console.info('BotMon.live.data.model.findVisitor()', type); //console.log(visitor); // shortcut to make code more readable: @@ -246,34 +253,36 @@ BotMon.live = { const timeout = 60 * 60 * 1000; // session timeout: One hour - // loop over all visitors already registered: - for (let i=0; i 3 ? '.' + tld : '' ) ); + refId = ( tld == 'localhost' ? tld : hArr[hArr.length-2]); refName = hArr[hArr.length-2] + '.' + tld; } @@ -757,7 +775,7 @@ BotMon.live = { case BM_USERTYPE.KNOWN_USER: arr = me._countries.user; break; - case BM_USERTYPE.HUMAN: + case BM_USERTYPE.PROBABLY_HUMAN: arr = me._countries.human; break; case BM_USERTYPE.LIKELY_BOT: @@ -803,7 +821,7 @@ BotMon.live = { case BM_USERTYPE.KNOWN_USER: arr = me._countries.user; break; - case BM_USERTYPE.HUMAN: + case BM_USERTYPE.PROBABLY_HUMAN: arr = me._countries.human; break; case BM_USERTYPE.LIKELY_BOT: @@ -1445,14 +1463,14 @@ BotMon.live = { // register the visit in the model: switch(type) { - case 'srv': + case BM_LOGTYPE.SERVER: BotMon.live.data.model.registerVisit(data, type); break; - case 'log': + case BM_LOGTYPE.CLIENT: data.typ = 'js'; BotMon.live.data.model.updateVisit(data); break; - case 'tck': + case BM_LOGTYPE.TICKER: data.typ = 'js'; BotMon.live.data.model.updateTicks(data); break; @@ -1538,7 +1556,7 @@ BotMon.live = { // update known bots list: const botElement = document.getElementById('botmon__botslist'); /* Known bots */ if (botElement) { - botElement.innerHTML = `
Known bots (top ${maxItemsPerList})
`; + botElement.innerHTML = `
Top visiting bots:
`; let botList = BotMon.live.data.analytics.getTopBots(maxItemsPerList); botList.forEach( (botInfo) => { @@ -1567,7 +1585,7 @@ BotMon.live = { // update the top bot countries list: const botCountries = document.getElementById('botmon__today__countries'); if (botCountries) { - botCountries.appendChild(makeElement('dt', {}, `Bot Countries (top ${maxItemsPerList})`)); + botCountries.appendChild(makeElement('dt', {}, `Top bot Countries:`)); const countryList = BotMon.live.data.analytics.getCountryList('likely_bot', 5); countryList.forEach( (cInfo) => { const cLi = makeElement('dd'); @@ -1582,7 +1600,7 @@ BotMon.live = { if (wmoverview) { const bounceRate = Math.round(data.totalVisits / data.totalPageViews * 100); - wmoverview.appendChild(makeElement('dt', {}, "Overview")); + wmoverview.appendChild(makeElement('dt', {}, "Visitor overview")); for (let i = 0; i < 3; i++) { const dd = makeElement('dd'); let title = ''; @@ -1805,7 +1823,7 @@ BotMon.live = { const platformName = (data._platform ? data._platform.n : 'Unknown'); const clientName = (data._client ? data._client.n: 'Unknown'); - const sumClass = ( data._seenBy.indexOf('srv') < 0 ? 'noServer' : 'hasServer'); + const sumClass = ( data._seenBy.indexOf(BM_LOGTYPE.SERVER) < 0 ? 'noServer' : 'hasServer'); const li = make('li'); // root list item const details = make('details'); @@ -1868,8 +1886,8 @@ BotMon.live = { } // referer icons: - if ((data._type == BM_USERTYPE.HUMAN || data._type == BM_USERTYPE.LIKELY_BOT) && data.ref) { - const refInfo = BotMon.live.data.analytics.getRefererInfo(new URL(data.ref)); + if ((data._type == BM_USERTYPE.PROBABLY_HUMAN || data._type == BM_USERTYPE.LIKELY_BOT) && data.ref) { + const refInfo = BotMon.live.data.analytics.getRefererInfo(data.ref); span1.appendChild(make('span', { 'class': 'icon_only referer ref_' + refInfo.id, 'title': "Referer: " + data.ref diff --git a/style.less b/style.less index 55a86e5..944bc56 100644 --- a/style.less +++ b/style.less @@ -51,6 +51,8 @@ &.bot_claude::before { background-position-y: -160px } &.bot_applemsgs::before { background-position-y: -180px } &.bot_reddit::before { background-position-y: -200px } + &.bot_wayback::before { background-position-y: -220px } + &.bot_alibaba::before { background-position-y: -241px } &.bot_other::before { background-image: url('img/more.svg') } /* platform icons */ @@ -333,6 +335,7 @@ &.ctry_nu::before { background-position-y: -4941px } &.ctry_local::before { background-image: url('img/addr.png') } /* localhost */ + &.ctry_other::before { background-image: url('img/more.svg') } /* other countries */ /* Session icons */ &.session::before { background-image: url('img/idtyp.png') } @@ -358,6 +361,9 @@ &.ref_yandex::before { background-position-y: -160px } &.ref_chatgpt::before { background-position-y: -180px } &.ref_brave::before { background-position-y: -200px } + &.ref_wikipedia::before { background-position-y: -220px } + &.ref_denkfehler::before { background-position-y: -240px } + &.ref_fallacies::before { background-position-y: -260px } &.ref_other::before { background-image: url('img/more.svg') } }