Доброго всем дня!
Тема будет полезна для всех кто пользуется сервисом Паши Дурова telegra.ph рекламируется, для HR, в общем для всех кто гонит трафик через переходники на telegra.ph и просто любопытствующих как я)
Тут на днях бс запостил в лурке новую страницу с ссылками и мне стало любопытно как ужасающе мало траффика можно наковырять в лурке, где в рулетке в группе бс до сих пор не может набраться 70 человек, короче написал на js и выкладываю для всех кому может быть полезно букмарклет/юзерскрипт показывающий всю возможную информацию:
- Просмотры за год + навигация по годам, если страница была создана не в текущем году
- Дата создания страницы + дата внесения изменений
- Строит график просмотров по месяцам + выводит сумму просмотров
Зачем смотреть статистику?
Часто в даркнете нету привычных в обычном вебе инструментов типа яндекс метрики, тут больший процент юзеров без js, часто ссылки не отловятся по реферреру потому что они вообще не ссылки, а текст и написанны через пробел, пользователь их потом сам вбивает в адресную строку, а понимать хотя бы динамику просмотров - это уже что-то
Код в одну строку, готовый к переносу на панель закладок:
javascript:(async()=>{const API_BASE_URL='https://api.telegra.ph/getViews',MONTHS_RU={'01':'Январь','02':'Февраль','03':'Март','04':'Апрель','05':'Май','06':'Июнь','07':'Июль','08':'Август','09':'Сентябрь','10':'Октябрь','11':'Ноябрь','12':'Декабрь'},CHART_CONFIG={type:'bar',options:{responsive:!0,maintainAspectRatio:!1,scales:{y:{beginAtZero:!0}}}},getTimeElapsed=a=>{const b=new Date-a,c=Math.floor(b/864e5),d=Math.floor(b%864e5/36e5);return 0<c?`${c} дн, ${d} ч назад`:`${d} ч назад`},createNavLinks=(a,b)=>{const c=new Date().getFullYear()===parseInt(a),d=parseInt(a)>parseInt(b),e=`${window.location.origin}${window.location.pathname}?year=${a-1}`,f=`${window.location.origin}${window.location.pathname}?year=${parseInt(a)+1}`;return`${d?`<a href="${e}" class="nav-link">← ${a-1}</a>`:'<a></a>'}; <a href="https://donate.torsha.re" class="nav-link">Нужна ваша поддержка</a>${!c?`<a href="${f}" class="nav-link">${parseInt(a)+1} →</a>`:'<a></a>'};`},createExpandableDiv=()=>{const a=document.createElement('div');return a.className='expandableDiv',a.id='expandableDiv',a},createHeader=()=>{const a=document.createElement('div');return a.className='header',a.id='torshare_head',a.innerHTML='<img id="torshare" src="data:image/png;base64,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"><h3 id="title_text">API Telegra.ph</h3>',a},fetchViews=async(a,b)=>{try{return await fetch(`${API_BASE_URL}?path=${a}&year=${b}`,{headers:{Authorization:'Bearer 123'}}).then(a=>a.json())}catch(a){console.error('Error fetching views:',a)}},generateRandomGradient=()=>{const a=Math.floor(360*Math.random()),b=(a+60)%360,c=(b+120)%360;return`linear-gradient(45deg, hsl(${a},100%,50%), hsl(${b},100%,50%), hsl(${c},100%,50%))`};const header=createHeader(),expandableDiv=createExpandableDiv(),gradButton=document.getElementById('gradButton'),generateChart=async()=>{try{const a=await fetchViews('test',new Date().getFullYear()),b=a.data.views.map(a=>a.date.split('-').slice(0,2).join('.')).map(a=>`${MONTHS_RU[a.slice(3,5)]} ${a.slice(0,4)}`),c=a.data.views.map(a=>a.views),d=document.getElementById('myChart').getContext('2d');new Chart(d,{...CHART_CONFIG,data:{labels:b,datasets:[{label:'Просмотры',data:c}]}})}catch(a){console.error('Error generating chart:',a)}};gradButton.onclick=()=>{document.body.style.background=generateRandomGradient()},document.body.append(header,expandableDiv),generateChart()})();
Код целиком (можно юзать в kiwi браузере или для tempermonkey)
:
javascript: (function () {
const API_BASE_URL = 'https://api.telegra.ph/getViews';
const MONTHS_RU = {'01': 'Январь', '02': 'Февраль', '03': 'Март', '04': 'Апрель', '05': 'Май', '06': 'Июнь','07': 'Июль', '08': 'Август', '09': 'Сентябрь', '10': 'Октябрь', '11': 'Ноябрь', '12': 'Декабрь'};
const CHART_CONFIG = {type: 'bar', options: {responsive: true, maintainAspectRatio: false,scales: { y: { beginAtZero: true}}}};
const getTimeElapsed = (dateString) => {
const diffMs = new Date() - new Date(dateString);
const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
const hours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
return days > 0 ?
${days} дн, ${hours} ч назад:
${hours} ч назад;
};
const createNavLinks = (currentYear, creationYear) => {
const isCurrentYear = new Date().getFullYear() === parseInt(currentYear);
const showPrevYear = parseInt(currentYear) > parseInt(creationYear);
const prevYearUrl =
${window.location.origin}${window.location.pathname}?year=${currentYear - 1};
const nextYearUrl =
${window.location.origin}${window.location.pathname}?year=${parseInt(currentYear) + 1};
return
${showPrevYear ? <a href="${prevYearUrl}" class="nav-link">← ${currentYear - 1}</a>
: '<a></a>'}; <a href="https://donate.torsha.re" class="nav-link">Нужна ваша поддержка</a>${!isCurrentYear ? <a href="${nextYearUrl}" class="nav-link">${parseInt(currentYear) + 1} →</a>
:'<a></a>'};;};
const createExpandableDiv = () => {
const div = document.createElement('div');
div.className = 'expandableDiv';
div.id = 'expandableDiv';
return div;
};
const createHeader = () => {
const header = document.createElement('div');
header.className = 'header';
header.id="torshare_head";
header.innerHTML =
<img id="torshare" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABSCAYAAADuIulwAAAcJ0lEQVR4Ae1dB3hUxdpeMASkhI6hRHqVgBSl1909exIgChIFaVJMoUkTUHJ2F6SjcEXJ2ZMgXPsVSxJAEAtI0yvCb8EuVbzXglcsQMBfmf9/B2bvycmWs2d3w+4yeZ48c2bOlG/eOefdmTnf943JxP84AhwBjgBHgCPAEeAIcAQ4AhGLwK5dzriZWwY2jFgBuWAcAY4ARwAITN6Vmji5wDqXo8ER4AhwBCIagWnbLN2zCyxbnLvuqRTRgnLhOAIcgWsbgczN1pHZBeYT9xWl3aBGYsK+tGqTt5jvQqhO59ccAY4AR+CqIJBdJORkF1j/mvKKuQcTIGOH0CaryPJMZpHlZNZWoT1L5yFHgCPAEShTBGYUiE1Yg9mFwqqsQgvJLhCmIW3ia+m1MousMggss8h6TJ2XleEhR4AjwBEoEwSwP4XlHxrL2ipMoGRVaH0N8YytlkHZRdafLxOY9TA24MtEKN4IR4AjwBHwhEDGFuH+yQXWm6cWiP0vz6LMv2W83Kd+ZqHVDqLCf2ah5eMZBbfX8FSep3EEOAIcgTJBYNq2aRWzCyxHx29LqZtZYP3P5dmVZXxWkflFRlZZhebjfGZVJsPBG+EIcAR8ITClyDwuu8halFloWUvJqsj69eTNlmWMrLILLD9lbzU381UHv8cR4AhwBMoEgewi67vZBZbczALrn5SkCqwvMLLKLLKey9wyoGOZCMIb4QhwBDgCvhDIeNWSfGVW9S+EIK3MInMxvS4yX8osEqy+yvN7HAGOAEegzBDIKjKvYLOpUmGBdXaZCcIb4ghwBDgC/hDIKjJ/Woqo6BdBc4G/svw+R4AjwBEoMwQmvJ7WwBNZZRdYD8/clH59mQnCG+IIcARCi4AkKJfsNheJlH9JzJscbA8zCswZWsLKLDSfmbRjSNNg646V8hvv2VjJyJgvFjb0jBUMeD+iEIFYJCx8GSxNWLaxUTg8YROZE1bYoOUVhxOBWCEsQk7WZDhlF1jfVhNWZqH1TXaPh5cR4ITFn4SoRCBWCOvgB6+/ev7isReLi08MzC6w/sAIK7vA/Dv3Jlr60eSEVRoTnhIFCMQIYVWKi4srbndTK/LIagc59d3Bb177Iu/g7K23XcwqsmRHwTCUuYicsMocct5gKBCIEcIy1aiRsHr6fZPIiJG3kypVKpMJE0eQEWkjj0zoNl95IH1T3VBgFUt1cMKKpdG8hvoSK4RlMpkaJXdo+8e5C8fIV0ffIVOmjSfly5e/VLvyDaRbU/Nuk8lU9RoaVr9d5YTlFyKeIRIRiCHCMjVuknTu/UOvEZAW/oU+4rHujS0k/rqK500mE/65DtaVh5ATViS+jVwmvwjEEmENSbP9vECa4SasYdZhR6f2WUS6NzF/ZjKZTvsF4xrKwAnrGhrsWOpqrBAWIaTK1GkT/7hn/F1uwhp359hj426dTXo3T7loMpl+iaVxC7YvnLCCRZCXvyoIxAphnSs+/uSdd6WRzOyxlLDOFh8lKxY6T93WfhzBf7ly5YjJZGp7VUCOwEY5YUXgoHCR/CMQ7YRFyG91zl04vh17VnXq1CJ/e3QR+e3c1+SnM5+Rz7/aS5Lrdz07d+BqEle+AmlZJ/lUzuCNLf2jEvs5OGHF/hjHZA+N2JOFs4xkc2XpBbq4+NsBZ4uP/gCymnN/Nmneogn5/sePyRdf7SXf/OsQnWl1bt3lzzkDHib9mg+is6xxt8wiDtG1Sm8bocq3ONXV15kiL3IKistuk1+yi8qbdkHZ7BTlp5xi3tqFVnloqNrSU49hwrLkdmf151jWtbWL+RMdorwMfaH9ERSXlJI/Y8WwZxqxfOEMl9iUzvYU1zyHID8KLO2ishXYSqLysmSTn3CIeY/YRXnmEjG/Qzjl8FX3opT1nSTRleMQXOucNuUfkii/IQmuVyWb/CzSAnnmte0ssijJktU1y2FT1jgF+e+SKBdJgvyWXXC94hRc6/Gs21Nd42NGtedy5+S37YKOf4NG0g6b/LWu+gX57RwxN007KJ7iZ//36APnLx7/c/e+ApLcoS3VvfrgozfInn2F5PfzR8jxbw6QX37/kmze+iTp1rQ/Ne5OqtGMVIyrRNJvziCSqPzmtLoWeqo7VGkPDXmqqVNQVkui8m9/JI+HLdh2lQylspSyoZ/TJt8JI3K8JE5RdrL/nJT84ayNYAhrqfnJ2k6bK89fn+iLaZV7sTZDFS4VlDb0ZRTkH/zJoL7vEJVTKCeZN94SKlm81QOM7FZFcojKl2oZPF1LgnzQWz2e0pea81rhh0+yyd94qs9rmigfsKcoszH2nuqNuTRJUM56BcMHmUkp8tRQgUHI0ernLh7bgiUfdK2wN9WgwQ1k7ztFdEb13D9yaQiy+uzLPfS6T49eJLuXg8y3PEpurNmClundTKQkJgnK93bBdVeo5EM9y8y5zSRBeToQrIwS1vzeuTXtgrzAISp7/bWHX3fWT6OE5bTJuZIo/+yvLfV9YMHaDSZ8eIhSBzMSdd3Gr5WdTqsiBCOPp7Kr0zfVwmzHISjFemXTS1iYJYWi/5ToxHx69J2nPsRMmkNUzukdBHW+UBHWWXL85vPFR0/u3P0yadrsRko8VqEvOXHqfUpMv579iuS6ltNrLBMPHNpOrz/9YjdpWq8VkQSZktSgdqNIxbjrSa3K9cjYW2YSySYTh1XZu2roU/WCHSzJKvdyCMoZdf/1XAdKWCvSiqo5rXnLHYL8u576kUcSXS+w/hklLL1tafNJomtXML/smB06RPlXbb3BxiWb60mGSbAh/aESlSOByqSHsJxW1+hAxlqXDIJr34LU9Y2D7XfElr+ahFVcfGISSGje/KmUqGrWrEE2/H2Nm5xwT1ZWkKPH/+lO27Ltaff1jKxpxNbmTrffr/sHPkLaJXahdd2U2JXMHvAwiOvHxamurkYHAPtQuh4UD7PRQAhrsSW3u0N0HQ+0ratJWJDVKSgrjWCLcoH2NZD8DkF+N9g9HuylSYL8UyDtsrz+CAt7nCxvqEP6IxDiFYaRMQ5LmatFWOeKTy798sh+0r17Z0owbdq2cC/3QFT4//a7D8h9M+91ExTS1m9Y7Y5j9tWoVlPygGWtm7Qw+HfenEkqx1el/3d3nnr5nlVJDxTAJYPWtw9kGaB98PQSlt2WN0ZbVm/8ahMW5Az0B4HusXogeL191ptPEpRjWM4FOu7Ij/0qSXB9q7ctbT5vhLVqzFNV7IJrnzZ/OOJOm7LYSN8juozhF1JwTTPaMehXHTi4ndSuXdO9BPzh9GE3EYGYMKsanj6Y/PuHD0ukb3opj+y7sreFfJNHTykxy2IDj9lW63odaf23JPUnD1ge/yOQF2tm+qbr6YeFIF4sPYQl2XL7SILyB5M74FBUNrFxKOsloVtWUdnKZPAX0q+pQWDqblNnHQ5B2U1MpLw/ubT3sdwNtC11foeoHNLWaTKRcnab63V1vrBfC/Ko0nJEcUpZE9b5i8c27drzMqlStTIlk5mzMkoQEkjIlbeCQGH02In3St3D/ezJ49zp35z8gDSs3qTEDEv9EIht76LtNKnVithtypmVqRsT9QwX1BXU9Ri59kdYlBRF5bSRut1lIoCwHKL8FzbP/eEqpeTZ3XLrJJxQ5IcahD/Z1PftViU92HY9EZbTJj8cbL2BlsePYSA/1GocIvK6rAiLEFIezvj+eeBVUi2hKiWRJzb+d3kHIjrz2xdkytTxZOnyB92EhHTtf+HmjeT1N19wp3do2oVM6b3IK2lhWYgvj9jXkqyuXf4GAtN2I5vs2ofJH2E5UpQV2jIBxyOAsKjMqa7xvnBdNPiJjgH3LYSktsiWd5Mv+dT3JFH5JFhZtYSFmXSwdRot7xDko0ZmmWpMIuZaEuTzRoAI9Cvh+YsnVh07+R6pW7c2JawdbzzvJhwQ0s63XyKZWWPI4c92lUhnZAWVBqY4irSsK+Y6uJ6dPYMIrYd7JSz0b0j7MZS0oPqQI+an+hoAScibYwQTbRlfhIWvl9r8huIRQliOlDzZF6YOm7zfUP9CRFqS4HrRl3zsnjPVJYZCTu0eliQoH4eiXqN1BKPIyrCJiLAsNt2Li0+aQSw9enalpPHW2y+5SQn2gXPnTyH3Zowi2ERnBKUNsTz86sh+8q/vL+9pYS/rlcInaP69+zaTtjd09klYGOieTQXa/qTu83/2Bb5DlD8y+mCoy/kirGC+PqrbiIRNd8ijnVGo8Q3FEkvdZ6PXUM5Uy+Xp2im6njFav7qcmrCcQt4E9b2Ar0X5ALT+JVHOdwjKBwGXp+Mjf4ctCE99jqq0cM+wCCGVzxYf+x7qCliWrZOXlSClCRNHkkcfe6hEmpasvvx6H51dITz04es0L4hu2B2p9PrnXz8n1SvX8ktYGOiESjVJg4TGZKEt/zZPA4WvSkYeCE9lfBEWNX0JxewhUmZYgnLGE55Ig4qBJ3zKOs2RIi/xJiNL12PBoEduNWE5bMrnespo8zgE+fACYV0Sk42FTqt8jzavrngsbMCHe4Z14cLJ+0BAsAmECoOajB5YMJ28+HJ+iTT1fXb95NNraR7MrtT5Vz1iJ6++9gy9l1i7PpnRb5lf0rqj4yRKnELb9K/YA6AOYUaka/B1kI0vwoJdWCjaiZQZFvqixpFdr0h7vkEo+hmSOgTln0wuTyHMrkLSDhR6r5jmUNtMHc+Ktl2UX5e+yatHXYeQ95C2jL+4U3Q956nfUZUWbsI6f+H40WefX0dJ4s2dm9zk9MTGNeTh1Q53nJGTNsTMjJnj4N7s+7PcZb4//TEZOWoojXe66WYyotNkv4SFQa1TJZEk1Wh+ydNA2cW8B/wNvN77PglLVN7RW4+vfKEkLLwkvtryd8/TkgN7nf7K+buPD0NYcvrLp+c+rAk8jTvScoS8wXrq0JOHERZsD/Xk1+Zx2nIt3uREOr52a8v4i8PW1ledUXEvnLaEf/xxqhtIJiV1IGnYqL6baL4++g5N05KTNg4lURg6q9PXPLqoxBdCLAuxJBwySCQDWqTpIqw+zVIpgU7svmCcdpBgM+Zv4L3dx1T9QZtSH8tKaqws5Gdo62dxKDV6qyeQ9FDYEmLPDoqSkA0vtNENck8zArtN2RlIf9R5sSRaaMmzMcwQYgYcjH6cL0N8eEBQtx/INdRglt0uNwEGkBlG6pDXyH4oltCsz/gIwAzdtaHDpvwnEBmRN+pdMYWTsC5ePDkaZAOdq2nTJ7qJ564RaeTDw2+542pCwjWURfEVUD0jY3ngF+vu0cPcZRcuup/seOMfBHthnRv11kVYGT1zKGENaDm41BLB6KYr3K+wh0xPaHTvEA+dJMon7EK+AwQJdQHWnlHFUUlDrHarnBnoi4D8ngjLqK2cmohZ/9Shw+Z6z4iMki3/QXU96mtJUOYbqdPnTNrQclCZz+Qy+uPhrR8LBykDWN1RGYZzSVj8v8ekg/+zg5IDsxGEHhbIhRGQNtz86lNk0r2jCGZh2nssvv3159x7V9DJWr4yh6pEtE3spIuwMJgwlG5Vr30pn/DUp1WAD5lDlL8LZPDnWZTq3h4ov+miq9BbW0YJS7v8gMcDv3J4wEi73DIqD7xtrLl9Yw1v/UT6QiHfakRGX37T4DbISJ2eNsYho9H9OxhFs74bkcdXGXXdrI2oCsM5wzp/4cTa5ze5KGGBqEA4sA2EzhUjH3W46KH7yX0zJnm8p87H6kEIx36YjU2ecg9pUgfa7C5d/9jHapDQuFg7WEbsvCRBfl5bj684bBT1yqnN58sS3yhBwPBaLa+UqnTTtqsnrp1hweGfnnLaPPBYoZbH27WRZbXTpmzwVp9TVB7XyuIvDiVTb/XBwaC/8p7uwzEk6lySln+Dp/tBpaW45nmTNyrSw0pYF0+sUvJXUsJiHhegiwWVBC0BweeV1tBZmwf+sljarDlZ1Dga8aHDUihh3VC9oS6ywoA3rtWKVI1P+Es7SEYIy5ni+pu2Hl9x7G8ZeeigfOir3lARFkw5jMinJSyjX8iAj69+snuSTdkesJz/77WTldeGhghLkN/S1sPiRrXbnYPl/qgjZMrFqh9xWFcw+aIyDCdhwYMo3MNA/wpa7jC9GTiwl5t0GPl8/OlOajvI4p5CfClkOli4D/WGvPxVtK4RI28jo8cMJ3WrJeomLJjpQC7toBkhLNjIaevxFYc+UMAv2uVP5T5ncpFGWEa+ZFFcrHKmL/zYPSMEA3fLrLw2NFif2/hcW5/RmTT2JlldRt9Pb89XoM8qkyNiwnDuYWHTHTMnEANmWPiaZ7H2LUVY2NNiMzBPZIUZGTbg97+7mXz340e0PFQaRo25w01Ytw8VSWIAM6yWdZMhVynVBiOEhU/XegeUujwO1A3ulV9IXxvGaN8oYUmDXT3U8hudYWn3sFCntxfHV7o/Mx8mqxFbTPhdZ+W1oRHPn2q1Em19RmdI+BrI6nLYlMf0uiLXlc+AmyUmS0SE4SWso8l79hdSwmKnN/fuc2sJwsLm+vgJI0qkaUkLe1v/+eVzemoOc5eMPDZxAC2HsE/fbqRhzca6Z1iJ1ZKw8X5BOwjhJiwjLwV7uX19kkc/IpGwjDjAwxdUqIdox0Ybj3TCgrxs7AIJHYLyvravPH4FAaNTTr3Gz998d+gXzLBeeFGh5DLy7ttLGDjDHhBfBrUkxeJY9qlVIFY+LLnzpg4yk9M/f0r69etBWrRoQm6s1Vw3YcHBX43r636tfRCMEBbTudHWhTh0spambGgH20GjdmDsYfe14Y62jBKWdtPd6AxLu4cFmYw665MEZYe/L4XYnGfY6A5DvCT0p34h2Vwf6pZNtdeEg0c8PU/XfFo4Z1gAF/6vcLYgDpcACWGGJNlnukkHm/I4DYcRlDrE8k+dF/fUmu7QcseJOth0r1KlMmlZt70uwpredzHbvyrl3tcIYXlbEkoGfIF7e7ihz+TvYTVKWOFcEhrVbQIOkij/iGUwNuGxEQ0dInzggIdWYBENMyxDpApjZUHZjfH0Nub+yNxbuahPD7c/rIt/nhqKo+ZvvLEhJSUs7XCEFyMm2AN+9IlnJVIYSmvJbM7cbLfHBhDVM8+tI/dmjqYE1K3xQF2EZW09nBHWQO0AGiEsbxuZISUsm7xfK6s2bpSwFgsbeqrrMjrDWjvqmQR1PbiWhNwu3kjYaDpTdKXn86lmJbrqE+RtWhlZHHtnuupQtenPbY0zJX9goHWy/FgaenKMiDMbJUH5BTN3Jvs1E4Z7hgUgX3wl7zSWhcxweey4dPc1loqwK2QEpg6XrVhQKn3xknnk3fe20vSB5t7kkTVOMnfeFEpAKW1H6iIsHAtW4br4s54G2QhhlcUMC8d+eZJXnWaUsMI5w4J8mCmxlzAkYYp8L+qNhhkWlTOA48G0+OD9hNFyziDXMDpbVfmDh8WDJ0JTPxMxdx3uGRYAO3vh2JzWbVqQrl07UqKBm5jOXZKpPhb2p9TO+NSEBQ12dRzXq/+2kLxcsJ6md+jYjsyak0mci+ZQwhrTdYZfwsrqZad54+PiPSonGiGscM+w4IIYSoT+Hj6jhBXOGRZkDoW7afWLHE0zLPSfnlStmpWp+xL0teDat8u5K87fsxEz98uCsAghVWXXcrr5jj0rEA+8i2JmBdtAGEb/8FPJQyiQZ8nS+aUIC+6TC4o20PQ2bVoQbOJPnTaelC9Xnswzr/FLWEk1mpO48hXOmUwmj6YfkUhYOC5ezwMXqYQFVQ5HgCc6+3qRo42woO4R6EG1vvqvvReqQ231PGNXPU9ZEBY6efHPE8Og5Z5QvRr56PBb1MC5fXIb6pgPtoMwYtbOpqbf91+DaXbP4ZxNtm5/mtoa9u/fkxJf3z49SJNarf2S1W3J97C9K7qk8AR+JBLWwhTXEE+yatMilbAgpz1Fvlf7ohmNRxthof9wUWy0v3rKYbmofR5iMl5WhAXw9uwreKxqtSr0hGec7IyZEtzDvHdwG6lWrWopg2ecnMOIioUgMdglwuh5zNg7yNrHF5OK8RX9+nSf0G0u9q1IhbhKPg+hiDTCwtcivQ9eJBMW+gAtcz0vn7880UhYtP8hctroCR9JUC7p/WHT+zxFZL6yJCwAkKusLIiPjyetWzenx9Fj/wpH0WdkjiaYMTFiQoj9Kq2hNDTaQXawJUy/cwiZMzublDOVI9P6POR1hjWx2zwSH1fxUlz5OHhVKPUlSz0wkURYcLimZ++KyR/phEVPIzLoLlj9kkYrYWV0USqE0100FG7V7obYcxFTYVl8JdQCtnT5g8/iq2FSUgOyc/dLBNrvBw5tJz17dSVwm8xIC/taWC6yOEIsI1k4YGAvEl8hniTXv9UrWWEZGH9dRVLxukr/NplMrbWyaONGCCtcXwlzUvKHa+XzFTdKWOH+SqiWeVna+hZGtN/VhIXlJeqMlq+E6v7P751bM1jPriWw0GzmO0TllN6zN9VyRc311SAsgLNu3fK5SUkN/gJx4TBVbMJ/dHgntTVUe22YOTvTrel+8tuDpFfvW0jRlr+Tmzu1J00bN6Z+rWb2X1GKsKb1XUya1m5D96yqVEzY4m9mxQYsYghLULKZTHrDaCAs9AWeOYM69iqKCQv9xzhJNvlZX8QT1D1R3qP3mYm6fGW9JFQDtGrVQ00HDzF/AtJq1bo5Pe5r7/5CkiPNIFj64VgvKI7iGl8ToST62LolpGXLpiQxsR5dCg7vmFGCrEBUnRr1uqy6cF3FP2tVrjVB3aa/ayOEFUq1BowHHOj5k9PTfaOEFW61Bk+ywv+7XXQVGnkxo3VJqMUB519CZcUIBl7LiPIeh0W5UdtWzMSNuurVa0uoB6hZs7IG9+jZ5QiIq2HDRHLH8EFUe71vvx4EyqEPPjid3D1qKJ2F0S+NCdUoIaW1H0vJCjOsYR0mknaJnWl61YoJfzWr2QaqAH4NaLXyXU3CwlIJmuFamfTGo4mwWJ9wZiFOJvb6AmqWPMjHCMspKCsDKUfz+tB0d9rk3IDrUx2zxvoUSAhtdbtNfingdjW4UGeGYv7EQNqOyrxXa0noBaz6jRvfuLJ1q5bfxleocAkElpBQlVSvXo3AHrFmzeokLi6Ofu3rUL8baV2vIz1nEPkSE5JIcoNbv+3XfPCjXurWlWyEsILdw3IIyhkc2xSsfZhRwirLPSxvgyCJynTdxBXlS0JPGMAcCr7hHaJyOhDygpH4wtS8OzzVGZNp8IoIw9JA/xcPlBuWASA9kmo2ezy58S37e7br80n/TuYjnRr1OtI1qe+x/i3S3hfaDt9xW/sJT87qtywdX6BCIc+ilPWdAsXCmxcFb7aE2BjFsVVOwbUeR0uFQm5WR6CyI7/WBhCKjkbqYTIEE+ak5bbGgR52Qd4GTwcwP3GI8q94iYEZ9n7wcqONZebcZoHKuciiJHuTDyfKBFpfOOz5Fg+Wb4VeFU57doryU5JN3qL2dQWfXvjwAE8g3vrC0zkCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCHAGOAEeAI8AR4AhwBDgCsY7A/wF9xGF0orQUHwAAAABJRU5ErkJggg==" class="toggle-img" title="Развернуть">;
const statsSpan = document.createElement('span');
statsSpan.id = 'hits_summ__and__date_created_updated';
header.appendChild(statsSpan);
return header;
};
const createChartContainer = (currentYear, creationYear) => {
const container = document.createElement('div');
container.className = 'chart-container';
const canvas = document.createElement('canvas');
canvas.id = 'viewsChart';
container.appendChild(canvas);
const navigation = document.createElement('div');
navigation.className = 'navigation';
navigation.innerHTML = createNavLinks(currentYear, creationYear);
container.appendChild(navigation);
return container;
};
const fetchMonthlyViews = async (pathname, year, month) => {
const response = await fetch(
${API_BASE_URL}${pathname}?year=${year}&month=${month});
const data = await response.json();
return data.result?.views || 0;
};
const fetchYearlyData = async (pathname, year) => {
const monthlyData = [];
for (let month = 1; month <= 12; month++) {
const monthStr = month.toString().padStart(2, '0');
const views = await fetchMonthlyViews(pathname, year, monthStr);
monthlyData.push({ month: monthStr, views });
}
return monthlyData;
};
const loadChartLibrary = () => {
return new Promise((resolve) => {
if (window.Chart) {
resolve();
return;
}
const script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/npm/chart.js';
script.onload = resolve;
document.body.appendChild(script);
});
};
const renderChart = (data, year) => {
const ctx = document.getElementById('viewsChart').getContext('2d');
const chartData = {
labels: data.map(d => MONTHS_RU[d.month]),
datasets: [{
label:
Просмотры за ${year} год,
data: data.map(d => d.views),
backgroundColor: '#66339988',
borderColor: '#663399',
borderWidth: 2
}]
};
new Chart(ctx, { ...CHART_CONFIG, data: chartData });
};
const init = async () => {
const pathname = window.location.pathname;
const urlYear = new URLSearchParams(window.location.search).get('year');
const currentYear = urlYear && urlYear.length === 4 && !isNaN(urlYear) ? urlYear : new Date().getFullYear();
const publishedMeta = document.querySelector('meta[property="article:published_time"]');
const modifiedMeta = document.querySelector('meta[property="article:modified_time"]');
const publishedTime = publishedMeta.getAttribute('content');
const modifiedTime = modifiedMeta.getAttribute('content');
const creationYear = new Date(publishedTime).getFullYear();
let expandableDiv = document.getElementById('expandableDiv') || createExpandableDiv();
if (!document.getElementById('expandableDiv')) {
const header = createHeader();
const chartContainer = createChartContainer(currentYear, creationYear);
expandableDiv.append(header, chartContainer);
document.body.appendChild(expandableDiv);
}
const yearlyResponse = await fetch(API_BASE_URL+pathname+"?year="+currentYear);
const yearlyData = await yearlyResponse.json();
const monthlyData = await fetchYearlyData(pathname, currentYear);
const statsText = \
Всего просмотров за год: ${yearlyData.result.views} | Создано: ${getTimeElapsed(publishedTime)} | Обновлено: ${getTimeElapsed(modifiedTime)}`;
document.getElementById('hits_summanddate_created_updated').textContent = statsText;
await loadChartLibrary();
renderChart(monthlyData, currentYear);
};
const style=document.createElement('style'); style.textContent=.expandableDiv { position: fixed; left: 0; bottom: 0; width: 100vw; height: 70px; background-color: #fff; padding: 2px; box-sizing: border-box; z-index: 9999; overflow: hidden; transition: height 1s ease-in-out; }.header { display: flex; justify-content: space-between; align-items: center;height:70px; }.toggle-img { height: 50px; cursor: pointer; }.chart-container { width: 100%; height: calc(50vh - 70px);box-sizing:border-box;padding-bottom:15px;}.navigation {display:flex;justify-content:space-between;position: absolute;left:0; bottom: 0px; font-family: monospace; font-size: 14px;width:100vw;background-color:rebeccapurple;}.nav-link:hover { text-decoration: none; background:#fff; color:#663399;}.nav-link{padding-left:5px;padding-right:5px;text-decoration:none;background:rebeccapurple;color:#fff;}
;
document.head.appendChild(style);init().catch(console.error);
document.getElementById('torshare').addEventListener('click', () => {
expandableDiv.style.height = expandableDiv.style.height === '70px' ? '50vh' : '70px';
});
document.getElementById('torshare_head').addEventListener('click', () => {
expandableDiv.style.height = expandableDiv.style.height === '70px' ? '50vh' : '70px';
});document.getElementById('torshare').click();document.getElementById('torshare').click();
})();