プロが教えるわが家の防犯対策術!

宜しくお願いします。

携帯向けのHPを作成しています。
ページを製作する際に、
Aのリンク先をクリックするとBのリンク先にアクセスできる機能を組み入れたいと思います。
TOPページからAリンク先をクリック→TOPページに戻り→Bリンク先にアクセス。
Aをクリックしない場合はBにアクセスできない。
という機能です。
こちらをつくるのは難しいでしょうか?
CGIをつかわずに行うことは可能ですか?←ダメ元ですが…。

http://okwave.jp/qa3960723.html
http://okwave.jp/qa1417302.html
を参考にさせて頂いたのですが、解決はされていないようなので。

A 回答 (5件)

質問の意図がよくわからないので文面をそのまま素直に受け取ると


「Aのリンク先」と呼ばれるものを消して単純に「Bのリンク先」にしてしまえば良いと思うのですが・・・。
もしかしたら、通常はAのリンク先に飛ぶけれども、キャリアを判別して特定の携帯のみBのリンク先に飛ばせるようにしたいというのでしょうか?
携帯が対象だとクライアントサイドスクリプト(JavaScriptなど)は使えないことを前提としなければいけないので、CGIはいやだとなるとPHPで作るくらいしか道は無いでしょう。
    • good
    • 0

ウェブサイトをブラウジングできる携帯を持っていないので、下記のサイトを参考に


作ってみました。

個体識別情報の取得方法
http://pentan.info/mobile/get_uid.html

検証していなので(できないので)、うまく動作するかはわからないです。
まず、トップページですが、以下の要領で作ってください。

【top.html】
<html>
<body>
<p><a href="manage.cgi?guid=on&mode=regist">最初に見るべきページ</a></p>
<p><a href="manage.cgi?guid=on">次に見ることができるページ</a></p>
</body>
</html>

次に、以下に書いてある”manage.cgi”というcgiファイルを作ってください。
冒頭に設定項目があるので、ご自分のサイトに合うように書き変えてください。

”見るべきページを見た後の有効時間”($valid_duration)とは、この時間内
に”次に見ることができるページ”を見ないとタイムアウトする時間(分単位)
のことです。

”順番通り見なかったときのエラーページ”($error_page)とは、”見るべき
ページ”を見ずに”次に見ることができるページ”を見ようとしたときのエラー
ページです。例えば、以下のようなものを作ればいいと思います。

【error.html】
<html>
<body>
<p>このページを見るには、以下のページを最初に見てください。</p>
<p><a href="manage.cgi?guid=on&mode=regist">最初に見るべきページ</a></p>
</body>
</html>


【manage.cgi】
#-- 以下を自分のページに合うように設定してください ----------------
my $must_see_page = 'must_see.html'; # 最初に見るべきページ
my $second_page = 'second.html'; # 次に見ることができるページ
my $error_page = 'error.html'; # 順番通り見なかったときのエラーページ
my $valid_duration = 30; # 見るべきページを見た後の有効時間(分単位)
#------------------------------------------------------------------

use Fcntl qw(:DEFAULT :flock);
use CGI;

my %carrier_info = (
docomo => { re_ua => qr/DoCoMo/i, env_uid => 'HTTP_X_DCMGUID' },
au => { re_ua => qr/UP. ?Browser/i, env_uid => 'HTTP_X_UP_SUBNO' },
Softbank => { re_ua => qr/J-PHONE|Vodafone|SoftBank/i, env_uid => 'HTTP_X_JPHONE_UID' },
WILLCOM => { re_ua => qr/WILLCOM/i, env_uid => 'REMOTE_ADDR' },
EMOBILE => { re_ua => qr/emobile/i, env_uid => 'HTTP_X_EM_UID' },
);

my %user;
while ( my ($carrier, $info) = each %carrier_info ) {
if ( $ENV{HTTP_USER_AGENT} =~ $info->{re_ua} ) {
$user{carrier} = $carrier;
$user{uid} = $ENV{ $info->{env_uid} };
last;
}
}

$user{carrier} = 'other' unless $user{carrier};
$user{uid} = $ENV{REMOTE_ADDR} unless $user{uid};

sysopen my $in, "$user{carrier}.cgi", O_RDONLY | O_CREAT or die $!;
flock $in, LOCK_SH;
my @registered_uids = <$in>;
close $in;

my $mode = CGI->new->param('mode') || q{};
if ( $mode eq 'regist' ) {
regist(\%user, \@registered_uids);
} else {
check(\%user, \@registered_uids);
}

sub render {
my $file = shift;

print "Content-Type: text/html\n\n";

open my $html, '<', $file or die $!;
print <$html>;
close $html;
}

sub regist {
my ($user, $registered_uids) = @_;

my $uid_is_registered;
for my $registered_uid (@$registered_uids) {
my ($uid) = split /\s|\n/, $registered_uid;
if ( $uid eq $user->{uid} ) {
$registered_uid = "$user->{uid} $^T\n";
$uid_is_registered = 1;
last;
}
}

if ( not $uid_is_registered ) {
push @$registered_uids, "$user->{uid} $^T\n";
}

open my $out, '>', "$user->{carrier}.cgi" or die $!;
flock $out, LOCK_EX;
print {$out} @$registered_uids;
close $out;

render $must_see_page;
}

sub check {
my ($user, $registered_uids) = @_;
my (@updated_uids, $uid_is_found);

for my $registered_uid (@$registered_uids) {
my ($uid, $time) = split /\s|\n/, $registered_uid;
next if $^T - $time > $valid_duration*60;

push @updated_uids, $registered_uid;
$uid_is_found = 1 if $uid eq $user->{uid};
}

open my $out, '>', "$user->{carrier}.cgi" or die $!;
flock $out, LOCK_EX;
print {$out} @updated_uids;
close $out;

if ($uid_is_found) {
render $second_page;
} else {
render $error_page;
}
}

参考URL:http://pentan.info/mobile/get_uid.html

この回答への補足

詳しく有難うございます!

【top.html】
<html>
<body>
<p><a href="manage.cgi?guid=on&mode=regist" "URL">ページ表示名</a></p>
<p><a href="manage.cgi?guid=on" "URL">ページ表示名</a></p>
</body>
</html>

このような感じであっていますでしょうか?

#-- 以下を自分のページに合うように設定してください ----------------
my $must_see_page = 'must_see.html'; # 最初に見るべきページ ←
my $second_page = 'second.html'; # 次に見ることができるページ ←
my $error_page = 'error.html'; # 順番通り見なかったときのエラーページ ←直接URLを入力すれば良いのでしょうか?
my $valid_duration = 30; # 見るべきページを見た後の有効時間(分単位)←直接数字(30など)を入力すればよいのでしょうか?

補足日時:2009/10/26 09:58
    • good
    • 0

補足質問にお答えします。



>←直接URLを入力すれば良いのでしょうか?
URLでなくご自分のサーバー内にあるファイル名を入力してください。
ご自分のサーバーではなく、外部のページに飛ばしたいのなら、また別途作り直す
必要があります。

←直接数字(30など)を入力すればよいのでしょうか?
はい、そうです。

この回答への補足

ありがとうございます!
説明が不足していてすみませんでした。
自身のサーバーではなく外部のページです。

もしくは、
indexからAのページをクリック→戻る→indexページに隠しリンクが表示される。
などの方法も考えたのですが、どちらの方が簡易的でしょうか?

補足日時:2009/10/26 14:20
    • good
    • 0

前回の補足について回答し忘れてた部分がありました。



<p><a href="manage.cgi?guid=on&mode=regist" "URL">ページ表示名</a></p>
<p><a href="manage.cgi?guid=on" "URL">ページ表示名</a></p>
>このような感じであっていますでしょうか?

ここにはURLを記述しないでください。
URLは”manage.cgi”の中の以下のところに記述してください。

my $must_see_page = 'http://www.google.com'; # 最初に見るべきページ
my $second_page = 'http://www.yahoo.co.jp'; # 次に見ることができるページ

そして、”top.html”では以下のように記述してください。

<p><a href="manage.cgi?guid=on&mode=regist">ページ表示名</a></p>
<p><a href="manage.cgi?guid=on">ページ表示名</a></p>

>自身のサーバーではなく外部のページです。
その場合は、sub renderという関数を以下のように変更してください。

sub render {
my $file = shift;

print "Content-Type: text/html\n\n";

open my $html, '<', $file or die $!;
print <$html>;
close $html;
}

    ↓    ↓    ↓

sub render {
my $file = shift;

if ( $file =~ /^http/ ) {
print "Location: $file\n\n";
} else {
print "Content-Type: text/html\n\n";

open my $html, '<', $file or die $!;
print <$html>;
close $html;
}
}

>indexからAのページをクリック→戻る→indexページに隠しリンクが表示される。
>などの方法も考えたのですが、どちらの方が簡易的でしょうか?

難易度はどちらも同じぐらいだと思います。
    • good
    • 0

>indexからAのページをクリック→戻る→indexページに隠しリンクが表示される。


このバージョンも作ってみました。

まず、トップページ表示用の”top.html”ファイルを作ってください。
隠しリンクは、<!--hidden ~ --> で囲みます。
以下、その例です。

【top.html】
<html>
<body>
<p><a href="top.cgi?guid=on&mode=regist">最初に見るべきページ</a></p>
<!--hidden
<p><a href="http://www.yahoo.co.jp">次に見ることができるページ</a></p>
-->
</body>
</html>

それから、以下の”top.cgi”というファイルを作ってください。
冒頭の設定部分はご自分の環境に合わせて書き変えてください。

そして、トップページに表示させるファイルですが、”top.html”でなく
"top.cgi?guid=on"ですので注意してください。”top.html”は訪問者からは
アクセスできないファイルです。

要するに、訪問者がアクセスするURLは以下のような感じとなります。

http://www.ri-an.jp/top.cgi?guid=on

【top.cgi】
#-- 以下を自分のページに合うように設定してください ----------------
my $top_page = 'top.html'; # トップページに表示させるファイル
my $must_see_page = 'http://www.google.com'; # 最初に見るべきページ
my $valid_duration = 30; # 見るべきページを見た後の有効期間(分単位)
#------------------------------------------------------------------

use Fcntl qw(:DEFAULT :flock);
use CGI;

my %carrier_info = (
docomo => { re_ua => qr/DoCoMo/i, env_uid => 'HTTP_X_DCMGUID' },
au => { re_ua => qr/UP. ?Browser/i, env_uid => 'HTTP_X_UP_SUBNO' },
Softbank => { re_ua => qr/J-PHONE|Vodafone|SoftBank/i, env_uid => 'HTTP_X_JPHONE_UID' },
WILLCOM => { re_ua => qr/WILLCOM/i, env_uid => 'REMOTE_ADDR' },
EMOBILE => { re_ua => qr/emobile/i, env_uid => 'HTTP_X_EM_UID' },
);

my %user;
while ( my ($carrier, $info) = each %carrier_info ) {
if ( $ENV{HTTP_USER_AGENT} =~ $info->{re_ua} ) {
$user{carrier} = $carrier;
$user{uid} = $ENV{ $info->{env_uid} };
last;
}
}

$user{carrier} = 'other' unless $user{carrier};
$user{uid} = $ENV{REMOTE_ADDR} unless $user{uid};

sysopen my $in, "$user{carrier}.cgi", O_RDONLY | O_CREAT or die $!;
flock $in, LOCK_SH;
my @registered_uids = <$in>;
close $in;

my $mode = CGI->new->param('mode') || q{};
if ( $mode eq 'regist' ) {
regist(\%user, \@registered_uids);
} else {
show_top_page(\%user, \@registered_uids);
}

sub regist {
my ($user, $registered_uids) = @_;

my $uid_is_registered;
for my $registered_uid (@$registered_uids) {
my ($uid) = split /\s|\n/, $registered_uid;
if ( $uid eq $user->{uid} ) {
$registered_uid = "$user->{uid} $^T\n";
$uid_is_registered = 1;
last;
}
}

if ( not $uid_is_registered ) {
push @$registered_uids, "$user->{uid} $^T\n";
}

open my $out, '>', "$user->{carrier}.cgi" or die $!;
flock $out, LOCK_EX;
print {$out} @$registered_uids;
close $out;

print "Location: $must_see_page\n\n";
}

sub show_top_page {
my ($user, $registered_uids) = @_;
my (@updated_uids, $uid_is_found);

for my $registered_uid (@$registered_uids) {
my ($uid, $time) = split /\s|\n/, $registered_uid;
next if $^T - $time > $valid_duration*60;

push @updated_uids, $registered_uid;
$uid_is_found = 1 if $uid eq $user->{uid};
}

open my $out, '>', "$user->{carrier}.cgi" or die $!;
flock $out, LOCK_EX;
print {$out} @updated_uids;
close $out;

open my $html, '<', $top_page or die $!;
my $top_page_html = do { local $/; <$html> };
close $html;

if ($uid_is_found) {
$top_page_html =~ s/<!--hidden(.*?)-->/$1/sg;
} else {
$top_page_html =~ s/<!--hidden(.*?)-->//sg;
}

print "Content-Type: text/html\n\n";
print $top_page_html;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!