みまもりケータイから送られて来た位置情報付きメールのURLを開くことは出来ない。
プリモバイルのメールし放題でGAEに転送して、代わりに地図の画像を取得して返信してもらう。
地図の画像の取得にはYahoo!デベロッパーネットワークのスタティックマップAPI、住所取得にはリバースジオコーダAPIを使っています。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# mimamori_simplemap.py 2011.8.3
import logging
import os
import datetime
import re
import urllib
from django.utils import simplejson
from google.appengine.api import app_identity
from google.appengine.api import urlfetch
from google.appengine.api import mail
from google.appengine.ext import webapp
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
from google.appengine.ext.webapp.util import run_wsgi_app
import yahoo_dev
def getgeo(text):
pat = r'N(?P\d+)\.(?P\d+)\.(?P\d+\.\d+)E(?P\d+)\.(?P\d+)\.(?P\d+\.\d+)'
m = re.search(pat, text)
if m:
lat = float(m.group('d1')) + float(m.group('m1')) / 60 + float(m.group('s1')) / 3600
lon = float(m.group('d2')) + float(m.group('m2')) / 60 + float(m.group('s2')) / 3600
return (lat, lon)
else:
return None
def yahoo_static_map(geo):
api_url = "http://map.olp.yahooapis.jp/OpenLocalPlatform/V1/static"
params = {
'appid': yahoo_dev.my_appid,
'pin': str(geo[0]) + "," + str(geo[1]),
'width': "480",
'height': "480",
'z': "19",
}
query = urllib.urlencode(params)
result = urlfetch.fetch(api_url + '?' + query)
if result.status_code == 200:
return result.content
else:
return None
def yahoo_revgeo(geo):
api_url = "http://reverse.search.olp.yahooapis.jp/OpenLocalPlatform/V1/reverseGeoCoder"
params = {
'appid': yahoo_dev.my_appid,
'lat': str(geo[0]),
'lon': str(geo[1]),
'output': 'json',
}
query = urllib.urlencode(params)
result = urlfetch.fetch(api_url + '?' + query)
if result.status_code == 200:
json_str = result.content
obj = simplejson.loads(json_str)
address = obj['Feature'][0]['Property']['Address']
logging.info(u"位置情報:" + address)
return address
else:
return u"位置情報は取得できませんでした."
class simplemap_email(InboundMailHandler):
def receive(self, mail_message):
path = self.request.path
logging.info("path: " + path)
logging.info("Received a message from: " + mail_message.sender)
body_text = image_data = ""
plaintext = mail_message.bodies(content_type='text/plain')
for text in plaintext:
txtmsg = text[1].decode()
logging.info("Body is %s" % txtmsg)
geo =getgeo(txtmsg)
logging.info(geo)
if geo:
body_text = yahoo_revgeo(geo)
image_data = yahoo_static_map(geo)
break
message = mail.EmailMessage()
message.sender = "simplemap@" + app_identity.get_application_id() + ".appspotmail.com"
message.to = mail_message.sender
message.subject = u"位置情報 " + mail_message.subject
message.body = u"現在地:\n" + body_text
if image_data:
message.attachments = [("map.png", image_data)]
message.send()
application = webapp.WSGIApplication([
simplemap_email.mapping(),
], debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
---
0 件のコメント:
コメントを投稿