GoogleAppEngineでRSS配信したい

移転しました。

twitterのリストから取得した情報をRSSとして配信したい。

参考にしたページ

from django.utils import feedgenerator
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import db
from google.appengine.ext.webapp import template

class Rss(webapp.RequestHandler):
    def get(self):
        # フィード作成
        feed = feedgenerator.Rss201rev2Feed(
            title = "extweet",
            link = "RSSのURL",
            description = "RSSの説明",
            language = u"ja")

        tweets = db.GqlQuery("SELECT * FROM Tweet ORDER BY date DESC")
        for tweet in tweets:
            feed.add_item(
                title = tweet.content,
                link = tweet.urls[0],
                description = tweet.content,
                pubdate = tweet.date)
    
        # RSS 文字列にする
        rss = feed.writeString("utf-8")
        self.response.headers['Content-Type']='text/xml; charset=utf-8'
        self.response.out.write(rss)

def main():
    application = webapp.WSGIApplication([('/rss',Rss)],
                                         debug=True)
    util.run_wsgi_app(application)


if __name__ == '__main__':
    main()
(中略)
        if lasttweet != None:
            cursor = tweepy.Cursor(api.list_timeline,owner=OWNER,slug=SLUG,since_id=lasttweet.id,include_entities='true').items(100)
        else:
            cursor = tweepy.Cursor(api.list_timeline,owner=OWNER,slug=SLUG,include_entities='true').items(100)

        for tweets in cursor:
            tweeturls = []
            for e in tweets.entities['urls']:
                tweeturls.append(e['expanded_url'])

            if len(tweeturls) > 0:
                if lasttweet != None:
                    if tweets.id > lasttweet.id:
                        tweet = Tweet()
                        tweet.id = tweets.id
                        tweet.urls = tweeturls
                        tweet.title = tweets.text
                        tweet.content = tweets.text
                        tweet.save()
                        self.response.out.write(tweets.text)

なぜかこれだと、Bylineで読み込んだときに、空白のページになってしまった。
RSSの仕様を見ると、エンティティエンコードされたHTMLが使えますとのこと。もしかして、これかと思って、CDATAタグを加えてみると、なんだかうまく行ったみたい。。。

んー、何が原因だったんだろう?

RSS 2.0 Specification 日本語訳 - futomi's CGI Cafe
description がテキスト(エンティティーエンコードされた HTML が使えます。例をご覧下さい。)を含んでいるなら、その item はそれ自身で完結するかもしれません。 ...


Encoding & item-level descriptions (RSS 2.0 at Harvard Law)


CDATAタグを埋め込んだ

  tweet = Tweet()
  tweet.id = tweets.id
  tweet.urls = tweeturls
  tweet.title = tweets.text
  content = "<![CDATA[" + tweets.text + "<a href=\"" + tweeturls[0] + "\">" + tweeturls[0] + "</a>" + "]]>"
  tweet.content = content
  tweet.save()

次実装したい機能

  • 自分に必要なURLだけを、抽出したい。(foursquereとか, 写真とか省きたい)
  • 一日のURLをまとめて, Evernoteに送りたい
  • 誰が共有したのかをわかるようにしたい
  • 同じURLが共有されている場合、その共有数と名前がわかるようにしたい