2012/04/05

GAE/Python(webapp)を使ってLingr botで遊ぶ(下)

ではとりあえず目標としておうむ返しが出来るようにしましょうか。
以前こんなことを書いていた。


any time a human being speaks in your room, we send a JSON message to the URL, embedded in the POST body (line feeds are not included)
ある時人間があなたの部屋で発言すると、JSONメッセージをPOSTへ組込んでURLへ送信します(ラインフィード(改行)は含まれないよ)


Q.あっれェー、受け取ったデータどこやった?

A.前回のソースにおいては完全に無視してました。

とりあえず本題に入る前に、WebObのリファレンスをざっと眺めて欲しい。
そして以下のソースである。

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from django.utils import simplejson
class MainHandler(webapp.RequestHandler):
    def post(self):
        eventsdata = simplejson.loads(self.request.body)['events']
        message = simplejson.dumps(eventsdata[0])
        res = simplejson.loads(message)['message']['text']
        self.response.headers["Content-Type"] = "text/plain"
        self.response.out.write(res)

application = webapp.WSGIApplication(
        [('/', MainHandler)],
        debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()


6行目でJSONデータをまるっと受け取っている(self.request.bodyね)。
そのためコレをそのまま表示するとLingr Bot APIの
チュートリアルページにあるような形式がそのまま発言として現れる。

で、ここからが結構ハマった。
simplejsonで受け取ったデータをlist型かdict型にぶち込みたかったんだけど
どうにもネストを解釈してくれないようで、肝心の"events"以下がまるっとstr型だった。

そこでself.request.bodyはJSON形式で受取れるので
キーを['events']と指定してmessageとかそこら辺が含まれるデータを変数へ。
しかしloads -> dumps -> loadsという流れ、つまりデコード、エンコード、デコードという
アホなことをしてるのでものすごく鈍くさい。
コレは他の方法があると思うんだけど、今のところ実現できないのでツッコミ待ち。
(職業プログラマが実務でこんなことしたら多分怒られるんじゃないかと)

ちなみに、他の人がどうやってるか見たところsimplejson.dumpsってのが多い(2008年前後の情報)。
でもこれだとJSON形式をまたJSON形式にエンコードしてることになっちゃう。
多分これはLingrの仕様が変わったことによって今は使えない手法なんじゃないかなー。
simplejsonのリファレンスについては右のリンクから -> simplejson 2.5 doc

ともあれ、コレで発言に対しておうむ返しをするbotもどきができ上がりました。
まぁコレならスタートラインとして問題ないでしょう。
textキーのvalueをYahoo! テキスト解析Web APIなんかに喰わせて、
datastoreに叩き込めばさらにアレコレ遊べると予想してるのでそれはそのうち実践。

ま、そんな感じで。
それでは、電波送信終了ー。

0 件のコメント:

コメントを投稿