Ich hatte letzthin das Problem, dass ich auf meiner neuen Fotografie-Seite einen Feed meiner letzten iStockphoto-Uploads einbinden wollte, aber dies nicht ging, da der offizielle Feed scheinbar nicht validiert:
http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Fwww.istockphoto.com%2Fistock_myfiles_rss.php%3FID%3D8197370
Auf WordPress verwendete ich zuerst das „Embed RSS„-Plugin um Feeds in die Seite zu integrieren, jedoch kam dies nicht mit diesem ungültigen Feed klar. Einige RSS-Reader-Programme (z.B. „Vienna RSS„) hatten jedoch keine Probleme mit dem Feed. Vermutlich korrigierten sie intern die Fehler oder ignorierten diese einfach.
Zum Glück hat mich einmal ein guter Freund in die Welt von Python eingeführt und mir die nötigen Basics dieser tollen Programmiersprache beigebracht.
Mit Hilfe der Bibliotheken „feedparser“ und „PyRSS2Gen“ konnte ich ein Python-Skript schreiben um dieses Problem umgehen.
Zuerst hole ich mit feedparser den Feed ab und baue später mit PyRSS2Gen einen neuen Feed im „RSS 2.0“-Format neu auf. Abschliessend schreibe ich diesen neuen Feed als XML-Datei in das Verzeichnis des Webservers.
Das Skript habe ich so umgebaut, dass eine beliebige iStockphoto-Benutzer-ID als Parameter übergeben werden kann. Auch die Ziel-Datei kann als Paramter übergeben werden.
Hier das Skript, welches in einem Repository auf Github gehosted ist:
#!/usr/bin/python
import datetime
import feedparser
import getopt
import os
import PyRSS2Gen
import sys
def create_latest_uploads_feed(targetPath, feedTitle, feedUrl, feedDescription, entries):
rssItems = []
for entry in entries:
rssItem = PyRSS2Gen.RSSItem(
title = entry['title'],
link = entry['link'],
description = entry['description'],
guid = PyRSS2Gen.Guid(entry['link']),
pubDate = entry['pubDate'],
author = entry['author']
)
rssItems.append(rssItem)
rss = PyRSS2Gen.RSS2(
title = feedTitle,
link = feedUrl,
description = feedDescription,
lastBuildDate = datetime.datetime.now(),
items = rssItems)
print 'Writing RSS feed: ' + targetPath
rss.write_xml(open(targetPath, 'w'))
print 'Done!'
def fetch_feed_and_create_rss(userId, targetPath):
feedUrl = "http://www.istockphoto.com/istock_myfiles_rss.php?ID=" + userId
print 'Fetching feed: ' + feedUrl
feed = feedparser.parse(feedUrl)
feedTitle = feed['feed']['title']
feedDescription = ""
entries = feed['entries']
preparedEntries = []
print 'Processing fetched entries. Entries found: ' + str(len(entries))
for entry in entries:
entryPubDate = entry['published']
pubDate = datetime.datetime.strptime(entryPubDate[:-6], '%Y-%m-%dT%H:%M:%S')
#pubDateClean = pubDate.strftime('%d.%m.%Y')
author = entry['author']
entryTitle = entry['title']
print ' * Entry title: ' + entryTitle.encode('utf-8')
link = entry['link']
summaryHtml = entry['summary']
preparedEntries.append({"pubDate":pubDate,"author":author,"title":entryTitle,
"description":summaryHtml,"link":link})
create_latest_uploads_feed(targetPath, feedTitle, feedUrl, feedDescription,
preparedEntries)
def main(argv):
scriptName = os.path.basename(__file__)
usageInfo = 'usage: ' + scriptName + ' -i -t '
userId = ''
targetPath = ''
try:
opts, args = getopt.getopt(argv,"hi:t:",["id=","targetpath="])
except getopt.GetoptError:
print usageInfo
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print usageInfo
sys.exit()
elif opt in ("-i", "--id"):
userId = arg
elif opt in ("-t", "--targetpath"):
targetPath = arg
if (userId and targetPath):
print 'User ID is: ' + userId
print 'Target path is: ' + targetPath
fetch_feed_and_create_rss(userId, targetPath)
else:
print usageInfo
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])
Genau genommen validiert der neue Feed immer noch nicht 🙂 allerdings sind die Fehler nun scheinbar weniger tragisch und er kann nun von „Embed RSS“ gelesen werden. Auch verwende ich nun zur Einbettung in WordPress „HungryFEED“ anstelle von „Embed RSS“, da dieses etwas mächtiger ist und bessere Templating-Option mitbringt.
Damit ich für die Webseite immer einen relativ aktuellen Feed erhalte, lasse ich das Skript mittels Crontab alle vier Stunden laufen:
#m h dom mon dow command
0 */4 * * * python /usr/local/bin/scriptXy.py -i 8197370 -t /dir/subdir/targetfile.xml