Google App Engine の XMPPをPythonで書いてみる-2

Google App Engine でのxmppアプリその2。
今度は、メッセージを受信して、返信する機能を実装してみる。
作ってみたら、アプリ側から送信するよりも、受信してリプライする方が圧倒的に簡単だった。

注意点はapp.yamlにxmpp受信をするための定義が必要になる。それ以外は普通のwebアプリのpostと似たような感じで記述するだけだった。

app.yamlに次のような記述が必要

application: civic-site
version: 1
runtime: python
api_version: 1

handlers:
- url: /_ah/xmpp/message/chat/
  script: xmpp-test.py

inbound_services:
- xmpp_message

URLの定義は、普通のwebappと同じような感じだが、URLは専用の/_ah/xmpp/message/chat/になる。(末尾の/を忘れないように)
あと、xmpp受信のための設定として、inbound_servicesという設定が必要になる。

アプリの方はとてもシンプル。前回の送信よりもシンプルだ。

#!-*- coding:utf-8 -*-

import wsgiref.handlers
import logging
from google.appengine.ext import webapp
from google.appengine.api import xmpp

class XmppRecvSend(webapp.RequestHandler):
  def post(self):
    message = xmpp.Message(self.request.POST)
    message.reply("Hello World! - " + message.body)

def main():
  application = webapp.WSGIApplication(
      [
        ('/_ah/xmpp/message/chat/', XmppRecvSend)
      ], debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()

アプリケーションをマッピングするURLを先ほどの/_ah/xmpp/message/chat/とする。
アプリはpostで動作するCGIみたいに書くことができる。
POSTされたデータから、xmlpp.Messageオブジェクトを生成し、あとはそれを解析したり、replyをするだけで返答することができる。簡単。

受信返信アプリは、開発用サーバーでも動作確認することができる。
development consoleにXMPPという機能があるので、ここからbotアカウント宛に送信する。(app-id)@appspot.com。
botアカウントは、(anything)@(app-id).appspotchat.comの形式でいくつも定義することができるが、どこに送っても全部動くようだ。アプリ側で分岐するの?それでいいの?

これで、このbotアカウントに対して話しかけると、メッセージを”Hello World! – ” を付けてオウム返ししてきます。仕組み自体はこれだけです。あとはbotにどんなことをさせるのか、アイデアを出していきましょう。

サンワサプライが第3世代iPod touchケースをフライング発表

「第3世代iPod touchは、カメラ付き」という噂は、かなり確からしいですが、日本のケースメーカーからもうっかりと新型用ケースをフライング発表してしまったようです。

すでにWebサイトからは削除されて見えなくなっていますが、Google検索でキャッシュ表示すると、まだその様子が見ることができます。

カメラは上部の中央にあります。レンズ穴の脇にある凹みはなんのか?

Google App Engine の XMPPをPythonで書いてみる-1

Google App Engine(GAE)のバージョンアップで、XMPPをサポートするようになった。これによって、Google Talkのbotなどを簡単に作ることができる。GAEについては、Java版は記事が多いけど、Pythonはあまり見かけないので、さくっとサンプルを書いてみる。

とりあえず今回はアプリ(botアカウント)からの送信。

APIを使って、toのアドレスを指定して送信するだけなのでかなり楽ちん。
受ける側はXMPPをサポートすればなんでも良いんだろうけど、手っ取り早いのはGmailアカウントのGoogle Talkを使う。

送信側botアカウントは、このコードのように何も指定しない場合は、デフォルトのアカウント(app-id)@appspot.comが使われる。apiの引数に指定することで違うアカウントも使用可能。その場合は、
(任意のid)@(app-id).appspotchat.com
のように指定する。任意のIDが使えるこっちはドメイン部分がappspotではなく、appspotchatなので注意。

Google Talkで試す場合には、最初にGoogle Talkを利用するよう招待を送り、マイミクみたいな関係にならないといけない。(そうじゃないとSPAM送りまくれちゃう)
bot側から招待送るにはコード書かないと行けないので、受信側のGoogle Talkアカウントから招待を(app-id)@appspot.comに送る。すぐに自動的に承認される。

あとはこのWebアプリに対してリクエスト(http://(app-id).appspot.com/xmpp/send)を送ると、
chatメッセージがGoogle Talkアカウントに送信される。とても簡単。
開発サーバーでは送信されないので注意。(コンソールにログが出るだけ)

#!-*- coding:utf-8 -*-

import wsgiref.handlers
import logging
from google.appengine.ext import webapp
from google.appengine.api import xmpp

class XmppSend(webapp.RequestHandler):
  def get(self):
    to_address = "(foo-bar)@gmail.com"               ←Gmalアカウントなどに書き換える
    chat_message_sent = False

    if xmpp.get_presence(to_address): #if to-user is online
      status_code = xmpp.send_message(to_address, "Hello XMPP!!")  #send
      chat_message_sent = (status_code == xmpp.NO_ERROR)  #judge status
    else:
      logging.info("offline")

    if chat_message_sent:
      self.response.out.write("send message.");
    else:
      self.response.out.write("not send.");

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

if __name__ == "__main__":
  main()