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()