LINUX.ORG.RU

История изменений

Исправление CrX, (текущая версия) :

Пока что обнаружил проблему такую, что на странице https://www.linux.org.ru/notifications?filter=reaction нет класса reaction, зато есть класс emoji.

Очень странно. У меня есть.

Ещё это магическое число offset=100 у разных юзеров будет разное, потому что зависит от их настройки числа показываемых тем.

Исправлено:

// ==UserScript==
// @name        LOR count-reactions
// @match       https://www.linux.org.ru/notifications?filter=reaction
// @version     1.2
// @author      CrX
// @description Show reaction count on reactions notifications page
// @grant		    GM_xmlhttpRequest
// ==/UserScript==

var res = {"🤡": 0, "👍": 0, "👎":0, "🤦": 0, "🔥": 0, "😊": 0, "🤔": 0, "😱":0, "☕☕":0, "🪗": 0};
let newdiv = document.createElement("div");
newdiv.setAttribute("id", "scriptedReactions");
h1 = document.getElementsByTagName("h1")[0];
h1.parentNode.insertBefore(newdiv, h1.nextSibling);

function countReactions(pageDom) {
  Array.from(pageDom.getElementsByClassName('reaction')).forEach((e) => {
    for (var r in res) {
      if (e.innerText.search(r) != -1) { res[r]++; }
    }
  });
  let reacttext = "| ";
  var items = Object.keys(res).map(function(key) {
    return [key, res[key]];
  });
  items.sort(function(first, second) { return second[1] - first[1];});
  for (var r in items) {
    reacttext += items[r][0] + ": " + items[r][1] + " | ";
  }
  document.getElementById("scriptedReactions").innerHTML = reacttext;
}

function scrapePage(pageurl) {
  GM_xmlhttpRequest({
    method: "GET",
    url: pageurl,
    onload: function(response) {
      var parser      = new DOMParser ();
      var responseDoc = parser.parseFromString(response.responseText, "text/html");
      countReactions(responseDoc)
      let nextlink = responseDoc.querySelector('a[rel="next"]');
      if (nextlink) {scrapePage(nextlink);}
    }
  });
}

countReactions(document);
scrapePage(document.querySelector('a[rel="next"]'));

Исходная версия CrX, :

Пока что обнаружил проблему такую, что на странице https://www.linux.org.ru/notifications?filter=reaction нет класса reaction, зато есть класс emoji.

Очень странно. У меня есть.

Ещё это магическое число offset=100 у разных юзеров будет разное, потому что зависит от их настройки числа показываемых тем.

Исправлено:

// ==UserScript==
// @name        LOR count-reactions
// @match       https://www.linux.org.ru/notifications?filter=reaction
// @version     1.2
// @author      CrX
// @description Show reaction count on reactions notifications page
// @grant		    GM_xmlhttpRequest
// ==/UserScript==

var res = {"🤡": 0, "👍": 0, "👎":0, "🤦": 0, "🔥": 0, "😊": 0, "🤔": 0, "😱":0, "☕☕":0, "🪗": 0};
let newdiv = document.createElement("div");
newdiv.setAttribute("id", "scriptedReactions");
h1 = document.getElementsByTagName("h1")[0];
h1.parentNode.insertBefore(newdiv, h1.nextSibling);

function countReactions(pageDom) {
  Array.from(pageDom.getElementsByClassName('reaction')).forEach((e) => {
    for (var r in res) {
      if (e.innerText.search(r) != -1) { res[r]++; }
    }
  });
  let reacttext = "| ";
  var items = Object.keys(res).map(function(key) {
    return [key, res[key]];
  });

  items.sort(function(first, second) { return second[1] - first[1];});
  for (var r in items) {
    reacttext += items[r][0] + ": " + items[r][1] + " | ";
  }
  document.getElementById("scriptedReactions").innerHTML = reacttext;
}

function scrapePage(pageurl) {
  GM_xmlhttpRequest({
    method: "GET",
    url: pageurl,
    onload: function(response) {
      var parser      = new DOMParser ();
      if (!response.responseXML) {
        responseXML = new DOMParser()
          .parseFromString(response.responseText, "text/xml");
      }
      var responseDoc = parser.parseFromString(response.responseText, "text/html");
      countReactions(responseDoc)
      let nextlink = responseDoc.querySelector('a[rel="next"]');
      if (nextlink) {scrapePage(nextlink);}
    }
  });
}

countReactions(document);
scrapePage(document.querySelector('a[rel="next"]'));