#!/usr/bin/perl use LWP::Simple; use XML::RSS; use Jcode; use CGI; # ==================== RSS取得 ========== #Yahoo!トピックス my $url = 'http://dailynews.yahoo.co.jp/fc/rss.xml'; my $data_from_web = get($url); # XML:RSSを使う準備 my $rss = new XML::RSS; # WEBから取得したデータを解析 eval{ $rss -> parse($data_from_web); }; #my $channel = $rss -> {'channel'}; my $item_list = $rss->{'items'}; #livedoor占い my $url2 = 'http://fortune.livedoor.com/xml/astro12.rdf'; my $data_from_web2 = get($url2); # XML:RSSを使う準備 my $rss2 = new XML::RSS; # WEBから取得したデータを解析 eval{ $rss2 -> parse($data_from_web2); }; my $item_list2 = $rss2->{'items'}; # ------------------------------------------------設定変数 $USERFILE = '../dat/users.dat'; # ユーザーファイル $SESSION = '../dat/session.dat'; # セッション管理ファイル $CHARSET = 'EUC-JP'; # 文字コード $DATAFOLDER = '../article/'; # 記事フォルダ $COOKIE_PREFIX = 'login'; # クッキープリフィクス $COOKIE_LIFE = 30; # クッキー期限(日) $DATAPASS = './schedule/'; # 記事ファイル $BBSFILE = './bbs/default.dat'; $INFOFILE = './info/info.dat'; $ALBUMFILE = './album/album.dat'; # ------------------------------------------------メインプログラム $agent = $ENV{'HTTP_USER_AGENT'}; if($agent =~ /DoCoMo/){ printMobile(); }elsif($agent =~ /UP.Browser/){ printMobile(); }elsif($agent =~ /J-PHONE|Vodafone|SoftBank/){ printMobile(); } else{ loadFormdata(); loadCookie(); $member = checkCode(); if(exists $FORM{'logout'}){ $CODE{$member}=0; printPage("IDvoid"); # ログインページ出力("ID,PASSを入力してください") } else { # 何月のデータを読み込むかの判断 # 月の指定がなかった場合 if($FORM{'month'} eq ""){ # 現在の日時を取得 my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time); $GEYEAR = $year+1900; $GEMON = $mon+1; $GEDAY = $mday; $GE = "nothing"; } # 月の指定があった場合 else{ my ($syear, $smonth, $sday) = split(/-/, $FORM{'month'}); $GEYEAR = $syear; $GEMON = $smonth; $GEDAY = $sday; } $month = "$GEYEAR-$GEMON.dat"; $DATAPASS .= $month; loadLogfile(); # 月データを%LOGに代入 calday(); # カレンダー演算 if($member) { # クッキーに暗号が一致 loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 loadArticle(); # 記事読み込み printPage("IDpassed"); } else { if($FORM{'id'} and $FORM{'pass'}){ # フォームにID,PASSがあるかどうかの確認 $member = $FORM{'id'}; loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 if($FORM{'pass'} eq $ID{'pass'}){ # フォームのID,PASSがユーザーファイルのIDと一致 calculatCode(); # CODEの計算及びユーザーファイルに保存 loadArticle(); # 記事読み込み printPage("IDpassed"); } else { printPage("IDerror"); # エラーページ出力("ID,PASSが異なります") } } else { printPage("IDvoid"); # ログインページ出力("ID,PASSを入力してください") } } } } exit; # ------------------------------------------------モバイルのメインプログラム sub printMobile { $CGI = new CGI(); print $CGI->redirect("../index.html"); loadFormdata(); loadCookie(); $member = checkCode(); $mobile = checkMobile(); if(exists $FORM{'logout'}){ $CODE{$member}=0; printMobilePage("IDvoid"); # ログインページ出力("ID,PASSを入力してください") } else { if($member) { # クッキーに暗号が一致 loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 loadArticle(); # 記事読み込み printMobilePage("IDpassed"); } elsif($mobile){ $member = $mobile; loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 loadArticle(); # 記事読み込み printMobilePage("IDpassed"); } else { if($FORM{'id'} and $FORM{'pass'}){ # フォームにID,PASSがあるかどうかの確認 $member = $FORM{'id'}; loadUserfile(); # ユーザーファイルの読み込み$memberを基に個人の%IDの作成 if($FORM{'pass'} eq $ID{'pass'}){ # フォームのID,PASSがユーザーファイルのIDと一致 calculatCode(); # CODEの計算及びユーザーファイルに保存 loadArticle(); # 記事読み込み printMobilePage("IDpassed"); } else { printMobilePage("IDerror"); # エラーページ出力("ID,PASSが異なります") } } else { printMobilePage("IDvoid"); # ログインページ出力("ID,PASSを入力してください") } } } } # ------------------------------------------------モバイルページの出力 sub printMobilePage { printHttpHeader(); print < 軟式庭球同好会 軟式庭球同好会
END #振り分け if ($_[0] eq "IDpassed") { print < END }elsif($_[0] eq "IDerror") { #ID,PASSが異なります print < ID:

PASS:

保存する
携帯電話からのアカウント作成はできません END }elsif($_[0] eq "IDvoid") { #ID,PASSを入力してください print < ID:

PASS:

保存する
携帯電話からのアカウント作成はできません
END } #振り分け終わり print <HOME
┣お知らせ
┣イベント
掲示板
メンバー一覧
┗ML

サイトの使い方
アカウント編集
ログアウト
END } # ------------------------------------------------クッキーの暗号が一致したらID、なければ0を返す sub checkMobile { my($name, $pass, %CODEN, $load); open(FILE, "<$SESSION") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass) = split(/:/, $ln); $CODEN{$pass} = $name; } $load = $FORM{'session'}; close(FILE); if (exists $CODEN{$load}) { return $CODEN{$load}; } else { return 0; } } # ------------------------------------------------クッキーの暗号が一致したらID、なければ0を返す sub checkCode { my($name, $pass, %CODEN, $load); open(FILE, "<$SESSION") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass) = split(/:/, $ln); $CODEN{$pass} = $name; } $load = $COOKIE{'id'}; close(FILE); if (exists $CODEN{$load}) { return $CODEN{$load}; } else { return 0; } } # ------------------------------------------------セッションCODEの乱数発生及びユーザーファイルに保存 sub calculatCode { my ($passwd, @c, $ln, $name, $pass, $fp); @c = (0..9,'A'..'Z','a'..'z'); srand; $passwd = ''; $passwd .= $c[int(rand(@c))] while length($passwd) < 8; # 書き直しユーザーファイル読み書き open(FILE, "+<$SESSION") or printPage("openError"); eval{ flock(FILE, 2) }; while($ln = ) { chomp $ln; ($name, $pass) = split(/:/, $ln); $CODE{$name} = $pass; } $CODE{$member} = $passwd; seek( FILE, 0, 0); foreach $CODEKEY (keys %CODE) { print FILE "$CODEKEY:$CODE{$CODEKEY}\n"; } $fp = tell( FILE ); truncate( FILE, $fp); close(FILE); } # ------------------------------------------------httpヘッダー出力(クッキー書き込み) sub printHttpHeader { # グリニッジ標準時の文字列 my @mon_str = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); my @wdy_str = ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + ($COOKIE_LIFE * 24 * 60 * 60)); my $date = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $wdy_str[$wday], $mday, $mon_str[$mon], $year + 1900, $hour, $min, $sec); # ヘッダーの出力 my ($name, $value); print "Content-type: text/html; charset=$CHARSET\n"; if (exists $CODE{$member}) { $value = $CODE{$member}; $name = 'id'; if ($FORM{'login'} eq "true") { print "Set-Cookie: $name=$value; expires=$date\n"; } else { print "Set-Cookie: $name=$value\n"; } } print "\n"; } # ------------------------------------------------クッキー読み込み sub loadCookie { my $pair; foreach $pair (split(/;\s*/, $ENV{'HTTP_COOKIE'})) { my ($name, $value) = split(/=/, $pair); $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $COOKIE{$name} = $value; } } # ------------------------------------------------記事情報読み込み sub loadArticle { open(FILE, "<$BBSFILE") or printErrorPage($BBSFILE); eval{ flock(FILE, 1) }; @BBS = ; close(FILE); open(FILE, "<$INFOFILE") or printErrorPage($INFOFILE); eval{ flock(FILE, 1) }; @INFO = ; close(FILE); open(FILE, "<$ALBUMFILE") or printErrorPage($ALBUMFILE); eval{ flock(FILE, 1) }; @ALBUM = ; close(FILE); my ($name, $file, $exhibition) = split (/\t/, $ALBUM[0]); my $ALBUMDATAFILE = "./album/$file.dat"; open(FILE, "<$ALBUMDATAFILE") or printErrorPage("openError"); eval{ flock(FILE, 1) }; @ALBUMDATA = ; close(FILE); } # ------------------------------------------------ユーザーファイル読み込み($memberを基に個人の%IDを作成。IDが一致しなければIDエラーページ出力) sub loadUserfile { my ($ln, $name, $pass, $id, $sex, $birth, $blood, $email, %USERS); open(FILE, "<$USERFILE") or printPage("openError"); eval{ flock(FILE, 1) }; while($ln = ) { chomp $ln; ($name, $pass, $id, $sex, $birth, $blood, $email) = split(/\t/, $ln); if($id eq $member) { %ID = ('name' => $name, 'pass' => $pass, 'id' => $id, 'sex' => $sex, 'birth' => $birth, 'blood' => $blood, 'email' => $email); close(FILE); return 0; } } close(FILE); printPage("IDerror"); exit; } # ------------------------------------------------フォームデータ取り込み sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $FORM{$key} = $value; } } #==================== カレンダー ========== sub calday { # 月の末日の指定(左から順に1月、2月・・・) my @days = (31,28,31,30,31,30,31,31,30,31,30,31); my $cellnum = 0; $year = $GEYEAR; $mon = $GEMON; # うるう年の判定(4の倍数ならうるう年、しかし100の倍数ならうるう年でない、また400の倍数ならうるう年) if( (($year%4 ==0)&&($year%100 != 0))||($year%400 == 0) ){ $days[1]=29; } # 月の初日の曜日(ツェラーの公式)、月の末日を取得 $start = getday($year,$mon,1); $lastday=$days[$mon-1]; # 月の初日の前まで、表のセルにスペース(改行)を入れる if($start!=0){ for($i=0;$i<$start;$i++){ $DAY[$cellnum]=" "; $cellnum++; } } # カレンダーのセルを作成 for($i=1;$i<=$lastday;$i++){ my $caltd = $i; # スケジュール一覧の出力 for($j = 0 ; $j < @LOG ; ++$j) { my ($day, $wday, $hour1, $min1, $hour2, $min2, $title, $place, $comment) = split (/\t/, $LOG[$j]); chomp $comment; my $day2 = sprintf("%d",$day); if($day2 eq $i) { $caltd = "$i"; last; } } my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time); $year += 1900; $mon++; if($mday eq $i and $mon eq $GEMON and $year eq $GEYEAR){ $DAY[$cellnum] = sprintf("$caltd"); } else { $DAY[$cellnum] = sprintf("$caltd"); } $cellnum++; } while($cellnum<=42){ $DAY[$cellnum]=" "; $cellnum++; } } sub getday { my ($year,$month,$day)=@_; if($month<3){ $month += 12; $year--; } return ($year+int($year/4)-int($year/100)+int($year/400)+int((13*$month+8)/5)+$day)% 7; } #==================== 月ファイル読み込み(%LOGに代入) ========== sub loadLogfile { my ($ln, $day, $hour1, $min1, $hour2, $min2, $title, $place, $comment); open(FILE, "<$DATAPASS") or printErrorPage($DATAPASS); eval{ flock(FILE, 1) }; @LOG = ; close(FILE); #open(FILE, "<$DATAPASS") # or printPage("openError"); #eval{ flock(FILE, 1) }; #while($ln = ) { # chomp $ln; # ($day, $hour1, $min1, $hour2, $min2, $title, $place, $comment) = split(/\t/, $ln); # $LOG{$file} = $name; #} #close(FILE); } # ------------------------------------------------メインhtml出力(メインhtmlのひな型) sub printPage { my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time); $year += 1900; $mon++; my $begin = $FORM{'page'} * $PAGEVIEW; my $end = $begin + $PAGEVIEW; if($end > @DATA) { $end = @DATA; } printHttpHeader(); print < コミュニティ|埼玉大学軟式庭球同好会
END #振り分け if ($_[0] eq "IDpassed") { print <
ようこそ、$ID{'name'}さん
END }elsif($_[0] eq "IDerror") { #ID,PASSが異なります print <
自動的にログイン
END }elsif($_[0] eq "IDvoid") { #ID,PASSを入力してください print <
自動的にログイン
END } #振り分け終わり print <
埼玉大学軟式庭球同好会トップページ軟式庭球同好会についてスケジュール試合結果フォトアルバムコミュニティ
コミュニティトップ
END #振り分け if ($_[0] eq "IDpassed") { print <このページは軟式庭球同好会会員向けのページです。
外には公開されないようになっているはずですが、どこにミスがあるかわからないので、あまり見られたくないことは載せないほうがいいかもしれないです。

END print "
\n\"お知らせ\"
"; for($i = 0 ; $i < 5 ; ++$i) { my ($date, $title, $author, $email, $text, $link) = split(/\t/, $INFO[$i]); if ($title ne ""){ $text_a = ''; $text =~ s/
//g; $text = substr($text,0,120); while ($text =~ /([\x00-\x7f]|..)/g) { $text_a = $text_a.$1; } print <$title $author
$text_a...(続きを見る

END } } print "
\n"; print "
\n\"掲示板\"
"; for($i = 0 ; $i < 5 ; ++$i) { my ($date, $title, $author, $email, $text) = split(/\t/, $BBS[$i]); if ($title ne ""){ $text_a = ''; $text =~ s/
//g; $text = substr($text,0,120); while ($text =~ /([\x00-\x7f]|..)/g) { $text_a = $text_a.$1; } print <$title $author
$text_a...(続きを見る

END } } print "
\n"; print "
\n\"フォトアルバム\"
"; if ($ALBUMDATA[0] ne ""){ print "
\n"; for($i = $ALBUMDATA-1 ; $i > $ALBUMDATA-4 ; --$i) { my ($date, $author, $email, $comment, $filepass) = split(/\t/, $ALBUMDATA[$i]); if($date ne ""){ chomp $filepass; $filesumb = $filepass; $filesumb =~ s/.jpg/s.jpg/; print "
\n
"; print "
$comment
"; print "
\n"; } } print "
\n"; } print "
\n"; print "
\n"; print < Menu
カレンダー
\n"; print "\n"; print "
END if($GEMON>1) { $nextpage = $GEMON - 1; $nextlink = "$ENV{'SCRIPT_NAME'}?month=$GEYEAR-$nextpage"; print "<<\n"; } elsif($year<=$GEYEAR) { $nextpage = $GEYEAR - 1; $nextlink = "$ENV{'SCRIPT_NAME'}?month=$nextpage-12"; print "<<\n"; } else { print " "; } print "$GEYEAR年$GEMON月\n"; if($GEMON<12) { $nextpage = $GEMON + 1; $nextlink = "$ENV{'SCRIPT_NAME'}?month=$GEYEAR-$nextpage"; print ">>\n"; } elsif($GEYEAR<=$year) { $nextpage = $GEYEAR + 1; $nextlink = "$ENV{'SCRIPT_NAME'}?month=$nextpage-1"; print ">>\n"; } else { print " "; } print <
$DAY[0] $DAY[1] $DAY[2] $DAY[3] $DAY[4] $DAY[5] $DAY[6]
$DAY[7] $DAY[8] $DAY[9] $DAY[10] $DAY[11] $DAY[12] $DAY[13]
$DAY[14] $DAY[15] $DAY[16] $DAY[17] $DAY[18] $DAY[19] $DAY[20]
$DAY[21] $DAY[22] $DAY[23] $DAY[24] $DAY[25] $DAY[26] $DAY[27]
$DAY[28] $DAY[29] $DAY[30] $DAY[31] $DAY[32] $DAY[33] $DAY[34]
$DAY[35] $DAY[36] $DAY[37] $DAY[38] $DAY[39] $DAY[40] $DAY[41]

ニュース
END # リストの各データを順に処理。 # 各データは、アイテム情報を保存したハッシュへのリファレンス foreach my $item ( @{$item_list} ) { my ($elink,$etitle); # リファレンスから値を出力 $elink = $item->{'link'}; $etitle = $item->{'title'}; Jcode::convert( \$elink, 'euc-jp' ); Jcode::convert( \$etitle, 'euc-jp' ); $etitle = substr($etitle,0,22); $etitle_a = ''; while ($etitle =~ /([\x00-\x7f]|..)/g) { $etitle_a = $etitle_a.$1; } print "$etitle_a...
\n"; } print <>> Yahoo!トピックス一覧

12星座占い
END $ID{'birth'} =~ /([0-9]+)年([0-9]+)月([0-9]+)日/; my $hantei=$2; if($hantei eq "1"){ if($3 >= 21){ $hantei++; } } elsif($hantei eq "2"){ if($3 >= 20){ $hantei++; } } elsif($hantei eq "3"){ if($3 >= 21){ $hantei++; } } elsif($hantei eq "4"){ if($3 >= 21){ $hantei++; } } elsif($hantei eq "5"){ if($3 >= 22){ $hantei++; } } elsif($hantei eq "6"){ if($3 >= 22){ $hantei++; } } elsif($hantei eq "7"){ if($3 >= 23){ $hantei++; } } elsif($hantei eq "8"){ if($3 >= 24){ $hantei++; } } elsif($hantei eq "9"){ if($3 >= 24){ $hantei++; } } elsif($hantei eq "10"){ if($3 >= 24){ $hantei++; } } elsif($hantei eq "11"){ if($3 >= 24){ $hantei++; } } elsif($hantei eq "12"){ if($3 >= 23){ $hantei=1; } }else{ $hantei=1; } my @seiza = ("月データの間違い","山羊座","水瓶座","魚座","牡羊座","牡牛座","双子座","蟹座", "獅子座","乙女座","天秤座","蠍座","射手座"); # リストの各データを順に処理。 # 各データは、アイテム情報を保存したハッシュへのリファレンス foreach my $item2 ( @{$item_list2} ) { my ($elink,$etitle); # リファレンスから値を出力 $elink = $item2->{'link'}; $etitle = $item2->{'title'}; $edescription = $item2->{'description'}; Jcode::convert( \$elink, 'euc-jp' ); Jcode::convert( \$etitle, 'euc-jp' ); Jcode::convert( \$edescription, 'euc-jp' ); if($etitle =~ /$seiza[$hantei]/){ print "$etitle の今日の運勢
$edescription
"; print ">> 全部読む
\n"; } } print <
天気予報
END }else { print <このページ会員向けのページです。
ログインしないと利用できません。

ログインID,パスワードを取得していない方は下の
「アカウントを作成する」よりアカウントを作成してください。


END } print <  END } # ------------------------------------------------認証時ページ出力("トップページ") sub IDpassed { return 0; } # ------------------------------------------------エラーページ出力("ID,PASSが異なります") sub IDerror { return 0; } # ------------------------------------------------ログインページ出力("ID,PASSを入力してください") sub IDvoid { return 0; }