GAEで僕にも彼女が出来たよー(XMPP/Mail編)
ちょうどAppEngineでXMPPやメール受信を試していて何に使えるかな?とネタを探していたところ、彼女を作ってる人が居たので僕も彼女を作ってみました。
僕の彼女はこんなのです。
- XMPPで話しかけるとズレた返信を返してくれる。
- メールにも答えてくれる。
彼女の詳細は以降で説明します。
XMPP彼女
現時点でAppEngineの日本語ドキュメントにはXMPPの記述が無いのですが、英語に切り替えるとServiceメニューの下にXMPPが登場します。使い方は結構簡単で以下のポイントを押さえればすぐに使えました。
まずXMPPメッセージの受信を行うには app.yaml に以下のような設定を追加してやります。これにより /_ah/xmpp/message/chat/ でXMPP受信用のハンドラを割り当てできるようになります。
inbound_services: - xmpp_message
後はXMPP用のハンドラで xmpp.Message(self.request.POST) をするとXMPPメッセージのパースが出来るので後は良しなにしてやれば良い。
肝心な AppEngine のJID(XMPPアカウントのアドレス)はどうなるのか?ということだが、app-id@appspot.com もしくは 任意@app-id.appspotchat.com が使えるようです。
さて、実際に動作する XmppKanojoHandler のソースはこんな感じになりました。
class XmppKanojoHandler(webapp.RequestHandler): def post(self): """ 任意@my-kanojp.appspotmail.com か my-kanojo@appspot.com にチャットの招待状を送って彼女にしよう! Googleトークの場合は左下の「+追加」ボタンから招待状が送れます。 """ receive_message = xmpp.Message(self.request.POST) receive_message.reply(random.choice(messages['reply']))
メール彼女
メール受信も現時点では日本語ドキュメントに無いのですが、やはり英語に切り替えるとService>Mailメニューの下にReceiving Mailが登場します。
メールの受信を行うには app.yaml に以下のような設定を追加してやります。これにより /_ah/mail/(.+) でXMPP受信用のハンドラがを割り当てできるようになります。このときurlの$1に当たる部分に受信に使われたメールアドレスが入ります。
inbound_services: - mail
後は mail.InboundEmailMessage(self.request.body) で受信したメールの内容が取得出来るので適当に処理してやればOKです。
受信に使えるメールアドレスは 任意@app-id.appspotmail.com になるようです。
実際に動作する XmppKanojoHandler のソースはこんな感じになりました。
class MailKanojoHandler(webapp.RequestHandler): def post(self, delivered_to): """ 任意@my-kanojp.appspotmail.com 宛にメールすると彼女が返信してくれるよ! """ delivered_to = urllib.unquote(delivered_to) receive_message = mail.InboundEmailMessage(self.request.body) mail.send_mail(sender = delivered_to, to = receive_message.sender, subject = 'Re: ' + receive_message.subject, body = random.choice(messages['reply']) )
雑感
- GAEではXMPPもメール受信も結構簡単に扱えるということが分かりました。
- 本当はサイト上で人格を複数作ってそれぞれメッセージ登録をできるようにしたりとかもうちょっと無脳部分をつくってみようかと思ったんですが、今回は手抜きで外村さんの彼女を真似してしまいました(^^;
- あと今回作ったXMPP/Mail彼女は作ってから思ったんだけど、自分だけの彼女じゃなくて声かけられた相手には誰にでも答えてしまうビッチになってしまったな…。
- ソースは http://github.com/kawaz/my-kanojo/tree/master/src/ に置いてあります。