#!/usr/bin/perl
use Unicode::Japanese;
$s = new Unicode::Japanese;
#〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
#〓
#〓 YahooShopping-API版 アフィリエイトプログラムPerl Ver1.0.0
#〓
#〓 Copyright (C) 2006-2007 るびねっと All Rights Reserved.
#〓
#〓
#〓 ■必要ファイル
#〓 index.cgi(755)
#〓 |-- data(755)
#〓 |-- 000〜999.dat(644) ENCODE:UTF-8
#〓
#〓
#〓〓初期設定01〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
$engnurl = "http://www.townsshop.com" ; # サイトURL -- 最後のスラッシュは含めないで下さい
$sitename = "ショッピング検索タウンズショップ" ; # サイトの名前
$desc_kk = "ショッピング検索をするならタウンズショップをどうぞ!" ;
$h1_title = "$desc_kk";
$raku_ad = qq{
}; #商品をキーワードで探す済01
$tabele_title01 = qq{ タウンズお勧めキーワード };
$tabele_title02 = qq{人気};
$tabele_title03 = qq{ランキング };
$sub_desc ="${mykeyword}の商品を紹介中";#サブページのDescription
$sub_td_atama ="$desc_kk";
$kensaku_mado =qq{
}; #済02検索まど小型
$donna_keyword = "通販キーワード";
$Ranking_TOPpage = qq{
} ; #トピックス済03
$Ranking_SUBpage = qq{
} ; #トピックス済04
$footnonaiyou =qq{
このサイトにつきまして・・・${sitename}は、検索キーワードを元に日本最大級YahooShoppingの商品を紹介するページです。ご安心してサイト閲覧をお楽しみ下さい。
Copyright (c) 2007 ${sitename} All Rights Reserved.
};
#menulink(00-04)未05
$menulink00 =qq{
};
$menulink01 = qq{
};
$menulink02 = qq{
};
$menulink03 = qq{
};
$menulink04 = qq{
};
$menuall =qq{
$menulink00
$menulink01
$menulink02
$menulink03
$menulink04
};
#〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
#━━━━━━━━━━━━━━━━━━━━━━━ 初期設定 [START] ━━━━━━━━━━━━━━━━━━━━━━━━
# 初期設定は必ずこちらで変更を行って下さい
#
$name1 = "shop" ; # アドレスの第一階層の名前を指定して下さい
$name2 = "num" ; # アドレスの第二階層の名前を指定して下さい
$name3 = "index" ; # アドレスの第三階層の名前を指定して下さい
$hitnum = "10" ; # 1ページあたりの取得件数( 1-30までの整数 )
$maxdat = "100" ; # datファイルの最高 -- ○○○.datの最高数字(頭の0は含まない)
$mykeynum = "3" ; # titleを取得する番号 1なら一番上の検索結果がtitleとなる( 1-$hitnum+1までの整数 )
$Token = "173498e364bc595abe18c3a14cba80f19" ; #未
$encode = "EUC-JP" ; # 標準文字コード -- 必要がなければ変更しないで下さい
$list_text = "人気商品" ; # TOPページリンク文字
$randflag = "1" ; # SUBページのメニュー表示 0:ランダム表示なし 1:ランダム表示あり
$etcurl = "" ; # imageファイルやCSSなどを別場所に設置している場合にはそのURLを指定して下さい
# ( 同じ場所に設置している場合には空のままにしておいて下さい )
if( $etcurl eq "" ){ $etcurl = $engnurl ; }
$js = $etcurl. "/style/std.js" ; # jsファイルへのパスを指定して下さい
$css = $etcurl. "/style/std.css" ; # cssファイルへのパスを指定して下さい
$no_gif = $etcurl. "/images/no.gif" ; # no_image画像へのパスを指定して下さい
$prev = $etcurl. "/images/prev.gif" ; # prev画像へのパスを指定して下さい
$next = $etcurl. "/images/next.gif" ; # next画像へのパスを指定して下さい
#━━━━━━━━━━━━━━━━━━━━━━━━ 初期設定 [END] ━━━━━━━━━━━━━━━━━━━━━━━━
#〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
#━━━━━━━━━━━━━━━━━━━━━━━━ Main[START] ━━━━━━━━━━━━━━━━━━━━━━━━━
#********************************************************
#問い合わせオブジェク作成
use CGI;
use LWP::Simple;
my $q = new CGI;
#********************************************************
#POSTデータ取得
$catenum = $q->param('catenum');
$cateidx = $q->param('cateidx');
$pagenum = $q->param('pagenum');
#********************************************************
#不正なアドレスはエラー表示
if ($catenum eq ""){ &ERROR ; exit ; }
#********************************************************
#HTML 出力開始
if($catenum eq "top" ){ &toppage ; } else { &subpage ; }
exit;
#〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#━━━━━━━━━━━━━━━━━━━━━━━ SKIN ━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
sub PrintSkin{
$item_body .= <
$product
SHOP:$merchant
ItemSkin
}
#〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#━━━━━━━━━━━━━━━━━━━━━━━ TOPPAGE ━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
sub toppage{
#********************************************************
# index.ctgファイル読み込み
$rancate = int(rand($maxdat-1)) + 1 ;
if( length($rancate) == 1 ){
$rancate = "00" .$rancate ;
} elsif( length($rancate) == 2 ){
$rancate = "0" .$rancate ;
}
my $index_ctg = "./data/${rancate}.dat" ;
my $index_idx = 0 ;
my $rancount = 0 ;
my @index_data = ();
open( IN, $index_ctg ) or &ERROR ;
while(){
$line = $_;
chop($line);
$index_idx = $index_idx + 1;
$randnum = int(rand(4)) ;
if( $randnum == 0 ){
$cate_menu .= "" .$line. "\n" ;
$rancount += 1 ;
}
}
if( $rancount == 0 ){
$cate_menu = "" .$line. "\n" ;
}
close(IN);
for( $z=1; $z<=$maxdat; $z++ ){
if( length($z) == 1 ){
$datnum = "00" .$z ;
} elsif( length($z) == 2 ){
$datnum = "0" .$z ;
} else {
$datnum = $z ;
}
$list_menu .= "${list_text}${datnum}位" ;
}
#********************************************************
# タイトルタグ セット
$title = $sitename ;
$desc = "$desc_kk" ;
$keyw = "" ;
&PrintRanking ;
#********************************************************
#TOPPAGE HTML出力開始
print "Content-type: text/html\n";
print "Charset: " .$encode. "\n\n";
print <
$title
TOPHTMLBody
&Footer;
print "\n" ;
print "\n" ;
exit;
}
#〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#━━━━━━━━━━━━━━━━━━━━━━━ SUBPAGE ━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
sub subpage{
$linkpage1 = "${engnurl}/${name1}${catenum}/${name2}" ;
$linkpage2 = "${engnurl}/${name1}${catenum}/${name2}${cateidx}/${name3}" ;
&PrintRanking ;
#********************************************************
# index.ctgファイル読み込み
my $index_ctg = "./data/${catenum}.dat" ;
my $rancount = 0;
my $index_idx = 0;
my @index_data = ();
open( IN, $index_ctg ) or &ERROR ;
while(){
$line = $_;
chop($line);
$index_idx = $index_idx + 1;
if( $index_idx == $cateidx ){ $key = $line; }
if( $randflag eq "1" ){ $randnum = int(rand(2)) ; } else { $randnum = 0 ; }
if( $randnum == 0 ){
$menulist .= "" .$line. "\n" ;
$rancount += 1 ;
}
}
if( $rancount == 0 ){
$menulist .= "" .$line. "\n" ;
}
close(IN);
if( $key eq "" ){ &ERROR; exit; }
&API;
#********************************************************
# PageLink
$mycount = 1 ;
$linknum = 10 ;
$prevpage = $pagenum - 1 ;
$nextpage = $pagenum + 1 ;
if( $prevpage < 1 ){ $prev_text = " " ; } else {
$prev_text = "
前へ";
}
if( $nextpage > $pagecount ){ $next_text = " " ; } else {
$next_text = "次へ
";
}
if( $pagenum-$linknum < 1 ){ $startpage = 1 ; } else { $startpage = $pagenum-$linknum; }
for( $i=$startpage; $i<($pagenum+$linknum) ; $i++ ){
if( $i == $pagenum ){
$pagelink .= " " .$i. " " ;
} else {
$pagelink .= " " .$i. " " ;
}
$mycount += 1 ;
if( $mycount > 15 || $i >= $pagecount ){ last ; }
}
$pagelink = $prev_text. " " .$pagelink. " " .$next_text ;
#検索結果が0件の場合は検索フォームを表示
if( $count < 1 || $page > $pagecount ){
$item_body = "
※ 残念ですが、該当商品がございません。
お手数ですが違うカテゴリをお選び頂くか、検索窓から商品を再度ご指定下さい。
" ;
$item_body .= "$menuall" ;
} else {
$item_body = "全 " .$count. " 点 " ;
$item_body .= "" .$pagenum. " / " .$pagecount. "
" ;
if( $pagecount > 1 ){ $item_body .= $pagelink. "
" ; }
#@itemsの解析開始
$itemcount = 0 ;
foreach my $value ( @items ){
# 各変数初期化
%item = () ;
$_ = $value ;
( $imagel , $imageheight , $imagewidth ) = m//o ;
%item = $_ =~ m/<([^ ]+).*?>(.*?)<\/\1>/g ;
$product = $item{'title'} ;
$product = Unicode::Japanese->new($product, 'utf8' )->euc;
$link = $item{'link'} ;
$itemdetail = $item{'description'} ;
$itemdetail = Unicode::Japanese->new($itemdetail, 'utf8' )->euc; ;
$itemdetail = substr( $itemdetail , 0 , 400 ). '.......' ;
$merchant = $item{'vc:subStoreName'} ;
$merchant = Unicode::Japanese->new($merchant, 'utf8' )->euc; ;
$price = $item{'vc:price'} ;
1 while $price =~ s/(.*\d)(\d\d\d)/$1,$2/;
$_ = $link ;
( $vs ) = m/vs=([0-9]+?)&/o ;
( $vp ) = m/vp=([0-9]+?)&/o ;
$adurl = '
' ;
if( $imagel eq "" ){ $imagel = $no_gif ; $imagewidth = "100" ; $imageheight = "100" ; }
if( $itemcount < $mykeynum ){ $mykeyword = $product ; }
&PrintSkin ;
$itemcount = $itemcount + 1;
}
if( $pagecount > 1 ){ $item_body .= "
" .$pagelink. "
" ; }
}
#********************************************************
# タイトルタグ セット
$title = "|" .$key. "|" .$mykeyword. "[ " .$sitename. " ]" ;
$desc = "$mykeyword・・・他の商品紹介" ;
$keyw = $mykeyword ;
#********************************************************
#sub HTML出力開始
print "Content-type: text/html\n";
print "Charset: " .$encode. "\n\n";
print <
$title
SUBHTML
&Footer ;
print "\n" ;
print "\n" ;
exit;
}
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#━━━━━━━━━━━━━━━━━━━━━━━ API接続 ━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
sub API{
#********************************************************
# APIに接続
$kword = $key ;
$kword = Unicode::Japanese->new($kword, 'euc' )->utf8;
$kword =~ s/([^\w ])/"%" . unpack("H2", $1)/eg;
$kword =~ tr/ /+/;
$url = "http://webservice.valuecommerce.ne.jp/productdb/search"
."?token=" .$Token
."&results_per_page=" .$hitnum
."&keyword=" .$kword
."&page=" .$pagenum ;
# select undef, undef, undef, 0.6;
eval {
local $SIG{ALRM} = sub { die "timeout" };
alarm 10;
$data = get($url) ;
alarm 0;
};
alarm 0;
if($@) {
if($@ =~ /timeout/) {
&ERROR2; exit ;
} else {
&ERROR2; exit ;
}
}
$_ = $data ;
( $pagecount ) = m/([0-9]+)<\/vc:pagecount>/o ;
( $count ) = m/([0-9]+)<\/vc:resultcount>/o ;
if( $pagecount > 100 ){ $pagecount = 100 ; }
push(@items , $data =~ m/- (.*?)<\/item>/smg ) ;
}
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#━━━━━━━━━━━━━━━━━━━━━━━ FOOTER ━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
sub Footer{
print <\n";
print " \n";
print "\n";
print "\n";
print "\n";
print "\n";
print "\n";
print "\n" ;
print "\n" ;
print "ERROR\n";
print "\n";
print "
無効なアドレスが入力されました。お手数ですが、再度URLをご確認下さい。
\n" ;
print "\n" ;
exit ;
}
#━━━━━━━━━━━━━━━━━━━━━━━ エラー表示 ━━━━━━━━━━━━━━━━━━━━━━━━━━
sub ERROR2{
print "Content-type: text/html\n";
print "Charset: " .$encode. "\n\n";
print "\n";
print " \n";
print "\n";
print "\n";
print "\n";
print "\n";
print "\n";
print "\n" ;
print "\n" ;
print "ERROR\n";
print "\n";
print "
只今 リクエストが混み合っています。 お手数ですが、少しお待ちになってから、ブラウザの『更新』ボタンで、再読み込みを行ってみてください。
\n" ;
print "\n" ;
exit ;
}