>>from nntplib import NNTP
from time import strftime,time,localtime
from email import message_from_string
from urllib.request import urlopen
import textwrap
import re
day=24*60*60
def wrap(string,max=70):
return '\n'.join(textwrap.wrap(string))+'\n'
class NewsAgent:
def _init_(self):
self.sources = []
self.destinations = []
def addSource(self,source):
self.sourcess.append(source)
def addDestination(self,dest):
self.destinations.append(dest)
def distribute(self):
items = []
for source in self.sources:
items.extend(source.getItems())
for dest in self.destinations:
dest.receiveItems(item)
class NewsItem:
def _init_(self,title,body):
self.title = title
self.body = body
class NNTPSource
def _init_(self,servername,group,window);
self.servername = servername
self.group = group
self.window = window
def getItems(self)
start = local(time() - self.window*day)
date = strftime('%y%m%d',start)
hour = strftime('%H%M%S',start)
server = NNTP(self.servername)
ids = server.newnews(self.group,date,hour)[1]
for id in ids:
lines = server.article(id)[3]
message = massage_from_string('\n'.join(lines))
titile = message['subject']
body = message.get_payload()
if message.is_multipart():
body = body[0]
yield NewsItem(title,body)
server.quit()
class SimpleWebSource
def _init_(self,url,titilePattern,bodyPattern):
self.url = url
self.titlePattern = re.compile(titlePattern)
self.bodypattern = re.compile(body)
def getItems(self):
text = urlopen(self.url).read()
titles = self.titilePattern.findall(text)
bodies = self.bodyPattern.findall(text)
for title,body in zip(titles,bodies):
yield NewsItem(titile,wrap(body))
class PlainDestination:
def receiveItems(self,items):
for item in items:
print item.title
print '-'*len(item.title)
print item.body
class HTMLDestination:
def _init_(self,filename):
self.filename = filename
def receiveItems(self,items):
out = open(self.filename,'w')
print >> out,"""
<html>
<head>
<title>Today's News</title>
</head>
<body>
<h1>Today's News</h1>
"""
print >> out, '<ul>'
id = 0
for item in items:
id += 1
print >> out, '<li><a href="#%i">%s</a></li>'%(id.item.title)
print >> out, '</ul>'
id = 0
for item in items:
id += 1
print >> out, '<h2><a name="%i">%s</a></h2>'%(id.item.title)
print >> out, '<pre>%s</pre>'%item.body
print >> out,"""
</body>
</html>
"""
def runDefaultSetip()
agent = NewsAgent()
163_url = 'http://www.163.com/rss'
163_title = r'(?s)a href="[^"]*">\s*<b>\s*(.*?)\s*</b>'
163_body = r'(?s)</a>\s*<br />\s*(.*?)\s*<'
163 = SimpleWebSource(163_url,163_title,163_body)
agent.addSource(163)
clpa_server = 'news.foo.bar'
clpa_group = 'comp.lang.python.announce'
clpa_window = 1
clpa = NNTPSSource(clpa_server,clpa_group,clpa_window)
agent.addSource(clpa)
agent.addDestination(PlainDestination())
agent.addDestination(HTMLDestination('news.html'))
agent.distribute()
if _name_ == '_main_': runDefaultSetup()