View of /CityKid/citykid/blogger.py
Parent Directory
| Revision Log
Revision:
2390 -
(
download)
(
as text)
Tue Oct 16 04:05:25 2007 UTC (16 years, 6 months ago) by
pje
File size: 3740 byte(s)
Updated for "blogger beta" API
from datetime import datetime, tzinfo, timedelta
from urllib2 import urlopen, Request, HTTPError
import re
try:
import xml.etree.cElementTree as ET
except ImportError:
try:
import cElementTree as ET
except ImportError:
import elementtree.ElementTree as ET
ZERO = timedelta(0)
HOUR = timedelta(hours=1)
ATOM_DATE = "%Y-%m-%dT%H:%M:%S%z"
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
# A class capturing the platform's idea of local time.
import time as _time
STDOFFSET = timedelta(seconds = -_time.timezone)
if _time.daylight:
DSTOFFSET = timedelta(seconds = -_time.altzone)
else:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
class LocalTimezone(tzinfo):
def utcoffset(self, dt):
if self._isdst(dt):
return DSTOFFSET
else:
return STDOFFSET
def dst(self, dt):
if self._isdst(dt):
return DSTDIFF
else:
return ZERO
def tzname(self, dt):
return _time.tzname[self._isdst(dt)]
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, -1)
stamp = _time.mktime(tt)
tt = _time.localtime(stamp)
return tt.tm_isdst > 0
Local = LocalTimezone()
USER_AGENT = 'PythonBlogger/0.1'
class Post:
def __init__(self, title, text, date=None, draft=False, postId=None, postURL=None):
self.title = title
self.text = text
self.draft = draft
self.postId = postId
self.postURL = postURL
if date is None:
date = datetime.utcnow().replace(tzinfo=utc)
if date.tzinfo is None:
date = date.replace(tzinfo=Local)
self.date = date
def as_atom(self):
return """<entry xmlns='http://www.w3.org/2005/Atom'>
<title type='text'>%s</title>
<content type='html'><![CDATA[%s]]></content>
</entry>""" % (self.title, self.text) #, self.date.strftime(ATOM_DATE))
class Blog:
def __init__(self, blogId, user, password):
self.blogId = blogId
self.atomURL = 'http://www.blogger.com/feeds/' + blogId + '/posts/default'
self.headers = {
'Authorization':'BASIC '+(user+':'+password).encode('base64').strip(),
'User-Agent': USER_AGENT, 'Content-type':'application/atom+xml',
}
req = Request(
"https://www.google.com/accounts/ClientLogin",
"Email=%s&Passwd=%s&service=blogger&source=PJE-CityKid-0.1"
% (user, password),
{'Content-type': 'application/x-www-form-urlencoded'}
)
for line in urlopen(req).read().splitlines():
key, val = line.split('=', 1)
if key=='Auth':
self.headers['Authorization'] = 'GoogleLogin auth='+val
break
def add(self, post):
try:
resp = urlopen( Request(self.atomURL, post.as_atom(), self.headers) )
except HTTPError, e:
if e.code!=201:
raise
else:
raise AssertionError
tree = ET.parse(e)
ns = '{http://www.w3.org/2005/Atom}'
for t in tree.getroot().findall(ns+'link'):
if t.attrib['rel']=='self':
if t.attrib['href'].startswith(self.atomURL) and post.postId is None:
post.postId = t.attrib['href'][len(self.atomURL)+1:]
elif t.attrib['rel']=='alternate' and post.postURL is None:
post.postURL = t.attrib['href']