Google App EngineでInstapaperのFeedをParseしてはてなに投稿するPythonコード

InstapaperのRSSをGAEでパースしてはてなブックマークにタグ[あとで読む]で投稿する。
はてブの投稿にはWSSE.pyを使う。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = "yadokari23"

import logging
import re
import os

import urllib, urllib2

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import db

from google.appengine.api import urlfetch
from google.appengine.api import mail
from xml.etree.ElementTree import *

import datetime

from WSSE import *

from google.appengine.api.labs import taskqueue

#はてな情報
HATENA_USERNAME='XXXXXXXX'
HATENA_PWD='XXXXXXXXX'

InstapaperURL='http://www.instapaper.com/rss/XXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX'

class Instpr(db.Model):
    title = db.TextProperty()
    link = db.LinkProperty()
    description = db.TextProperty()
    pubDate = db.TextProperty(required=True)
    task = db.BooleanProperty()
    
class MainHandler(webapp.RequestHandler):
    
    def get(self, mode=""):
        
        if mode=='parse_Instapaper_feed':
            #Instapaperのフィードをパースする
            results = urlfetch.fetch(url=InstapaperURL, method=urlfetch.GET, deadline=10)
            dom = fromstring(results.content)   
            if results.status_code == 200:
                if dom.findall('.//item'):
                    for e in dom.findall('.//item'):
                        q = Instpr.gql("WHERE link = :1", e.findtext('./link'))            
                        Instprrec = q.fetch(1)
                        if Instprrec is None:
                            p = Instpr(title=e.findtext('./title')
                                       ,link=e.findtext('./link')
                                       ,description=e.findtext('./description')
                                       ,pubDate=e.findtext('./pubDate')
                                       ,task=False)
                            p.put()
                            
            #task queue未登録のレコードを1件取り出す。
            Instprrec = Instpr.all().filter('task =', False).get()  
                
            if Instprrec:
                query={'link':Instprrec.link }
                #タスクbookmarkTwFavのインスタンスを作成し、タスクを追加
                bookmark_task  = taskqueue.Queue('hatebu')
                next_task = taskqueue.Task(url='/_hatebu', params=query)
                bookmark_task.add(next_task)
                
                Instprrec.task = True
                db.put(Instprrec)
                            
    def post(self, mode=""):
        
        if mode=='_hatebu':
            #はてブする
            url = self.request.get("link")
            #WSSE認証
            hbc = HatenaBookmarkClient(HATENA_USERNAME,HATENA_PWD)
            hbc.getServiceURI() # サービスエンドポイントの取得(PostURIとFeedURI)
            if url <> '':
                hbcomment = u'[あとで読む]'
                hbc.postBookmark(url, hbcomment) # ブックマークの登録
                
def main():
    #URLによってリクエストハンドラを切り替える
    application = webapp.WSGIApplication([('/(.*)', MainHandler)],
                                         debug=True)
    util.run_wsgi_app(application)


if __name__ == '__main__':
    main()