Display addinformation in VKprofile (Alina)

Отображение номера страницы (ID), даты регистрации, последнего редактирования страницы и последний заход на странице пользователя ВКонтакте

  1. // ==UserScript==
  2. // @name Display addinformation in VKprofile (Alina)
  3. // @name:ru Отображение доп. информации на странице ВКонтакте (Алина)
  4. // @name:uk Відображення доп. інформації на сторінці VK (Алина)
  5. // @namespace https://greasyfork.org/ru/users/717310-alina-novikova
  6. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEr0lEQVRYR8VXfVBUVRT/3WW3YEVFmgk0B0QNnYbMnf4wEywQNJvxaygdSm1ygsECx/zCGoc+bByjsDEInWroA1OLYQyZGBjpwwb8GsCEMmNa6AMYyHYGIb529+3r3Pf27bK7b3fZNzadP3bfve+c3/nde+459zwGLzFbLOfioqLSzAM9QuetjjCIjMVPS8T8GTPZ5+0jjq2np3ILnbedc+yACAEMNhqP0vMgPffTfxeNW2BHDY6wjom2TBnUdYjpqXMd9e9cPaJr7G5SxU+elYF8Uw4eek+P9j4/FAJNi0QFqKbf7XiLSQgSAe48OrKr/nDzfp1VsAZEDteHY7fpEHIqE7SRkNF/gwNLOQmJwLhdELJqs4I6V5hFEInylRWYWqjXsA1OExFfoohtYDzmleby9MYe9W3352FZbDpiDJuxrXK6NhI8HHYsZDZBEDaczfR3qAKCn1lbhfADOggObRyIwh52w/KHdc/3OwxaIIqSS7D19Gw0d2uxlmxOstrOBqHsWqmmHchdlI+zP6Th/SuaCVxmteYGR1lbqSsdQ4HKXZRHBFZoJ0D1gf10809HQWO+JgLFy0tQfH42vvoZ6Bn0pJ4QDcRFyXM2Abjwu+rSLGzcbhcza54IZeEu3ep1VdAxHXbWAEe9kuh8DrB8rqzKnS87pupihH16dVDotVboGnvPhURiVXwGtiU9C6MhwofA0jigaTtVOee+qhGUnImwMRSIwvBBu+6Z+i0Ys49NisQUgxEVj30MQ5icPBMdGGnq8gtAUqwM1T8E3Ps2MDSuCu3gBMT7SfmDjV0obn0Zo0FIcOcvLn4DS+5JcCEqBCLIedVmYPUC+ZVIlX/TSaCy3f+6JAL8NSdx4Xk7SluPo6nva1WLFLqMch/IRsoxA67tdKvsrQWu9wOHV8s4irz5HbC/LvCmuggoauVPDmKLKRLdQ734deAXaXph9ALMnDILH7WMIbvKCD1VDdshNzBfghJvPuug8WsNwOvq6/Bg5EOAvw0jB7uSgaLH3boX6SSnHAcEAvcm4L3G6utA1ilqCHhXEERUCXAbHZ3gdtrm+2LcCGUXgbxqmeDEHVDz0XETyDwB/EihCSR+CXCj1HlAw3MyGUXqKCqFlLFX8txzn7QA3beAp03AnBnu+YFRIONDoLnHPwUpDfmC/akcSAMOrgy8CiULDGHAqyuAl1LdZ6KP0tB0FOj7RxWD0nCfaKW+KOBt+AqBFqZ77sREOO9CU/CInBGKfNEmp6OPOAvRML0wBjssGfOBd9dSRtztq6lW6b7JlkPIhWfJYtqFNt8+coSH4G/SuSsYAf6en4VViXS4koCH44F5dOHcQV2ZGoFH6R74lu4DRUrorthBd4aXWHgIOikE7rI2GSZOHX42I+8ErHbqK/lJ8pKocPeEjbqmYe9+l1/HtAOXSG1JCH5vp+olTuAzQnzqdqJOGkvEKR6C3RQCuq/+B+FNKXaJidDjBpHQ1BVppq205RLAPvEMuV+vGUyLofJhItnuFWOpFlKlxxwtWBpsPD/NXCQYeOe27j8Lh7+PU48VyGdiDc09KNUHETH0P43GEfRsoGeq+CF9nv9F+maybVX7PP8XnlyqoWQc/vYAAAAASUVORK5CYII=
  7. // @version 10.03.2023
  8. // @description:en Display profile ID, registration date, last profile edit and last seen in VK user profile
  9. // @description Отображение номера страницы (ID), даты регистрации, последнего редактирования страницы и последний заход на странице пользователя ВКонтакте
  10. // @description:ru Отображение номера страницы (ID), даты регистрации, последнего редактирования страницы и последний заход на странице пользователя ВКонтакте
  11. // @description:uk Відображення номера сторінки (ID), дати реєстрації, останнього редагування сторінки і останній візит на сторінці користувача VK
  12. // @author Inlifeuser, Alina
  13. // @license MIT
  14. // @include *://vk.com/*
  15. // @exclude *://vk.com/notifier.php*
  16. // @exclude *://vk.com/*widget*.php*
  17. // @run-at document-end
  18. // ==/UserScript==
  19.  
  20. 'use strict';
  21. function addLeadingZeroToDate (date) {
  22. return ('0' + date).slice(-2);
  23. }
  24. function convert24HoursTo12Hours (hours) {
  25. hours = hours % 12;
  26. return hours ? hours : 12;
  27. }
  28. function convert24HoursToAmPmLc (hours) {
  29. return hours >= 12 ? 'pm' : 'am';
  30. }
  31. (function () {
  32. new MutationObserver(function () {
  33.  
  34. //boxQueue.hideAll();
  35.  
  36. var vkProfilePage = document.body.querySelector('.OwnerPageName:not(.display_additional_information_in_vk_profile)');
  37. if (!vkProfilePage) return;
  38. //console.info('vkProfilePage: ', vkProfilePage);
  39. //var vkScripts = document.body.querySelectorAll('.ScrollStickyWrapper');
  40. //console.info('vkProfilePage vkScripts', vkScripts[vkScripts.length - 1].textContent);
  41.  
  42. var PageSource = new XMLHttpRequest();
  43.  
  44. PageSource.open('GET', window.location.href, false);
  45. PageSource.send();
  46.  
  47. if (PageSource.status === 200) {
  48. //console.log(PageSource.responseText);
  49. var vkProfileId = (PageSource.responseText.match(/"ownerId":(\d+),"/i) || [])[1];
  50. console.info('vkProfileId: ', vkProfileId);
  51. }
  52. if (!vkProfileId) return;
  53. vkProfilePage.className += ' display_additional_information_in_vk_profile';
  54. var vkPageLang = document.body.querySelector('a.ui_actions_menu_item[onclick*="lang_dialog"]');
  55. var vkCurrentLang;
  56. if (vkPageLang) {
  57. vkCurrentLang = vkPageLang.textContent;
  58. } else {
  59. vkCurrentLang = navigator.language.substring(0, 2);
  60. }
  61. var vkLang, vkMonthName;
  62. if (vkCurrentLang === 'Language: english' || vkCurrentLang === 'en') {
  63. vkLang = 'en';
  64. vkMonthName = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  65. } else if (vkCurrentLang === 'Язык: русский' || vkCurrentLang === 'ru') {
  66. vkLang = 'ru';
  67. vkMonthName = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
  68. } else if (vkCurrentLang === 'Мова: українська' || vkCurrentLang === 'uk') {
  69. vkLang = 'uk';
  70. vkMonthName = ['сiчня', 'лютого', 'березня', 'квiтня', 'травня', 'червня', 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня'];
  71. }
  72. var i = 0;
  73. while (i < 4) {
  74. var vkProfilePageElement = document.createElement('div');
  75. vkProfilePageElement.style.display = 'none';
  76. vkProfilePage.insertBefore(vkProfilePageElement, vkProfilePage.firstChild );
  77. i++;
  78. }
  79. var vkProfileIdElement = document.createElement('div');
  80. vkProfileIdElement.className = 'clear_fix profile_info_row';
  81. if (vkLang === 'en') {
  82. vkProfileIdElement.innerHTML = '<div class="ProfileModalInfoRow__label">Profile ID:</div><div class="ProfileModalInfoRow__in">' + vkProfileId + '</div>';
  83. } else if (vkLang === 'ru') {
  84. vkProfileIdElement.innerHTML = '<div class="ProfileModalInfoRow__label">Номер страницы:</div><div class="ProfileModalInfoRow__in">' + vkProfileId + '</div>';
  85. } else if (vkLang === 'uk') {
  86. vkProfileIdElement.innerHTML = '<div class="ProfileModalInfoRow__label">Номер сторінки:</div><div class="ProfileModalInfoRow__in">' + vkProfileId + '</div>';
  87. } else {
  88. vkProfileIdElement.innerHTML = '<div class="ProfileModalInfoRow__label">Profile ID:</div><div class="ProfileModalInfoRow__in">' + vkProfileId + '</div>';
  89. }
  90. vkProfilePage.replaceChild(vkProfileIdElement, vkProfilePage.childNodes[0]);
  91. var requestVkFoaf = new XMLHttpRequest();
  92. requestVkFoaf.onreadystatechange = function () {
  93. if (this.readyState === 4 && this.status === 200) {
  94. var vkFoafRegDate = (this.responseText.match(/ya:created dc:date="(.+)"/i) || [])[1];
  95. var vkFoafLastProfileEditDate = (this.responseText.match(/ya:modified dc:date="(.+)"/i) || [])[1];
  96. var vkFoafLastSeenDate = (this.responseText.match(/ya:lastLoggedIn dc:date="(.+)"/i) || [])[1];
  97. if (vkFoafRegDate) {
  98. var vkRegDate = new Date(vkFoafRegDate);
  99. var vkRegDateElement = document.createElement('div');
  100. vkRegDateElement.className = 'clear_fix profile_info_row';
  101. if (vkLang === 'en') {
  102. vkRegDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Registration date:</div><div class="ProfileModalInfoRow__in">' + vkMonthName[vkRegDate.getMonth()] + ' ' + vkRegDate.getDate() + ', ' + vkRegDate.getFullYear() + ' at ' + convert24HoursTo12Hours(vkRegDate.getHours()) + ':' + addLeadingZeroToDate(vkRegDate.getMinutes()) + ':' + addLeadingZeroToDate(vkRegDate.getSeconds()) + ' ' + convert24HoursToAmPmLc(vkRegDate.getHours()) + '</div>';
  103. } else if (vkLang === 'ru') {
  104. vkRegDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Дата регистрации:</div><div class="ProfileModalInfoRow__in">' + vkRegDate.getDate() + ' ' + vkMonthName[vkRegDate.getMonth()] + ' ' + vkRegDate.getFullYear() + ' в ' + vkRegDate.getHours() + ':' + addLeadingZeroToDate(vkRegDate.getMinutes()) + ':' + addLeadingZeroToDate(vkRegDate.getSeconds()) + '</div>';
  105. } else if (vkLang === 'uk') {
  106. vkRegDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Дата реєстрації:</div><div class="ProfileModalInfoRow__in">' + vkRegDate.getDate() + ' ' + vkMonthName[vkRegDate.getMonth()] + ' ' + vkRegDate.getFullYear() + ' о ' + vkRegDate.getHours() + ':' + addLeadingZeroToDate(vkRegDate.getMinutes()) + ':' + addLeadingZeroToDate(vkRegDate.getSeconds()) + '</div>';
  107. } else {
  108. vkRegDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Registration date:</div><div class="ProfileModalInfoRow__in">' + addLeadingZeroToDate(vkRegDate.getDate()) + '.' + addLeadingZeroToDate(vkRegDate.getMonth() + 1) + '.' + vkRegDate.getFullYear() + ' ' + addLeadingZeroToDate(vkRegDate.getHours()) + ':' + addLeadingZeroToDate(vkRegDate.getMinutes()) + ':' + addLeadingZeroToDate(vkRegDate.getSeconds()) + '</div>';
  109. }
  110. vkProfilePage.replaceChild(vkRegDateElement, vkProfilePage.childNodes[1]);
  111. } else {
  112. console.info('Registration date on VK FOAF profile is empty or unavailable');
  113. }
  114. if (vkFoafLastProfileEditDate) {
  115. var vkLastProfileEditDate = new Date(vkFoafLastProfileEditDate);
  116. var vkLastProfileEditDateElement = document.createElement('div');
  117. vkLastProfileEditDateElement.className = 'clear_fix profile_info_row';
  118. if (vkLang === 'en') {
  119. vkLastProfileEditDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Last profile edit:</div><div class="ProfileModalInfoRow__in">' + vkMonthName[vkLastProfileEditDate.getMonth()] + ' ' + vkLastProfileEditDate.getDate() + ', ' + vkLastProfileEditDate.getFullYear() + ' at ' + convert24HoursTo12Hours(vkLastProfileEditDate.getHours()) + ':' + addLeadingZeroToDate(vkLastProfileEditDate.getMinutes()) + ':' + addLeadingZeroToDate(vkLastProfileEditDate.getSeconds()) + ' ' + convert24HoursToAmPmLc(vkLastProfileEditDate.getHours()) + '</div>';
  120. } else if (vkLang === 'ru') {
  121. vkLastProfileEditDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Посл. ред. страницы:</div><div class="ProfileModalInfoRow__in">' + vkLastProfileEditDate.getDate() + ' ' + vkMonthName[vkLastProfileEditDate.getMonth()] + ' ' + vkLastProfileEditDate.getFullYear() + ' в ' + vkLastProfileEditDate.getHours() + ':' + addLeadingZeroToDate(vkLastProfileEditDate.getMinutes()) + ':' + addLeadingZeroToDate(vkLastProfileEditDate.getSeconds()) + '</div>';
  122. } else if (vkLang === 'uk') {
  123. vkLastProfileEditDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Останнє ред. стор.:</div><div class="ProfileModalInfoRow__in">' + vkLastProfileEditDate.getDate() + ' ' + vkMonthName[vkLastProfileEditDate.getMonth()] + ' ' + vkLastProfileEditDate.getFullYear() + ' о ' + vkLastProfileEditDate.getHours() + ':' + addLeadingZeroToDate(vkLastProfileEditDate.getMinutes()) + ':' + addLeadingZeroToDate(vkLastProfileEditDate.getSeconds()) + '</div>';
  124. } else {
  125. vkLastProfileEditDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Last profile edit:</div><div class="ProfileModalInfoRow__in">' + addLeadingZeroToDate(vkLastProfileEditDate.getDate()) + '.' + addLeadingZeroToDate(vkLastProfileEditDate.getMonth() + 1) + '.' + vkLastProfileEditDate.getFullYear() + ' ' + addLeadingZeroToDate(vkLastProfileEditDate.getHours()) + ':' + addLeadingZeroToDate(vkLastProfileEditDate.getMinutes()) + ':' + addLeadingZeroToDate(vkLastProfileEditDate.getSeconds()) + '</div>';
  126. }
  127. vkProfilePage.replaceChild(vkLastProfileEditDateElement, vkProfilePage.childNodes[2]);
  128. } else {
  129. console.info('Last profile editing date on VK FOAF profile is empty or unavailable');
  130. }
  131. if (vkFoafLastSeenDate) {
  132. var vkLastSeenDate = new Date(vkFoafLastSeenDate);
  133. var vkLastSeenDateElement = document.createElement('div');
  134. vkLastSeenDateElement.className = 'clear_fix profile_info_row';
  135. if (vkLang === 'en') {
  136. vkLastSeenDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Last seen:</div><div class="ProfileModalInfoRow__in">' + vkMonthName[vkLastSeenDate.getMonth()] + ' ' + vkLastSeenDate.getDate() + ', ' + vkLastSeenDate.getFullYear() + ' at ' + convert24HoursTo12Hours(vkLastSeenDate.getHours()) + ':' + addLeadingZeroToDate(vkLastSeenDate.getMinutes()) + ':' + addLeadingZeroToDate(vkLastSeenDate.getSeconds()) + ' ' + convert24HoursToAmPmLc(vkLastSeenDate.getHours()) + '</div>';
  137. } else if (vkLang === 'ru') {
  138. vkLastSeenDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Последний заход:</div><div class="ProfileModalInfoRow__in">' + vkLastSeenDate.getDate() + ' ' + vkMonthName[vkLastSeenDate.getMonth()] + ' ' + vkLastSeenDate.getFullYear() + ' в ' + vkLastSeenDate.getHours() + ':' + addLeadingZeroToDate(vkLastSeenDate.getMinutes()) + ':' + addLeadingZeroToDate(vkLastSeenDate.getSeconds()) + '</div>';
  139. } else if (vkLang === 'uk') {
  140. vkLastSeenDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Останній візит:</div><div class="ProfileModalInfoRow__in">' + vkLastSeenDate.getDate() + ' ' + vkMonthName[vkLastSeenDate.getMonth()] + ' ' + vkLastSeenDate.getFullYear() + ' о ' + vkLastSeenDate.getHours() + ':' + addLeadingZeroToDate(vkLastSeenDate.getMinutes()) + ':' + addLeadingZeroToDate(vkLastSeenDate.getSeconds()) + '</div>';
  141. } else {
  142. vkLastSeenDateElement.innerHTML = '<div class="ProfileModalInfoRow__label">Last seen:</div><div class="ProfileModalInfoRow__in">' + addLeadingZeroToDate(vkLastSeenDate.getDate()) + '.' + addLeadingZeroToDate(vkLastSeenDate.getMonth() + 1) + '.' + vkLastSeenDate.getFullYear() + ' ' + addLeadingZeroToDate(vkLastSeenDate.getHours()) + ':' + addLeadingZeroToDate(vkLastSeenDate.getMinutes()) + ':' + addLeadingZeroToDate(vkLastSeenDate.getSeconds()) + '</div>';
  143. }
  144. vkProfilePage.replaceChild(vkLastSeenDateElement, vkProfilePage.childNodes[3]);
  145. } else {
  146. console.info('Last seen date on VK FOAF profile is empty or unavailable');
  147. }
  148. } else if (this.readyState === 4 && this.status !== 200) {
  149. console.error('Failed to get VK FOAF profile (registration date, last profile edit date and last seen date): ' + this.status + ' ' + this.statusText);
  150. }
  151. };
  152. requestVkFoaf.open('GET', '/foaf.php?id=' + vkProfileId, true);
  153. requestVkFoaf.send();
  154. }).observe(document.body, { childList: true, subtree: true });
  155. })();