1. SIS Lab
  2. >
  3. Blog
  4. >
  5. GoogleAppEngineでRSS配信したい

GoogleAppEngineでRSS配信したい

更新日:2018.08.04 作成日: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(<span class="synConstant">&quot;SELECT * FROM Tweet ORDER BY date DESC&quot;</span>)
    <span class="synStatement">for</span> tweet <span class="synStatement">in</span> tweets:
        feed.add_item(
            title = tweet.content,
            link = tweet.urls[<span class="synConstant">0</span>],
            description = tweet.content,
            pubdate = tweet.date)

    <span class="synComment"># RSS 文字列にする</span>
    rss = feed.writeString(<span class="synConstant">&quot;utf-8&quot;</span>)
    self.response.headers[<span class="synConstant">'Content-Type'</span>]=<span class="synConstant">'text/xml; charset=utf-8'</span>
    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)

    <span class="synStatement">for</span> tweets <span class="synStatement">in</span> cursor:
        tweeturls = []
        <span class="synStatement">for</span> e <span class="synStatement">in</span> tweets.entities[<span class="synConstant">'urls'</span>]:
            tweeturls.append(e[<span class="synConstant">'expanded_url'</span>])

        <span class="synStatement">if</span> <span class="synIdentifier">len</span>(tweeturls) &gt; <span class="synConstant">0</span>:
            <span class="synStatement">if</span> lasttweet != <span class="synIdentifier">None</span>:
                <span class="synStatement">if</span> tweets.<span class="synIdentifier">id</span> &gt; lasttweet.<span class="synIdentifier">id</span>:
                    tweet = Tweet()
                    tweet.<span class="synIdentifier">id</span> = tweets.<span class="synIdentifier">id</span>
                    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が共有されている場合、その共有数と名前がわかるようにしたい
スポンサーリンク