perlでアクセス端末の解像度を知る方法

このQ&Aのポイント
  • アクセス元の端末(たとえばスマホなのかPCなのか)で表示する画像を変えたいため、アクセス端末の解像度を取得したい。
  • JavaScriptの情報はヒットするが、use Term::ReadKeyを使っても動作しない。
  • Androidの場合、スマホとタブレットの解像度が異なるため、正確な振り分けができず困っている。
回答を見る
  • ベストアンサー

perlでアクセス端末の解像度を知りたい

アクセス元の端末(たとえばスマホなのかPCなのか)で表示する画像を変えたいため、アクセス端末の解像度を取得したいのですがどうすればよいでしょうか? いろいろ探してみたのですが、javascriptばかりヒットし、use Term::ReadKeyというものも出てきたのですが、その参考ページをそっくり入れてみても動作しません。 sub agent{ %agent_type = ( qr/MSIE/i => 'p', qr/iPhone/ => 's', qr/iPad/ => 't', qr/Android/ => 's', 一部省略 ); } sub browser{ &agent; my $ua = $ENV{'HTTP_USER_AGENT'}; foreach my $key(keys %agent_type){ if ($ua =~ $key){ $ua_type = $agent_type{$key}; last; } } } 上記のような環境変数で振り分けることも考えたのですが、Androidだとスマホとタブレットと解像度が大きく違うものでも同じものをはき出してしまうかと思い、正確な振り分けができず困っています。 どうかperlだけで解決できる方法がありましたらぜひ教えてください。 よろしくお願いします。

  • choei
  • お礼率63% (286/451)
  • Perl
  • 回答数4
  • ありがとう数16

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

Mobile::UserAgentは古すぎか。。。 HTTP::MobileAgentのdisplayメソッドを使えば、多少ましでしょうが、 HTTP::MobileAgentは2012年が最新なのでどちらにしろ完璧な解像度を得るのは 不可能でしょう。

choei
質問者

お礼

ありがとうございます 教えて頂いた方法でどこまで解像度が得られるか試してみます

その他の回答 (3)

回答No.3

スマホは、完璧ではない(=全ての機種を判定できるわけではない)ですが、 Mobile::UserAgentのscreenDimsメソッドを使えばできると思います。 PCのクライアントの解像度はPerlだけで判定するのは無理でしょう。 HTTPリクエストに解像度の情報は含まれていないので。 javascriptで対応したほうがいいと思います。

choei
質問者

お礼

ありがとうございます 次も回答頂いてますので、そちらでコメントします

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

 それは解像度をチェックしているのではありません。単にユーザーエージェントを調べているだけで、解像度情報はHTTP要求ヘッダにはありません。  スマホもPCも同じmedia="screen"であっても、幸いにスマホはCSS3に対応していますから、その拡張であるmediaqueryが利用できます。  単純に端末の解像度で、ブラウザ自身の機能を使ってスタイルシートを切り替えるほうがはるかに容易です。javascriptのように端末でjavascriptを禁止していても利用できますし、スマホを回転させて縦横変えても切り替わります。

choei
質問者

お礼

ありがとうございます 確かにスタイルシートで切り替えする方が賢明のようですね そちらで考えてみます

  • t_ohta
  • ベストアンサー率38% (5067/13240)
回答No.1

そもそも、端末が送信してこない情報をサーバ側で知る術はありません。 セッション等でサイトへの初回アクセスを検知し、初回時にJavaScriptだけのページを送って解像度情報をPOSTさせてから、本来のコンテンツを送出するようにするなどの工夫が必要でしょう。

choei
質問者

お礼

ありがとうございます。 そうですよね、確かに送信してこない情報を知るすべなんてないですね

関連するQ&A

  • 携帯端末認識User-Agentについて

    初心者なのですが、CGIで携帯サイトを作っていますが。 実機がうまく動きません。User-Agentに問題があると考えています。 現在のソースと主な現象を記しますので、適切なものを教えて下さい。お願いします。 #----------# # 端末認識 # #----------# sub useragent { my $ua; #次にi-mode端末かどうかチェック if ($ENV{'HTTP_USER_AGENT'} =~ /^DoCoMo\/\d/) { $ua = 1; #次にJ-Phone端末かどうかチェック } elsif ($ENV{'HTTP_USER_AGENT'} =~ /^J-PHONE\/\d/) { $ua = 2; #EZweb端末かどうかチェック } elsif (($ENV{'HTTP_USER_AGENT'} =~ 'UP.B') && ($ENV{'HTTP_X_UP_SUBNO'} ne "")){ $ua = 3; #その他はPCとする } else { $ua = 0;} #PCブラウザ再判定 if ($ENV{'HTTP_USER_AGENT'} =~ /Mozilla\/|MSIE|Netscape|Opera|Lynx|AOL|Gecko/) {$ua = 0;} return $ua; } 主な現象 AU:ページ表示ごとに、いちいちブラウザメニューからページ更新をしなければならない(AUの特性もありますが) ソフトバンク:携帯版ではなく、PC版が表示されてしまう。 ドコモ :Pは問題ないようだが、SHは会員登録画面のフォームが半分の項目しか表示されず、次のページで残りの半分 は表示されるが、フォームにすべて書き込んで、登録送信をクリックしても、エラーデータ、の表示が出る。

    • 締切済み
    • CGI
  • 携帯端末振り分けソースがソフトバンク端末でうまくいかない?

    携帯端末振り分けの以下のソースを利用していますが、ソフトバンクからフリーで配布されている「ウェブコンテンツビューア」というシュミレータを使いテストするとtype1~3いずれもデスクトップと判断されてしまいます。 「ウェブコンテンツビューア」は何か設定が必要なのでしょうか?、それともこれらのソースにはソフトバンク端末に対するソースのミスがあるのでしょうか? #type1 if($ua=~ /DoCoMo/){$user_agent = 'mobile';} elsif($ua=~ /J-PHONE\/2/){$user_agent = 'mobile';} elsif($ua=~ /J-PHONE\/[3-9]/){$user_agent = 'mobile';} elsif($ua=~ /Vodafone/){$user_agent = 'mobile';} elsif($ua=~ /SoftBank/){$user_agent = 'mobile';} elsif($ua=~ /ASTEL/){$user_agent = 'mobile';} elsif(index($ua,"UP.Browser")==0){$user_agent = 'mobile';} elsif(index($ua,"UP.Browser") > 0){$user_agent = 'mobile';} else{$user_agent = 'desktop';}#Mac and PC #type2 if($ua =~ /^(DoCoMo\/1)/i){$user_agent = 'mobile';}#DoCoMo elsif($ua =~ /^(DoCoMo\/2)/i){$user_agent = 'mobile';}#DoCoMo_FOMA elsif($ua =~ /^ASTEL/i){$user_agent = 'mobile';}#ASTEL elsif($ua =~ /^J\-PHONE/i){$user_agent = 'mobile';}#softbank elsif($ua =~ /^Vodafone/i){$user_agent = 'mobile';}#softbank elsif($ua =~ /^SoftBank/i){$user_agent = 'mobile';}#softbank elsif($ua =~ /^KDDI/i){$user_agent = 'mobile';}#au elsif($ua =~ /^UP\.Browser/i){$user_agent = 'mobile';}#au else{$user_agent = 'desktop';}#Mac and PC #type3 if ($ua =~ /DoCoMo|J-PHONE|Vodafone|Softbank|MOT-|L-mode|DDIPOCKET|PDXGW|ASTEL/ ) { $user_agent = 'mobile'; } else{$user_agent = 'desktop';}

    • ベストアンサー
    • Perl
  • 複数の比較( =~ )を効率よくまとめたい

    アクセス端末によって見え方を変えさせるため、条件節ifで =~ を使って分岐させているのですが、ユーザーエージェントがあまりにも多く、コードが長くなりすぎ制作に支障が出てきています 100%完璧に分岐させるところまでは求めていないため(アクセスの95%程度うまく分けられればいいかと思ってます)、たとえばスマホの場合はiPhoneとかAndroid、PCの場合はMSIEなど極力共通の部分を見つけてまとめてはいますが、それでも携帯、スマホ、PCと分けると非常に多くなり、 if(($ENV{'HTTP_USER_AGENT'} =~ /MSIE/) || ($ENV{'HTTP_USER_AGENT'} =~ /Firefox/)){} など比較の片方は同じなのに同じことを何度も書く必要があり、非効率かつ強烈に長くなってしまい何とかまとめられないかと格闘しています たとえば別で $os_pc = "MSIE,Firefox"; $os_mb = "DoCoMo,KDDI"; など別でまとめて、 if($ENV{'HTTP_USER_AGENT'} =~ /$os_pcの,で分解したそれぞれの文字列と比較/){ PCと判定 }elsif($ENV{'HTTP_USER_AGENT'} =~ /$os_mbの,で分解したそれぞれの文字列と比較/){ 携帯と判定 } といったように、スマートに条件分岐させられないかと模索中ですが、=~ で別で用意したデータを,で分解してそれぞれと比べるとかできないでしょうか。 =~での比較ではなく、他の方法でもかまいませんので、ぜひお知恵をお貸しください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Android端末から特定URLへのアクセス制限

    Android4.0端末(スマホ、タブレット)のアクセス制限について。 特定URL、特定ワード入力による。 [質問詳細] Android4.0端末(スマホ、タブレット)から見たくない特定URLがあります。 見なければいいのですが意思が弱くそれができません、、 特定のURL、ワード入力時に表示されないように制限かける方法を教えてください。 理想はブラウザ、システム側での設定による制限です。 なおDocomoアクセス制限サービス、はNGです。 セキュリティアプリも重くなりそうなので避けたいです。 どうぞよろしくお願いいたします。

  • どのAndroid端末がいいのか…

    どのAndroid端末がいいのか… 現在iPhoneを使用しているのですが、この頃Androidの拡張性に憧れ、サブ機としてAndroid端末を探しています。  周りのAndroidユーザーを見ていてのイメージとしてAndroidはiPhoneに比べてもっさりとしているというのがある為、メイン機はiPhoneを使用し続けたいと思っていますが最新のAndroidとなるとそうでも無いのでしょうか? それはさておき本題なのですが、 私はスマホで主にガルパなどのリズムゲームやツムツムなどのパズルゲーム、第5人格などの軽いアクションゲームをします。 バトロワや重たいFPSゲームはスマホではしないのでハイエンドスマホが必要なのかどうか、そこをお聞きしたいと思っています。 またあくまでもサブ機でありメイン機としてiPhoneを使用しているので金銭的にもROGphoneIIなどには手を出しずらいという状況です。 もっさりしないとなるとやはりハイエンドが必要かとは思いますが、上記のようなゲームが快適にプレイでき、コスパが良いスマホなどオススメがありました教えて頂きたいと思っています。 価格帯は出せても6、7万くらいかなと考えていますが、携帯の契約がそろそろ2年ということで良いのがあればメイン機をそちらにするというのも不可能ではないので、ここら辺の価格帯でおすすめを教えてください

  • スマホ端末で

    スマホ端末を一つ探しています 出先でyoutubeを見たり、確認したり バイクの車載として利用したりといったサブ的用途です なのであまり高性能でなくてもいいのですが 最低限はサクサク動くものがほしいです(今どきどれでも大丈夫かもしれませんが・・ 後、前のものは使ってるうちにどんどん減っていって 嫌な感じがしたのでバッテリーがある程度強いものがいいです フリマなども含めて、2万円くらい、あるいは1万くらいで 6インチ程度くらいの大きさ、でおすすめの端末が有りましたら教えて下さい Androidで物理simがささるものがいいです

  • アクセス解析について

    現在、SEO対策の会社へHPアクセス解析を依頼しています。 アクセスログの報告をもらっているのですが、 中に、下記のようなリンク元があるのですが、 ----------------------------------------- ホスト名:msnbot-(--そのつど違う数字-----).serch.msn.com ユニークアクセスキー:そのつど違います リンク元:http://serch.live.com/results.aspx?q=copyright USER_AGENT:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5..2;SV1;.NET CLR 1.1.4322) ACCEPT_LANGUAGE:en-us ディスプレー解像度:800x600x16 ----------------------------------------- となって、HPへアクセスしてきています。 表示しているページは、違うものを見ているようです。 これは、一般の方からのアクセスなのでしょうか? それとも、業者からのアクセスなのでしょうか? 現在依頼している会社からは、分からないとの回答しか いただけないので、実際のアクセス数の把握が出来ず 困っています。 どなたか、分かる方いましたら是非教えていただきたいのですが 宜しくお願い致します。

    • ベストアンサー
    • SEO
  • perl cgiでnameを

    perl cgiでフォームの行と列を以下のようにハッシュと配列を使って生成しようとしました: my %temp = ( 'test1' => 'テスト1', 'test2' => 'テスト2' ) for (my $linepnt = 1; $linepnt<8; $linepnt++){ foreach my $key (keys(%temp)){ print "<td><input type=\"text\" name=\"$key . '_' . $linepnt\" value=\"$in_data{$key . '_' . $linepnt}\" style=\"width:3em;font-size:medium\">mL</td>"; } } するとフォームからの入力を受けた側ではnameを test1_7 というように受け取らずに test1+.+%27_%27+.+7 と受け取っていることが分かりました。 name=\'test1_' . $linepnt\"  とするだけなら正しく test1_7  として受け取ってくれます。 なにが間違っているのでしょうか。 ご指導ください。

    • ベストアンサー
    • CGI
  • perlで画像をダウンロードしようと思っています

    gazou_element.txtにurlを保存していて、それらを一つずつ取り出してダウンロードするようにしようとしているのですがError:Invalid argument at C:User~~~となってしまいます。 どうすればいいかよろしければお教え下さい。 use Encode; use LWP::UserAgent; use IPC::Open2; use warnings; $file = "gazou_element.txt"; open (IN, $file) or die "$!"; my @url =<IN> ; my $time = time; for(my $i = 0; $i < scalar(@url); $i++){ my $request = HTTP::Request->new('GET', $url[$i]); my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/4.0'); my $response = $ua->request($request); my $prefix = get_prefix($url[$i]); my $count = $i + 1; if($response->is_success){ open($OUT, ">","$time$i$prefix") or die("Error:$!"); binmode $OUT; print $OUT $response->content; close $OUT; }else{ } } #拡張子を取得する sub get_prefix{ my $url = shift; my $start = rindex($url, "."); my $end = length($url); my $string = substr($url, $start, $end - $start); return $string; }

  • accessの検索で・・・

    お世話になっております。 今、OfficeXPで、Accessを使ってデータベースを作っています。 そこで、フィルタについて教えていただけないでしょうか(TへT) まずは、こんな感じでVBAを書いてみたのですが・・・ Private Sub kensaku_Click() Dim rsql1 As String Dim rsql2 As String Dim keys As String keys = InputBox("キーワードを入力してください", "キーワード検索") If keys = "" Then Exit Sub End If rsql1 = "select tel from master where dairi_code = keys" rsql2 = "select tel2 from master where contact_tel = keys" If rsql1 <> "" Then Me.Filter = "tel = '" & keys & "'" Me.FilterOn = True DoCmd.OpenForm "form_tel", acNormal, , "[tel] = '#" & key & "#'", acFormEdit, acDialog ElseIf rsql2 <> "" Then Me.Filter = "tel2 = '" & keys & "'" Me.FilterOn = True DoCmd.OpenForm "form_tel2", acNormal, , "[tel2] = '#" & key & "#'", acFormEdit, acDialog Else: MsgBox "該当するデータはありません", vbOKOnly End If End Sub と、いう感じです。 したいことは、2つのそれぞれのテーブルに検索をかけ、一致したのがあったらそれに対応するフォームを開くと言う感じにしたいです。 ロジック的に穴がありすぎると思いますが、どうかよろしくお願いいたします。

専門家に質問してみよう