ラベル 携帯サイト の投稿を表示しています。 すべての投稿を表示
ラベル 携帯サイト の投稿を表示しています。 すべての投稿を表示

2010-07-30

pythonさんでIPアドレス帯からキャリアを判別する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
pythonさんでキャリアを判別するためにIPアドレス帯の取得を以下を参考にさせていただいています。
http://d.hatena.ne.jp/tomisima/20070903/1188836400

こちらは各キャリアの利用IPアドレス紹介ページをパースすることで取得しています。
こちらで紹介しているDocomoをパースする部分は
return [ip for ip in re.findall(r'<li>([\d\./]+)%lt;/li>', content, re.M)]
となっているのですが、時折Docomoさんのページでは、
  • 202.229.176.0/24 (2010年7月上旬に追加予定)


  • のようにliタグの間にIPアドレス情報以外の文字が入っているとその部分は取得されません。

    なので以下のように私はしてみています。
    return [ip for ip in re.findall(r'<li>([\d\.]+/[\d]+).*</li>', content, re.M)]

    これで文字が入っていても取得できます。
    ただし未来の追加の部分もとってしまったりします。

    この取得したIPアドレス帯情報を利用してキャリア判別をしています。

    2009-11-28

    Google Static Maps APIで作成した地図画像を携帯で見ようとしても見れないことがある

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    Google Static Maps APIで地図画像を作れるわけですが、ソコニイクでもこの機能を使っています。
    この画像を携帯で見たときになんか見れたり見れなかったりすることがありました。
    見れなくてもリロードすれば見れたりすることが多かったわけですが、たまになんどリロードしてもダメなときもありました。
    同じ画面をPCの方から確認すると問題なく見れてしまう感じだったのです。

    私が持っている携帯の調子が悪いのかな?と思ったりもしたのですが、調べてみると似たようなことが他の人にも起こっていることがわかりました。

    http://okwave.jp/qa5396695.html
    が似たような現象で、どうも携帯だとGoogle Static Maps APIの回数制限にかかりやすい感じということがわかりました。
    そして、Google Static Maps API Version2にするのもよさそうな感じということがわかりました。
    しかし回数制限にひっかかるとメーターが振り切った画像が出ると書かれているのですが、私の現象では普通の画像リンク切れみたいな感じでちょっと違う感じもします。
    と思いつつソコニイクでもGoogle Static Maps API Version2に書き換えてみました。

    他にも調べてみると
    http://php.tekmemo.net/?p=1111
    という記事もあり、こちらは画像がリンク切れみたいな感じと私の現象により似ている感じです。
    コチラでは必須パラメータsensorの付け忘れが原因だったようで、私の場合はsensorはつけていたのでこちらも違う感じです。

    でいろいろ調べていたところ私がGoogle Static Maps APIを呼ぶときですが、以下のように呼ぶべきところを
    http://maps.google.co.jp/maps/api/staticmap?
    size=300x200&path=color:0xFF0000|weight:40|0,0|35,139&
    sensor=false&key=[MAPS_API_Key]
    &がエスケープ処理が係っていて&amp;となっていて
    http://maps.google.co.jp/maps/api/staticmap?
    size=300x200&amp;path=color:0xFF0000|weight:40|0,0|35,139&amp;
    sensor=false&amp;key=[MAPS_API_Key]
    となっていました。
    なのでこちらも直しました。

    そしたらなんか調子よくなってしまいました。
    APIをversion2にするのとエスケープ処理をとめるのを同時にやってしまったのでどちらが本当の原因だったのかわからなくなってしまいました。

    ちなみにGoogle Static Maps APIの呼び方にエラーがあった場合は、エラーメッセージが表示されるようです。
    <img src="http://maps.google.co.jp/maps/api/staticmap?
    size=300x200&path=color:0xFF0000|weight:40|0,0|35,139&
    sensor=false&key=[MAPS_API_Key]">
    としているとエラーになるとリンク切れにしか見えませんが
    <a href="http://maps.google.co.jp/maps/api/staticmap?
    size=300x200&path=color:0xFF0000|weight:40|0,0|35,139&
    sensor=false&key=[MAPS_API_Key]">test</a>
    としてリンク先を見ればエラーメッセージが確認できたりします。

    2009-10-03

    携帯からgoogle mapにリンクをはったり、グーグルのiアプリを起動したり

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    携帯サイトなどえも自分でgoogleのapiを利用して地図を作るのもよいのですが、なんだかんだで携帯さんのgoogleさんを利用できると便利なことが多いわけです。

    そんなわけで指定した場所で携帯googleマップにリンクを張る方法は、以下が参考になります。
    http://imakoko.didit.jp/imakoko_html/memo/parameters_google.html
    こちらでloncパラメータに緯度経度を指定できと書いてありますが、緯度経度は指定できずに地名しか指定できないようです。

    緯度経度を利用するならば、逆ジオコーディングをして住所などを割り出す必要があります。
    逆ジオコーディングは、以前書いた以下を参考にしていただけるとうれしいです。
    pythonさんでジオコーディングと逆ジオコーディング

    またdocomoでは、googleマップのiアプリも便利なわけなの起動のためのリンクなども用意すると便利な感じです。その方法は、以下が参考になります。
    http://saya.s145.xrea.com/archives/2007/08/post_258.html
    アプリ起動の際にqパラメータに緯度経度や地名を渡すことで指定した場所を中心にして起動できます。
    qパラメータにはkml(簡易のようですが)も渡すことができるそうです。

    2009-09-29

    pythonでモバイルAdSenseを使ってみる

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    ※この方法では、広告は表示されますがカウントがされていないことがわかりました。
    ※カウントされる方法はまだわかりません。
    ※※ カウントされないのはGoogle App Engineに配置したときのケースのようです。(追記 2010/5/20)

    携帯用のAdSenseを利用する場合は、PHP,perlなどのコードを貼り付けなさいと最終的になります。
    GoogleAppEngineを使っているならば、pythonで使ってみたくなるのです。
    なのでPythonで使ってみました。
    GoogleAppEngineでないならばurlfetchの部分は置き換えが必要です。
    後は、自分用の設定にするにはモバイルAdSenseで生成されたPHPなどのコードを見ながら適切に自分用の値を設定する必要があります。

    # -*- coding: utf-8; -*-
    from time import time
    from math import floor
    from urllib import urlencode
    from google.appengine.api import urlfetch

    def google_append_color(color,dt):
    color_array = color.split(',')
    return color_array[int(dt % len(color_array))]

    def google_ad(request):
    scheme = 'https://' if request.is_secure() else 'http://'
    dt = time()
    params = {
    'ad_type':'text_image',
    'channel':'設定したいchannelのコードを設定',
    'client':'ca-mb-' + '自分のAdSenseの値を設定',
    'dt':repr(floor(dt*time())),
    'format':'mobile_single',
    'https':request.META.get('HTTPS', ''),
    'ip':request.META.get('REMOTE_ADDR', ''),
    'markup':'xhtml',
    'oe':'utf8',
    'output':'xhtml',
    'ref':request.META.get('HTTP_REFERER', ''),
    'url':scheme + request.META.get('HTTP_HOST', '') + request.META.get('REQUEST_URI', ''),
    'useragent':request.META.get('HTTP_USER_AGENT', ''),
    'color_border':google_append_color('ここは色をカスタマイズするならば利用',dt),
    'color_bg':google_append_color('ここは色をカスタマイズするならば利用',dt),
    'color_link':google_append_color('ここは色をカスタマイズするならば利用',dt),
    'color_text':google_append_color('ここは色をカスタマイズするならば利用',dt),
    'color_url':google_append_color('ここは色をカスタマイズするならば利用',dt),
    }
    screen_res = request.META.get('HTTP_UA_PIXELS', '')
    delimiter = 'x'
    if screen_res == '':
    screen_res = request.META.get('HTTP_X_UP_DEVCAP_SCREENPIXELS', '')
    delimiter = ','
    if screen_res == '':
    screen_res = request.META.get('HTTP_X_JPHONE_DISPLAY', '')
    delimiter = '*'
    res_array = screen_res.split(delimiter)

    if len(res_array) == 2:
    params['u_w'] = res_array[0]
    params['u_h'] = res_array[1]

    muid = request.META.get('HTTP_X_DCMGUID', '')
    if muid != '':
    params['muid'] = muid
    muid = request.META.get('HTTP_X_UP_SUBNO', '')
    if muid != '':
    params['muid'] = muid
    muid = request.META.get('HTTP_X_JPHONE_UID', '')
    if muid != '':
    params['muid'] = muid
    muid = request.META.get('HTTP_X_EM_UID', '')
    if muid != '':
    params['muid'] = muid

    url = 'http://pagead2.googlesyndication.com/pagead/ads?' + urlencode(params)
    result = urlfetch.fetch(url)
    if result.status_code != 200:
    return None
    return result.content

    このgoogle_adで返された値を広告を貼り付けたい位置に出力するようにすればよいです。
    一応、試したら見ることはできたので動いているようです。

    2009-09-24

    携帯で位置情報を取るには、Cirius LabさんのGeoFormAPIがステキ

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    携帯サイトの醍醐味の一つは位置情報を取れることだと思うのですが、各会社毎に取得する手段が違うし、同じ会社でもGPSを使うものと基地情報(?)を使うものといろいろなわけです。
    そんな違いを吸収してくれるのがCirius LabさんのGeoFormAPIなのです。
    詳細は、以下をみてください。
    http://lab.cirius.co.jp/index.php?GeoPlatformAPI%2FGeoFormAPI
    これを利用すると、位置情報を取得するためのリンクを生成してくれます。
    生成した情報をクリックすると位置情報を取得して、指定したurlに位置情報をつけてもどしてくれます。

    pythonさんで利用するには、以下のような感じです。
    利用前提はgoogle app engineなのでurlfetchを使っていますが、使わないときは適当に置き換えてください。
    またdjangoを利用するのでrequestオブジェクトを受け渡しています。環境変数を取るときは違う手段を使っても良いと思います。

    # -*- coding: utf-8; -*-
    from urllib import urlencode
    from google.appengine.api import urlfetch

    def get_geo_form(request,return_uri,w='現在位置で探す'):
    params = {
    'ua':request.META.get('HTTP_USER_AGENT', ''),
    'return_uri':return_uri,
    'api_key':'APIを利用するためのAPIキーを指定します。',
    'display':w,
    }
    url = 'http://api.cirius.co.jp/v1/geoform/xhtml?' + urlencode(params)
    result = urlfetch.fetch(url)
    if result.status_code != 200:
    return None
    return result.content


    get_geo_formによって、リンクのhtmlを返すのでこれをそのまま使いたい場所に埋め込むことになります。

    docomoでinputタグはformできちんと囲わないと出力されない

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    docomo用のサイトをちょっといじっていて
    <input type="text" value="test">
    のようにテキストボックスを単独で表示しようとしたら表示されませんでした。

    きちんと
    <form action="/dummy">
    <input type="text" value="test">
    </form>
    のようにformタグで囲わないと出力されないようです。
    formタグで囲うときは、最低限actionは指定しないといけない感じです。

    2009-06-24

    Djangoで携帯サイト向けサイトを作るためにuamobileを使う

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    pythonで携帯サイトを作るためには、uamobileが便利なわけです。
    SOBARCOでもuamobileは使っているのですが、ちょっとバージョンが古く、今では結構変更されていました。

    そして今度は、Djangoで利用できるようしてみたのでその手順です。

    Djangoの環境作成は、ココをごらんください。

    まずuamobileを以下から取得します。
    http://pypi.python.org/pypi/uamobile/
    今回は、0.2.5を利用しています。
    取得したファイルを解凍してできたディレクトリにあるuamobileディレクトリをDjangoプロジェクトのルートディレクトリの直下にコピーします。

    uamobileではIPyというのも使っているようなので取得します。
    http://pypi.python.org/pypi/IPy
    今回は、0.63を利用しています。
    取得したファイルを解凍してできたディレクトリにあるIPy.pyをDjangoプロジェクトのルートディレクトリの直下にコピーします。

    私の環境ではuamobile/cidr.pyの先頭をコメントアウトしないいけませんでした。
    #from pkg_resources import resource_string
    


    これで使う準備が整いました。

    せっかくDjangoで利用するのでmiddlewareとしてどのページを見るときでも勝手にサイトを見ている端末を判別できるようにします。

    Djangoプロジェクトの直下にcommonディレクトリを作成します。
    commonディレクトリに内容が空の__init__.pyファイルを作ります。
    また、以下のmiddleware.pyを作成します。
    from uamobile import detect
    
    class UserAgentMobileMiddleware(object):
    def process_request(self, request):
    request.device = detect(request.META)
    

    こちらは、http://labs.unoh.net/2007/08/python_3.htmlを参考にさせていただきました。

    そしてsetting.pyのMIDDLEWARE_CLASSESに
    'common.middleware.UserAgentMobileMiddleware',
    を追加します。

    ちゃんと動いている確認します。
    Dyangoプロジェクト直下で
    python manage.py startapp myapp
    を実行します。

    そしてsetting.pyのINSTALLED_APPSにmyappを追加する。

    myapp/view.pyを以下のように編集する。
    from django.http import HttpResponse, HttpResponseRedirect
    from django.shortcuts import render_to_response
    
    def index(request):
    payload = dict()
    payload['docomo'] = request.device.is_docomo()
    payload['au'] = request.device.is_ezweb()
    payload['softbank'] = request.device.is_softbank()
    payload['pc'] = request.device.is_nonmobile()
    return render_to_response('index.html', payload)
    


    テンプレートも準備します。templates/index.htmlを以下のように編集します。
    <html>
    <head>
    <title>test</title>
    </head>
    <body>
    aaa<br>
    docomo:{{docomo}}<br>
    au:{{au}}<br>
    sofubank:{{softbank}}<br>
    pc:{{pc}}<br>
    </body>
    </html>
    


    urls.pyを以下のように変更する。
    urlpatterns = patterns('myapp.views',
    (r'^$', 'index'),
    )
    


    ここまで準備できたらrunserverでhttp://localhost:8000/にいろんな端末でアクセスしてみることで端末判別が行われていることがわかります。
    携帯サイトのテストには、FirefoxのアドオンであるFireMobileSimulatorがむちゃむちゃ便利です。

    ちょっとまとめるとDjangoの環境とは別にここまで追加したものは以下のような感じです。
    Djangoルート
    |-uamobile
    |-IPy.py
    |-common
    | |-__init__.py
    | |-middleware.py
    |-myapp
    | |-views.py
    |-templates
    |-index.html
    

    2008-09-16

    SOBARCOを作る時に参考にしたサイト

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    参考にしたサイトをメモ

    Google App Engineのドキュメント
    http://code.google.com/appengine/docs/
    http://groups.google.co.jp/group/google-app-engine-japan

    Pythonのドキュメント
    http://www.python.jp/doc/release/index.html

    iアプリのドキュメント
    http://www.ep.u-tokai.ac.jp/~nakazato/API/504i/base/jguide504_apiref020517/javadoc/overview-summary.html

    jQueryのドキュメント
    http://www.openspc2.org/JavaScript/Ajax/jQuery_study/ver1.2.6/index.html

    エンジニアのためのWebデザイン教室
    http://itpro.nikkeibp.co.jp/article/COLUMN/20080214/293856/

    WebプログラマのためのHTMLデザイン(その2)
    http://fromnorth.blogspot.com/2008/08/webhtml2.html

    HTMLタグ・CSS・JavaScript - Web制作のインデックスサイト
    http://www.tagindex.com/index.html

    Dynamic Drive CSS Library
    http://www.dynamicdrive.com/style/

    アイコン集
    http://speckyboy.com/2008/07/28/96-best-ever-free-icon-sets-for-web-designers-developers-and-bloggers/

    モバイルサイトをPCで見るためのツールやFirefoxアドオン
    http://blog.livedoor.jp/ld_directors/archives/51079649.html

    Firefoxでモバイル端末をシミュレートするアドオン「FireMobileSimulator」
    http://ke-tai.org/blog/2008/09/04/firemobilesimlator/

    2008-08-24

    pythonで文字列の中に携帯の絵文字が含まれているかどうかを確認する

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    pythonで文字列の中に絵文字が含まれるかどうかを確認しようとして以下のような関数を作ってみました。
    とりあえず、受け取るフォームはutf-8で作られているとしています。

    def include_emoji(str):
    '''指定文字列内に絵文字が含まれるかどうかを確認する

      引数
    str String チェック対象文字列(utf-8)
      戻り値
    Boolean'''
    if str is None:
    return False
    try:
    dummy = unicode(str,'utf-8').encode('euc_jp')
    except UnicodeEncodeError,UnicodeDecodeError:
    return True
    return False

    本当にこんなんでいいのかどうかよくわからないけど、簡易的に試した限りはうまくいく気配。
    でも、本当は携帯の絵文字をキャリア毎に変換することをやりたいと思ったのですが、pythonでのやり方がわからず挫折。
    perlやPHPでは変換モジュールみたいのがあるのですが、pythonでは見つからず。。。
    作り直すには技術が足らず。。。

    2008-07-01

    Amazonの個別商品ページを携帯で見る

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    AmazonのWEBサービスを利用することでアフィリエイトつきの商品個別のページのURLを取得することができますが、携帯でこのURLを見ようとするとどうも長すぎて見れないようです。
    なので携帯で見るには、別のURLを個別に生成する必要があるようです。

    以下が参考になります。
    http://tech.bayashi.jp/archives/entry/techweb/2006/001376.html
    http://aws.typepad.com/aws_jp/2005/07/amazon_.html

    携帯用には、以下のようなURLでいけるようです。
    http://www.amazon.co.jp/gp/aw/rd.html?uid=NULLGWDOCOMO&at=[ASSOCIATE_TAG]&a=[ASIN]&o=Add&dl=1&url=%2Fgp%2Faw%2Fc.html
    この[ASIN]の部分をWEBサービスで取得してうめることで携帯で見ることができるようです。

    2008-06-11

    pythonで携帯の機種判定

    このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
    pythonで携帯サイトを作ってみようかなぁとか、ちょっと思ってみたので調べたところ
    Pythonで携帯の機種判別をする
    があったので、ちょっと試してみました。
    まだちゃんと試してないですが、最近始まったiモードIDにも対応しているようです。
    以下のような感じで使えるようです。
    ------------------------
    from uamobile import detect
    dev = detect({'HTTP_USER_AGENT':os.getenv('HTTP_USER_AGENT'),'HTTP_X_DCMGUID':os.getenv('HTTP_X_DCMGUID')})
    iid = dev.guid
    ------------------------
    これで、携帯の機種判定ができるようです。
    後は、IPでのキャリア判定もしたい気がするので、その方法をそのうち調べてみましょう。