Forum: Uppgift, cron-script

Forum huvudsida -> Förslag och buggar -> Uppgift, cron-script

Sidor: 1

Till botten

Independence 14:01 - 7:e September 2006 | Post #1
Administratör
Inlägg: 1800


Skicka PM
Jag har hittat en liten uppgift som någon skulle kunna få försöka sig på att klara av. Detta är ett perfekt tillfälle om man vill hjälpa till lite med Blinkenlights! Smiley

Uppgiften går ut på att skapa ett script i Python eller PHP som hämtar ett antal RSS-flöden från vårat projektsystem och tar ut det senaste elementet för att sedan konvertera om detta till HTML.
RSS scripten hittas på adressen: http://marcusson.no-ip.com/projects/PoppilussII/timeline?milestone=on&ticket=on&changeset=on&wiki=on&max=50&daysback=90&format=rss
Byt ut PoppilussII i URLen mot de andra projektnamnen för att få alla projekt. Tillgängliga projekt går att se på http://marcusson.no-ip.com/projects/

Utdatan har förslagsvis namnet på händelsen (t ex changeset 141) samt datum och eventuell kommentar. Datan ska sedan visas på den framtida startsidan hade jag tänkt, så man kan se vilka projekt som är aktiva.

Både Python och PHP har XML parsers som bygger på Expat, använd förslagsvis dessa Smiley

Om det är någon som är intresserad så är det bara skriva ett inlägg och sätta igång.

-------------------------

Vi är riddarna som säger fiskbulle!





nibbo 15:02 - 7:e September 2006 | Post #2
Administratör
Inlägg: 446


Skicka PM
Tror det är lite för anvancerat för mig, men hade annars gärna hjälpt till.

-------------------------
Ja! Det är en ,,KTA pungsvansknapp på min avatar!



HärJ 19:23 - 8:e September 2006 | Post #3
Moderator
Inlägg: 1198


Skicka PM
låter intressant, ska se om jag får tid över isf får du det
vänta inte för länge bara Smiley

-------------------------
Tänk om jag vore en skalärprodukt!



Independence 10:22 - 11:a September 2006 | Post #4
Administratör
Inlägg: 1800


Skicka PM
Pillade lite på ett script nu, fungerar inte helt perfekt men nästan. Utgångsfilen är rss:en fast med max=1 istället för max=50.

  1.  
  2. import pyexpat, email.Utils, time
  3.  
  4. # Don't get values from the file before these posisions have been found
  5. date_start = 0
  6. title_start = 0
  7. desc_start = 0
  8. item_start = 0
  9.  
  10. def start_element(name, attrs):
  11. global date_start, title_start, desc_start, item_start
  12. if name == 'item':
  13. item_start = 1
  14. elif name == 'pubDate':
  15. date_start = 1
  16. elif name == 'title':
  17. title_start = 1
  18. elif name == 'description':
  19. desc_start = 1
  20.  
  21. def char_data(data):
  22. global date_start, title_start, desc_start, item_start
  23.  
  24. if item_start == 1:
  25. print 'Ok!'
  26. # Get date, using email function to parse date string
  27. if date_start == 1:
  28. dt = email.Utils.parsedate(data)
  29. print 'Timestamp: "', str(time.mktime(dt)),'"'
  30. date_start = 0
  31. # Get title of item
  32. elif title_start == 1:
  33. print 'Title: "', data, '"'
  34. title_start = 0
  35. # Get description of item
  36. elif desc_start == 1:
  37. print 'Description: "', data, '"'
  38. desc_start = 0
  39.  
  40. p = pyexpat.ParserCreate()
  41.  
  42. f = file('/home/independence/python/data/rss.xml')
  43.  
  44. p.StartElementHandler = start_element
  45. p.CharacterDataHandler = char_data
  46.  
  47. p.ParseFile(f)




-------------------------

Vi är riddarna som säger fiskbulle!





ozamosi 10:40 - 11:a September 2006 | Post #5
Administratör
Inlägg: 1129


Skicka PM
Ah, precis när jag skrev ett skript också...

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from xml.sax import make_parser
  4. from xml.sax.handler import ContentHandler
  5. import urllib
  6.  
  7. BASEURL = "http://marcusson.no-ip.com"
  8. # This one really should start with a slash (shouldn't max days be less
  9. # than 90?):
  10. RSSURL = "/timeline?milestone=on&ticket=on&changeset=on&wiki=on&max=1&daysback=90&format=rss"
  11.  
  12.  
  13. # XML parsing classes:
  14.  
  15. class Projectparser(ContentHandler):
  16. '''Get the href-part of a link. This is used to get a list of projects'''
  17. projectlist = []
  18. def startElement(self, name, attrs):
  19. if name == "a":
  20. if attrs.has_key("href"):
  21. self.projectlist.append(attrs.get("href"))
  22.  
  23. class RSSParser(ContentHandler):
  24. '''Get an item from an RSS feed. If more than one item is found,
  25. this will go kaboom'''
  26. class ItemStruct(object):
  27. '''A simple structure for storing item data'''
  28. title = ""
  29. date = ""
  30. link = ""
  31. description = ""
  32. def __init__(self):
  33. self.item = self.ItemStruct()
  34. self.is_item = False
  35. self.is_title = False
  36. self.is_date = False
  37. self.is_link = False
  38. self.is_description = False
  39. def startElement(self, name, attrs):
  40. if self.is_description: #descriptions can contain XML tags.
  41. self.item.description += "<%s" % (name,)
  42. for attr in attrs.keys():
  43. self.item.description += " %s=\"%s\"" % (attr, attrs.get(attr))
  44. self.item.description += ">\n"
  45. elif name == "item":
  46. self.is_item = True
  47. elif self.is_item == True:
  48. if name == "title":
  49. self.is_title = True
  50. elif name == "pubDate":
  51. self.is_date = True
  52. elif name == "link":
  53. self.is_link = True
  54. elif name == "description":
  55. self.is_description = True
  56.  
  57. def endElement(self, name):
  58. if name == "item":
  59. self.is_item = False
  60. elif self.is_item == True:
  61. if name == "title":
  62. self.is_title = False
  63. elif name == "pubDate":
  64. self.is_date = False
  65. elif name == "link":
  66. self.is_link = False
  67. elif name == "description":
  68. self.is_description = False
  69. elif self.is_description == True:
  70. self.item.description += "</%s>" % (name,)
  71.  
  72. def characters(self, ch):
  73. if self.is_title:
  74. self.item.title += ch
  75. elif self.is_date:
  76. self.item.date += ch
  77. elif self.is_link:
  78. self.item.link += ch
  79. elif self.is_description:
  80. self.item.description += ch
  81.  
  82. project = urllib.urlopen("http://marcusson.no-ip.com/projects/")
  83.  
  84. # The HTML is validating XML in this case (if indy brakes this
  85. # assumtion, he'll have to fix it himself), and thus we can parse it as
  86. # XML
  87. parser = make_parser()
  88. projectparser = Projectparser()
  89. parser.setContentHandler(projectparser)
  90. parser.parse(project)
  91.  
  92. # Now, parse the RSS the very same way:
  93. for project in projectparser.projectlist:
  94. url = BASEURL+project+RSSURL
  95. rssobject = urllib.urlopen(url)
  96. rssparser = RSSParser()
  97. parser.setContentHandler(rssparser)
  98. parser.parse(rssobject)
  99. projectname = project.split("/")[2]
  100. print "<h1>%s</h1>" % (projectname,)
  101. if rssparser.item.date:
  102. if rssparser.item.link:
  103. print "<a href=\"%s\"><h2>%s</h2></a>" % (rssparser.item.link,
  104. rssparser.item.title)
  105. else:
  106. print "<h2>%s</h2>" % (rssparser.item.title,)
  107. print "<p>%s</p>" % (rssparser.item.date,)
  108. if rssparser.item.description:
  109. if rssparser.item.description.startswith("<p"):
  110. print rssparser.item.description
  111. else:
  112. print "<p>%s</p>" % (rssparser.item.description,)
  113. else:
  114. print u"<p>%s har inte gjort några uppdateringar på senaste tiden</p>" % (projectname,)


-------------------------
Ljusblå

Senast redigerad 10:44 - 11:a September 2006


Sidor: 1

Forum huvudsida -> Förslag och buggar -> Uppgift, cron-script
Atom feed

Du får inte posta i den här tråden | Till toppen