2008/05/01


幾らかのサーバにしか対応出来ていませんが、とりあえずリリース。
現在
  • はてなダイアリー
  • はてなグループダイアリー
  • ライブドアブログ
  • Seesaa ブログ
  • Nowa
に対応出来ています。入力欄にpermalinkを入力して「Generate RSS」をクリックするとフィードが表示されます。
BeautifulSoupを使っているので、あまり白熱したコメント欄だとサーバが火を噴くかもしれません。
また過激な議論、18才未満に相応しく無いもの等は、強制でフィード出力を停止する場合があります。

CommentRSS
よろしかったら使ってみて下さい。
Posted at by



2008/04/24


書き換えてしまえ...
*** elementtree/ElementTree.py.orig Thu Apr 24 21:02:09 2008
--- elementtree/ElementTree.py  Thu Apr 24 21:34:42 2008
***************
*** 1252,1254 ****
--- 1252,1267 ----
          tree = self._target.close()
          del self._target, self._parser # get rid of circular references
          return tree
+
+ try:
+     from xml.parsers import expat
+ except ImportError:
+     import xmllib
+     import SimpleXMLTreeBuilder
+     def __init__fake(self, html=0):
+         self.__init__orig(html)
+         xmllib.XMLParser.__init__(self, accept_utf8=1)
+     clazz = SimpleXMLTreeBuilder.TreeBuilder
+     clazz.__init__orig = clazz.__init__
+     clazz.__init__ = __init__fake
+     XMLTreeBuilder = SimpleXMLTreeBuilder.TreeBuilder
ちなみにpatch当てなくても、ElementTree.pyの最下行に
try:
    from xml.parsers import expat
except ImportError:
    import xmllib
    import SimpleXMLTreeBuilder
    def __init__fake(self, html=0):
        self.__init__orig(html)
        xmllib.XMLParser.__init__(self, accept_utf8=1)
    clazz = SimpleXMLTreeBuilder.TreeBuilder
    clazz.__init__orig = clazz.__init__
    clazz.__init__ = __init__fake
    XMLTreeBuilder = SimpleXMLTreeBuilder.TreeBuilder
を足せば出来上がる。こうすると大概のものは小細工無しに動くと思う。たぶん
エラーが出てたGoogle App Engineのサンプル、muvmuvのレビュービルド「http://localhost:8080/build」も問題なく通った。
良いやり方ではないですが...
Posted at by




Google App EngineでwebSimple.pyを使って作りました。

twitterのfollower発言で、漢字が読めなかった貴方。「@mattn_jp それなんて読むの?」とか聞くのが恥ずかしい貴方。そんな貴方にピッタリのサービスです。twitter followerの発言に「読み」を付けて表示します。(まぁ私は難しい単語なんて使いませんが...)

文字の分解にはYahoo! JAPANの「日本語形態素解析Webサービス」を使用しています。

色の変っている部分にマウスを当てると、ツールチップにて読みを教えてくれるようになっています。

よみふったー
で、いきなりですが「よみふったー」のソースです。
ライブラリとしてはwebSimple.pyのほかにPyWrapperに含まれるElementTree、BeautifulSoupを使っています。
#!-*- coding:utf-8 -*-
import os
import re
import base64
import xmllib
import logging
import elementtree.SimpleXMLTreeBuilder as xmlbuilder
import wsgiref.handlers
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from BeautifulSoup import BeautifulSoup
from webSimple import Simple as webSimple

class MainPage(webapp.RequestHandler):
  def post(self):
    twitter_user = self.request.get('twitter_user').encode('utf-8', 'replace')
    template_valuse = {
        'twitter_user' : twitter_user,
        'statuses' : []
    }
    try:
      twitter_url = "http://twitter.com/statuses/user_timeline/%s.xml" % twitter_user
      twitter = webSimple({ 'base_url': twitter_url })
  
      yahoo = webSimple({
        'base_url': 'http://api.jlp.yahoo.co.jp/MAService/V1/parse',
        'param' : { 'appid' : 'xxxxxxxx', 'results' : 'ma', },
      })
  
      xml = twitter.get().content
      r = re.compile(r'(\&#\d+;)')
      for st in BeautifulSoup(xml)('status'):
        name = r.sub(lambda x: unichr(int(x.group(1)[2:-1])), st.user.screen_name.string).encode('utf-8', 'replace')
        msg = r.sub(lambda x : unichr(int(x.group(1)[2:-1])), st.text.string).encode('utf-8', 'replace')
        xml = yahoo.get({ 'sentence': msg }).content
        words = []
        for word in BeautifulSoup(xml)('word'):
          words.append({
            'reading' : word.reading.string.encode('utf-8', 'replace'),
            'pos' : word.pos.string.encode('utf-8', 'replace'),
            'surface' : word.surface.string.encode('utf-8', 'replace'),
          })
        template_valuse['statuses'].append({
           'screen_name' : name,
           'words' : words,
        })
    except Exception, e:
      template_valuse['error'] = e
      pass
    path = os.path.join(os.path.dirname(__file__), 'yomifutter.html')
    self.response.out.write(template.render(path, template_valuse))

  def get(self):
    path = os.path.join(os.path.dirname(__file__), 'yomifutter.html')
    self.response.out.write(template.render(path, {}))

def main():
  application = webapp.WSGIApplication([('/yomifutter/', MainPage)], debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()
適当なコードで申し訳ない...汗
Posted at by