GoogleAppEngineでRSS配信したい

更新日:2021.01.24 作成日:2012.01.28

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タグを加えてみると、なんだかうまく行ったみたい。。。

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

CDATAタグを埋め込んだ

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

次実装したい機能

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