Hashtags herausfiltern

Derzeit läuft der Landesparteitag der Berliner Piratenpartei und natürlich gehört auch Twitter wieder zum Standardrepertoire der Anwesenden. Leider haben Nichtparteimitglieder nur wenig Verständnis für die Menge an Tweets, die sie inhaltlich überhaupt nicht interessieren.

Aus diesem Grund habe ich mich heute mal hingesetzt und ein Greasemonkey-Userscript geschrieben, das hierbei ein wenig Abhilfe schaffen sollte (wie Greasemonkey eingesetzt wird, sollten meine Leser inzwischen wissen). Dieses Script hat eine ziemlich spannende Funktion: Es versteckt Tweets anhand der Hashtags, die in ihnen verwendet wurden.
Wir machen uns dabei zu nutze, dass Hashtags auf der Twitter-Webseite als Links bereitgestellt werden - so können wir sie leichter finden 😉 .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// ==UserScript==
// @name           Hide Hashtags
// @namespace      https://weizenspr.eu/
// @include        http://twitter.com/*
// @include        https://twitter.com/*
// ==/UserScript==

var hideAgainTimer    = 2000; // in milliseconds (values <= 0 deactivate the timer)
var hideTheseHashtags = ["#lmvb", "#domian"]; // choose which hashtags should be filtered out

// DO NOT EDIT BELOW THIS LINE

// as taken from http://www.tutorialspoint.com/javascript/array_indexof.htm
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var from = Number(arguments[1]) || 0;
    var len  = this.length;

    from = (from < 0) ? Math.ceil(from) : Math.floor(from);
    if (from < 0) {
      from += len;
    }

    for (; from < len; from++)
    {
      if ((from in this) && (this[from] === elt)) {
        return from;
      }
    }
    return -1;
  };
}

// twitter ids and classes
var contentClass = "stream-item-content";
var itemClass    = "stream-item";
var statusClass  = "status";
var streamClass  = "stream-items";
var timelineId   = "timeline";

// html and css fragments
var anchorTag    = "a";
var divTag       = "div";
var displayNone  = "none";
var itemTag      = "li";

hideUnwantedTweets();

function hideUnwantedTweets() {
  // old twitter
  var timeline = document.getElementById(timelineId);
  if (timeline != null) {
    var allLinks     = null;
    var singleLink   = null;
    var allStatus    = timeline.getElementsByTagName(itemTag);
    var singleStatus = null;

    for (var indexA = 0; indexA < allStatus.length; indexA++) {
      singleStatus = allStatus[indexA];

      if (singleStatus != null) {
        if (singleStatus.className.indexOf(statusClass) >= 0) {
          allLinks = singleStatus.getElementsByTagName(anchorTag);

          if (allLinks != null) {
            for (var indexB = 0; indexB < allLinks.length; indexB++) {
              singleLink = allLinks[indexB];

              if (singleLink != null) {
                if (hideTheseHashtags.indexOf(singleLink.innerHTML) >= 0) {
                  singleStatus.style.display = displayNone;
                }
              }
            }
          }
        }
      }
    }
  } else {
    // new twitter
    var allDivs    = document.getElementsByTagName(divTag);
    var singleDiv  = null;
    var allLinks   = null;
    var singleLink = null;

    if (allDivs != null) {
      for (var indexA = 0; indexA < allDivs.length; indexA++) {
        singleDiv = allDivs[indexA];

        if (singleDiv != null) {
          if ((singleDiv.className.indexOf(itemClass) >= 0) &&
              (singleDiv.className.indexOf(contentClass) < 0) &&
              (singleDiv.className.indexOf(streamClass) < 0)) {
            allLinks = singleDiv.getElementsByTagName(anchorTag);

            if (allLinks != null) {
              for (var indexB = 0; indexB < allLinks.length; indexB++) {
                singleLink = allLinks[indexB];

                if (singleLink != null) {
                  if (hideTheseHashtags.indexOf(singleLink.innerHTML) >= 0) {
                    singleDiv.style.display = displayNone;
                  }
                }
              }
            }
          }
        }
      }
    }
  }

  if (hideAgainTimer > 0) {
    setTimeout(hideUnwantedTweets, hideAgainTimer);
  }
}

Da derzeit Stück für Stück die Umstellung auf die neue Twitter-Oberfläche stattfindet, habe ich den Code direkt so ausgelegt, dass er sowohl für die alte Oberfläche funktioniert (die ich im übrigen bevorzuge) als auch für die neue. Ab sofort könnt ihr selber entscheiden, ob euch ein Themenbereich interessiert oder nicht. Für mich heißt das zum Beispiel: Keine ewigen "#domian"-Tweets mehr mitten in der Nacht! 😀

Zum Schluss noch etwas Rechtliches:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn, diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
Filternde Grüße, Kenny

1 Kommentar » Schreibe einen Kommentar

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.