Changeset bb82e7f in Klonkt
- Timestamp:
- 06/20/2026 12:29:15 PM (3 months ago)
- Branches:
- main
- Children:
- bc83cc8
- Parents:
- 92bad27
- Location:
- src
- Files:
-
- 2 edited
-
services/StatsService.js (modified) (3 diffs)
-
views/pages/admin-stats.ejs (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/StatsService.js
r92bad27 rbb82e7f 45 45 } 46 46 47 // Bekende bots/crawlers + link-preview-fetchers + scripts overslaan, zodat ze de 48 // weergaven/bezoeker-dagen niet opblazen. Geen UA = vrijwel altijd geautomatiseerd. 49 const BOT_RE = /bot|crawl|spider|slurp|mediapartners|bingpreview|facebookexternalhit|whatsapp|telegram|discord|twitter|linkedin|embedly|pinterest|redditbot|applebot|petalbot|yandex|baidu|duckduckbot|semrush|ahrefs|mj12|dotbot|uptimerobot|pingdom|statuscake|headless|lighthouse|gptbot|claude|ccbot|perplexity|bytespider|amazonbot|googleother|google-read-aloud|python-requests|scrapy|curl|wget|axios|node-fetch|go-http|java\/|okhttp|libwww|httpclient/i; 50 function isBot(req) { 51 const ua = (req && req.headers && req.headers['user-agent']) || ''; 52 if (!ua) return true; // lege UA = script/bot 53 return BOT_RE.test(ua); 54 } 55 47 56 // Lazy prepares — tabellen bestaan pas ná initializeDatabase(); dit module wordt 48 57 // geïmporteerd vóór die call. … … 81 90 82 91 export function recordPageview(siteId, req) { 83 if (!siteId || isOperator(req) ) return;92 if (!siteId || isOperator(req) || isBot(req)) return; 84 93 try { 85 94 const d = today(); … … 91 100 92 101 export function recordPostView(post, req) { 93 if (!post || !post.id || isOperator(req) ) return;102 if (!post || !post.id || isOperator(req) || isBot(req)) return; 94 103 try { 95 104 stmts().bumpPost.run(post.id); -
src/views/pages/admin-stats.ejs
r92bad27 rbb82e7f 3 3 <h1>Statistieken</h1> 4 4 <p class="stats-note">Cookievrij gemeten — geen tracking-cookies, geen toestemmingsbanner. 5 Unieke bezoekers via een dagelijks roterende, anonieme hash (IP/browser worden niet bewaard).6 Je eigen beheerder-bezoekentellen niet mee.</p>5 Bezoekers worden per dag geteld via een dagelijks roterende, anonieme hash (IP/browser worden 6 niet bewaard). Je eigen beheerder-bezoeken en bekende bots/crawlers tellen niet mee.</p> 7 7 8 8 <% var s = stats; var _max = Math.max(1, ...s.series.map(function(d){ return d.pageviews; })); %> 9 9 10 10 <div class="stats-cards"> 11 <div class="stat-card"><div class="stat-num"><%= s.totals.visitors %></div><div class="stat-label">Bezoeker s(<%= s.days %>d)</div></div>11 <div class="stat-card"><div class="stat-num"><%= s.totals.visitors %></div><div class="stat-label">Bezoeker-dagen (<%= s.days %>d)</div></div> 12 12 <div class="stat-card"><div class="stat-num"><%= s.totals.pageviews %></div><div class="stat-label">Weergaven (<%= s.days %>d)</div></div> 13 13 <div class="stat-card"><div class="stat-num"><%= s.totals.plays %></div><div class="stat-label">Plays (totaal)</div></div> … … 18 18 <p class="stats-note">All-time: <strong><%= s.allTime.pageviews %></strong> weergaven · <strong><%= s.allTime.visitorDays %></strong> bezoeker-dagen.</p> 19 19 <% } %> 20 21 <details class="stats-help"> 22 <summary>Wat betekenen deze cijfers?</summary> 23 <ul> 24 <li><strong>Bezoeker-dagen</strong> — het aantal unieke bezoekers <em>per dag, bij elkaar opgeteld</em>. Eén persoon die 5 dagen langskomt = 5 bezoeker-dagen. Cookieloos kan er niet over dagen heen geteld worden, dus dit is géén aantal unieke personen — het echte aantal mensen ligt (vaak fors) lager.</li> 25 <li><strong>Weergaven</strong> — hoe vaak de home/feed of een post geladen is (ook bij klikken binnen de site). Andere pagina's (agenda, downloads, links) tellen hier niet in mee.</li> 26 <li><strong>Plays</strong> — totaal aantal keren dat een track is gestart.</li> 27 <li><strong>Post-weergaven</strong> — totaal over alle posts samen.</li> 28 </ul> 29 <p>Beheerder-bezoeken en bekende bots/crawlers worden overgeslagen. Het ruwe IP wordt nooit bewaard. Goed voor trends; neem absolute aantallen met een korrel zout.</p> 30 </details> 20 31 21 32 <div class="stats-period"> … … 30 41 <h2>Laatste <%= s.days %> dagen</h2> 31 42 <div class="stats-legend"> 32 <span class="lg lg-vis">Bezoeker s</span>43 <span class="lg lg-vis">Bezoeker-dagen</span> 33 44 <span class="lg lg-pv">Weergaven</span> 34 45 </div> … … 40 51 var visPct = Math.round(d.visitors / _max * 100); 41 52 %> 42 <div class="sc-col" title="<%= d.day %> — <%= d.pageviews %> weergaven, <%= d.visitors %> bezoeker s">53 <div class="sc-col" title="<%= d.day %> — <%= d.pageviews %> weergaven, <%= d.visitors %> bezoeker-dagen"> 43 54 <div class="sc-bar"> 44 55 <span class="sc-pv" style="height: <%= pvPct %>%"></span>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)