• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Implementierung eines RSS Feed mit Javascript

Status
Für weitere Antworten geschlossen.

AlcuZan

New member
Moin,

das Institut in dem ich arbeite hat auf seiner Website einen RSS Feed für aktuelle Meldungen. Das Ganze funktioniert eigentlich so, dass man eine neue Meldung einträgt und diese wird automatisch in den Newsfeed auf der Startseite eingespeist. Das sieht dann in etwa so aus:
f32371-1484153828.png
Seit heute funktioniert das nicht mehr und ich komme nicht dahinter, warum. Dies ist der verwendete Code (den ich nicht selbst geschrieben habe - der Kollege der ihn geschrieben hat, hat im Moment keine Zeit sich mit dem Problem zu beschäftigen):
HTML:
<html>
  <head>
    <base target="_top">
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">

    google.load("feeds", "1");

    function initialize() {
      var feed = new google.feeds.Feed("https://www.tu-braunschweig.de/marketing/aktuellesundtermine/aktuell/rssfeed.xml");
      feed.setNumEntries(7)
      feed.load(function(result) {
        if (!result.error) {
          var container = document.getElementById("feed");
          for (var i = 0; i < result.feed.entries.length; i++) {
            var entry = result.feed.entries[i];
            var div = document.createElement("div");
            var datum = new Date(entry.publishedDate);
            var tag = datum + "x";
            var monat = datum + "x";
            var tag1 = tag.substring(8,10);
            var monat1 = monat.substring(4,7);
            var monat2 = "XX";
            if (monat1 == "Jan")
              monat2 = "01";
            if (monat1 == "Feb")
              monat2 = "02";
            if (monat1 == "Mar")
              monat2 = "03";
            if (monat1 == "Apr")
              monat2 = "04";
            if (monat1 == "May")
              monat2 = "05";
            if (monat1 == "Jun")
              monat2 = "06";
            if (monat1 == "Jul")
              monat2 = "07";
            if (monat1 == "Aug")
              monat2 = "08";
            if (monat1 == "Sep")
              monat2 = "09";
            if (monat1 == "Oct")
              monat2 = "10";
            if (monat1 == "Nov")
              monat2 = "11";
            if (monat1 == "Dec")
              monat2 = "12";
            var s = tag1 + "." + monat2 + ". ";
            div.appendChild(document.createTextNode(s));
            var link = document.createElement("a");
            link.setAttribute('target', "_top");
            link.setAttribute('href', entry.link);
            var str = entry.title;
            link.appendChild(document.createTextNode(str.substring(0,32)));
            div.appendChild(link); // Vollstaendige Zeile erzeugen, Datum plus Link
            container.appendChild(div); // Vollstaendige Zeile schreiben
          }
        }
      });
    }
    google.setOnLoadCallback(initialize);

    </script>

<style>
#feed {font-size:13px; font-family:Arial; line-height:18px; margin:0; padding:0;}
#feed {color:#000; text-decoration:none;}
#feed a {color:#BE1E3C; text-align: right;}
</style>
  </head>
  <body>

    <div id="feed"></div><br>
  </body>
</html>
Dieser liegt in einer index.html auf unserem Webspace und ist dann auf der Startseite in einer Tabelle implementiert.
Nun wurde mir gesagt, ich soll versuchen das Problem zu lösen, ich hab aber absolut keine Ahnung woran es liegen könnte. Der Code ist ja leider auch so gut wie gar nicht kommentiert und daher verstehe ich die Funktionsweise nicht richtig. Meine Javascript-Kenntnisse sind bestenfalls rudimentär. Der Link zum RSS Feed funktioniert, dort stehen auch die Meldungen alle drin, aber auf der Startseite des Instituts tauchen die entsprechenden Links nicht auf.
Ich hoffe, ihr könnt mir weiterhelfen.
MfG
AlcuZan
 
Kannst du dein Problem konkretisieren? Was genau funktioniert nicht?

Siehe https://www.tu-braunschweig.de/marketing. Das Feld bei "Aktuelle Meldungen" ist leer. Eigentlich sollen dort aber die Meldungen von dieser Seite auftauchen.

Lass dir doch mal direkt nach if (!result.error) { in der Konsole ausgeben was in dem Array result.feed.entries steht.
Danke für den Hinweis. Ich erhalte zwei Fehlermeldungen:
1. Uncaught Error: Module: 'feeds' not found!
at ?file=feeds&v=1:1

2. Uncaught TypeError: Cannot read property 'Feed' of undefined
at initialize ((index):10)


Durch Googeln habe ich erfahren, dass es die Google Feed API wohl gar nicht mehr gibt? Wurde sie jetzt eventuell komplett gekillt und daher funktioniert es nicht mehr? Er findet ja das Modul "feeds" nicht mehr, was mich darauf schließen lässt, dass dieses nicht mehr existiert.
 
Zuletzt bearbeitet:
kleiner verbesserungsvorschlag am rande:
die stelle hier
Code:
            if (monat1 == "Jan")
              monat2 = "01";
            if (monat1 == "Feb")
              monat2 = "02";
            if (monat1 == "Mar")
              monat2 = "03";
            if (monat1 == "Apr")
              monat2 = "04";
            if (monat1 == "May")
              monat2 = "05";
            if (monat1 == "Jun")
              monat2 = "06";
            if (monat1 == "Jul")
              monat2 = "07";
            if (monat1 == "Aug")
              monat2 = "08";
            if (monat1 == "Sep")
              monat2 = "09";
            if (monat1 == "Oct")
              monat2 = "10";
            if (monat1 == "Nov")
              monat2 = "11";
            if (monat1 == "Dec")
              monat2 = "12";
ist praaedestiniert fuer https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/switch
 
Dann kann er aber auch gleich noch vor der Funktion initialize() das Date-Objekt erweitern:
Code:
Date.prototype.ddmm = function() {
    var mm = this.getMonth() < 9 ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1);
    var dd  = this.getDate() < 10 ? '0' + this.getDate() : this.getDate();
    return dd + '.' + mm + '.';
};
Und dann innerhalb der Funktion var s = new Date(entry.publishedDate).ddmm() machen.
 
Danke euch. Code-Optimierung betreibe ich dann, wenn das Ganze wieder funktioniert.
Habe noch ein paar Fragen zur RSS-API. Ich habe alle Dateien heruntergeladen und auf den Webspace geladen. Zunächst würde ich es aber gern lokal testen, wie mache ich das?

In the service folder open config.php, add the allowed domains and the base url for the feeds folder.
Welche Domains muss ich hier eintragen? Die Seite, auf der die HTML Datei mit dem Skript aufgerufen wird - also die Startseite der Homepage?
Kann ich anstelle des feed Ordners als BASE_FEED_URL einfach die URL des Feeds eintragen? Wenn ja, warum muss ich diese hier eintragen, wenn ich sie später in der Funktion displayAsinc übergebe?

Im feed.js File habe ich die entsprechenden Sachen eingetragen, so weit so gut. Die displayAsinc Funktion verstehe ich so, dass ich hier die feed URL und den div Container, indem später die Einträge stehen übergebe, der Rest ist dann zur Manipulation der Einträge. Soweit richtig?
 
Ich habe alle Dateien heruntergeladen und auf den Webspace geladen. Zunächst würde ich es aber gern lokal testen, wie mache ich das?
Wenn deine HTML Datei aus deinem ersten Beitrag "rssfeed.html" heist, einfach vom Webspace kopieren, dann umbenennen in "rssfeed_test.html", die Änderungen vornehmen. Diese dann wieder auf den Webspace zu der originaldatei laden und testen.

Welche Domains muss ich hier eintragen? Die Seite, auf der die HTML Datei mit dem Skript aufgerufen wird - also die Startseite der Homepage?
Korrekt http://example.com

Kann ich anstelle des feed Ordners als BASE_FEED_URL einfach die URL des Feeds eintragen?
Nein. Hier musst du die Adresse angeben, wo du die Sachen von RSS-API auf den Webspace geladen hast. Wenn das bei dir http://example.com/RSSAPI ist dann wird daraus $BASE_FEED_URL = 'http://www.example.com/RSSAPI/cache/feeds/';


Im feed.js File habe ich die entsprechenden Sachen eingetragen, so weit so gut. Die displayAsinc Funktion verstehe ich so, dass ich hier die feed URL und den div Container, indem später die Einträge stehen übergebe, der Rest ist dann zur Manipulation der Einträge. Soweit richtig?
Ja.
 
HTML:
var content = document.getElementById('content');
$.ajax({
        url: 'https://api.rss2json.com/v1/api.json',
        method: 'GET',
        dataType: 'jsonp',
        data: {
            rss_url: 'https://www.tu-braunschweig.de/marketing/aktuellesundtermine/aktuell/rssfeed.xml',
            api_key: '1aljgyrrjqawkjmpvyya7a5qxbibartxpbusokxq',
            count: 8
        }
  }).done(function ( response ) {
            if(response.status != 'ok'){console.log(response.status);}
			// response.items.splice(1,1); //Eintrag zum Entfernen der Skripte aus Stud.ip löschen (Workaround)
				var output = '';
                for(var i=0;i<response.items.length;++i){ 
					
					var item = response.items[i]; //Ein Item enthält einen kompletten Eintrag mit all seinen Eigenschaften
					
					// Anlegen von Variablen der Übersicht halber
					var titel = item.title;						
					var datum = new Date(item.pubDate);
					var tag = datum.getDate();
					var monat = datum.getMonth()+1;
					
					if (tag < 10) {//Formatvorgabe für den Tag, dieser muss mit einer 0 beginnen wenn der Tag <10 ist, z.B. "02" für den zweiten Tag im Monat
						tag = "0"+tag;
					}					 
					if (monat < 10) { //Formatvorgabe für den Monat, dieser muss mit einer 0 beginnen wenn der Monat < 10 ist, z.B. "02" für Februar
						monat = "0"+monat;
						} 
					if (item.title.length > 30){ // Falls der Titel eines Eintrags länger als 30 Zeichen ist (so viel passt in eine Zeile auf der Seite), wird er gekürzt
						titel = titel.slice(0, 27) + "...";
					}
					var jahr = datum.getFullYear();
					var datum = tag + "." + monat + "." + jahr; // Datum in das richtige Format zusammensetzen, z.B. 02.02.2017
					
                    output += //Zeile zusammensetzen, erst das Datum, dann der Text mit dem Link  
						datum + ' <a href="' +
						item.link + '" >' +
						titel + '</a><br />'
                }
                content.innerHTML = output;
            
    });

Neues Problem. Ich verwende nun https://rss2json.com/ und dachte erst, das würde prima funktionieren. Allerdings aktualisiert sich der Feed hier nicht und alte Einträge bleiben drin stehen. Aus irgendeinem Grund wird also nicht jedes mal die aktuelle XML Datei geladen und in JSON umgewandelt, sondern eine ältere Version dieser Datei (wo auch immer die herkommen soll). Gibt es eine Möglichkeit zu sagen, dass die XML Datei jedes Mal neu eingelesen werden soll, wenn das Skript gestartet wird? Des Weiteren noch ein sehr merkwürdiges Problem: Wenn ich in Google Chrome auf einen Link im Feed mit der linken Maustaste klicke, verschwindet der Feed und die Seite öffnet sich nicht. Wenn ich mit der mittleren Maustaste klicke, öffnet sich ein neuer Tab in dem dann auf die entsprechende Seite gegangen wird, also so wie es sein soll. Woran kann das liegen?
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben