[Subversion] / CityKid / citykid / blogger.py  

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']





cvs-admin@eby-sarna.com

Powered by ViewCVS 1.0-dev

ViewCVS and CVS Help