携帯の公式のユーザIDを取得する
昨今のHTTP::MobileAgentのプラグイン話を真っ向から別の道に行ってる感はややありますが、前回作った携帯のユーザーIDを取得する - Unknown::Programmingのキャリア公式版です。
ネーミングですが、前回のがHTTP::MobileUserIDだったのに対して今回はHTTP::MobileUIDです。ややこしいったらありゃしない。
package HTTP::MobileUID; use strict; use warnings; use base qw/Class::Data::Accessor/; __PACKAGE__->mk_classaccessors(qw/agent uid convert_uid/); our $VERSION = '0.01'; sub new { my $proto = shift; my $self = bless {} , ref $proto || $proto; $self->init(@_); return $self; } sub has_uid { shift->uid } sub no_uid { !shift->uid } *id = \&uid; sub init { my $self = shift; my $agent = $self->agent(shift); if ( $agent->is_docomo ) { # Apache::DoCoMoUIDを利用。 my $uid = $agent->get_header('x-docomo-uid'); if ( $self->is_docomo_uid($uid) ) { $self->uid($uid); $uid =~ s/^0[01]//; $self->convert_uid($uid); } } elsif ( $agent->is_softbank ) { my $uid = $agent->get_header('x-jphone-uid') || 'NULL'; if ( $uid ne 'NULL' ) { if ( $self->is_softbank_uid($uid) ) { $self->uid($uid); $uid =~ s/^.//; $self->convert_uid($uid); } } } elsif ( $agent->is_ezweb ) { my $uid = $agent->get_header('x-up-subno'); if ( $self->is_ezweb_uid($uid) ) { $self->uid($uid); $self->convert_uid($uid); } } } sub is_docomo_uid { my $class = shift; my $uid = shift || ''; return 0 if $uid eq 'NULLGWDOCOMO'; $uid =~ /^[0-9a-zA-Z]{12}$/; } sub is_softbank_uid { shift; ( shift || '' ) =~ /^[0-9a-zA-Z]{16}$/ } sub is_ezweb_uid { shift; ( shift || '' ) =~ /^[0-9]+_[0-9a-zA-Z]+\.[0-9a-zA-Z.\-]+$/ } 1;
さてあまり詳しく説明するとちょっとあれかもしれないんでざっくりと。
DoCoMoですが、これはApache::DoCoMoUIDを利用します。
これでクエリから取得する必要がなくなるので実装としてはカナリ楽になります。
んでSoftbankとAUは前回のとほぼ同じなのですが、UIDのフォーマットチェックが増えてます。
特にDoCoMoの場合はキャリア申請してない場合にNULLGWDOCOMOがその文字のまま取得されてしまうのでチェックで弾いてます。(昔コレでえらい目にあいました><)
で、新しいメソッドとしてconvert_uidというのがありますが、これもあまり詳しくは書きませんが、DoCoMoの場合に先頭2文字削っているのと、Softbankの場合に先頭1文字削っているだけです。基本convert_uidメソッドの方を使うことになると思います。
さてさて作ったはいいんですが、前回の件もあるのでクパンにうpった方がいいのかどうか・・・。
やはりHTTP::MobileAgentのプラグインとして作るのがベターなのですかねぇ・・・。
・・・でもそんなの関係ねぇ!!><
ってことで勢いでうpっときます。
とりあえずHTTP::MobileAttributeが軌道に乗るまではこんな感じで部品ごとにモジュールがあってもいいのかなぁと思ったりしてます。
ちょっと追記:
ちなみに当然のことながらこのモジュールは公式サイトでしか使えません。