#!/usr/local/bin/perl5.8 # # This script is written with UTF-8. # # リポジトリの新規登録アイテムをRSSとして出力するスクリプト。 # OAI-PMHを話せれば、どこにでも使えるはず? # スマートじゃない書き方なので、ちゃんとできる人は直して使ってください。 # by SHIMADA, Susumu at University of Tsukuba Library # # # 使用モジュール(CPANにあり) # Date::Calc # XML::TreePP # XML::RSS(XML::Parser(CPAN)とexpat(http://www.libexpat.org)が必要) # # 使用コマンド(使う場合のみ) # wget(http://ftp.gnu.org/pub/gnu/wget/) # このスクリプトはUTF-8で書かれています use utf8; # 日付計算用 use Date::Calc qw(:all); # XML処理関連 use XML::TreePP; use XML::RSS; # RSSファイル名 my $rssfname1 = "aaa1.rss"; my $rssfname2 = "aaa2.rss"; # baseURL いちおうjunii2に決め打ち my $baseurl = 'http://www.hoge.moge.ac.jp/dspace-oai/request'; my $request = 'ListRecords'; my $meta = 'junii2'; # wget用(使わないなら不要) my $wget = '/usr/local/bin/wget -O '; my $fname = 'oaitemp.xml'; # とりあえず14日前までのデータをハーベスト my $delta = -14; # RSS初期設定 my $rss1 = new XML::RSS (version => '1.0'); my $rss2 = new XML::RSS (version => '2.0'); # RSSチャネル my $c_title = "HogeHoge Repository"; my $c_link = "http://www.hoge.moge.ac.jp/ir.html"; my $c_desc = "Moge University HogeHoge Repository"; my $c_dc_sub = "Library, Repository, Research, Paper"; my $c_dc_crt = "mail@hoge.moge.ac.jp"; my $c_dc_pub = "mail@hoge.moge.ac.jp"; my $c_dc_rt = "Copyright, Moge University Library"; my $c_dc_lng = "ja"; # RSSのtextinput my $t_title = "HogeHoge Search Engine"; my $t_desc = "Search the Channel"; my $t_name = "search"; my $t_link = "http://www.hoge.moge.ac.jp/dspace/simple-search"; # ハーベストの開始日付を算出 ($year, $month, $day) = Today(); ($d_year, $d_month, $d_day) = Add_Delta_Days($year, $month, $day, $delta); # ひとけたの時は頭に0をつける $d_month = "0".$d_month if $d_month =~ /^[1-9]$/; $d_day = "0".$d_day if $d_day =~ /^[1-9]$/; # チャネル # RSS1.0 $rss1 -> channel ( title => $c_title, link => $c_link, description => $c_desc, dc => { subject => $c_dc_sub, creator => $c_dc_crt, publisher => $c_dc_pub, rights => $c_dc_rt, language => $c_dc_lng, }, ); # RSS2.0 $rss2-> channel ( title => $c_title, link => $c_link, description => $c_desc, dc => { subject => $c_dc_sub, creator => $c_dc_crt, publisher => $c_dc_pub, rights => $c_dc_rt, language => $c_dc_lng, }, ); # textinput # RSS1.0 $rss1->textinput( title => $t_title, description => $t_desc, name => $t_name, link => $t_link, ); # RSS2.0 $rss2->textinput( title => $t_title, description => $t_desc, name => $t_name, link => $t_link, ); # XML解析 # record,creator,dexcriptionは複数を想定して強制的に配列に my $parser = XML::TreePP->new( force_array => ["record", "creator", "description"], ); # リクエストURL組み立て my $start_date = $d_year."-".$d_month."-".$d_day; my $request_string = "verb=".$request."&from=".$start_date."&metadataPrefix=".$meta; my $request_url = $baseurl.'?'.$request_string; #=== # なぜかparsehttpが動かないのでwgetを使用 # wget実行 my $com = $wget.$fname." "."\"".$request_url."\""; system($com); #=== # 落ちてきたファイルを読み込んで解析 my $tree = $parser->parsefile($fname); # my $tree = $parser->parsehttp(GET => $request_url); # parsehttpが動くなら↑を使えばスマート # 各record毎に処理 # recordの数を数えて、配列の添字とループに使用 for $i (0 .. $#{$tree->{'OAI-PMH'}->{ListRecords}->{record}} ){ # 著者とdescriptionの格納用 my @creators; my @descriptions; # タイトル $title = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{title}; # $titleが空なら次recordへ(deletedとかの場合) next if !$title; # URL $url = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{URI}; # 登録日 $pubdate = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{header}->{datestamp}; # 資源タイプ $type = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{type}; # NII資源タイプ $niitype = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{NIItype}; # type:NIItypeの形でdescriptionに入れる(ついでに改行も) $restype = $type.":".$niitype."\<\;br\>\;"; push (@descriptions, $restype); # 掲載誌データもdescriptionに入れる # 誌名 $jtitle = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{jtitle}; # 巻 $vol = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{volume}; # 号 $no = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{issue}; # 開始ページ $spage = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{spage}; # 終了ページ $epage = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{epage}; # 細かい判別 if ($jtitle){ $jline = $jtitle; if ($vol){ $jline .= $vol; } if ($no){ $jline .= "(".$no.")"; } if ($spage || $epage){ $jline .= " p."; } if ($spage){ $jline .= $spage; } if ($epage){ $jline .= "-".$epage; } $jline .= "\<\;br\>\;"; push (@descriptions, $jline); } # creatorの処理 for $j (0 .. $#{$tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{creator}}){ $creator = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{creator}->[$j]; push (@descriptions, $creator); } # descriptionの処理 for $k (0 .. $#{$tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{description}}){ $description = $tree->{'OAI-PMH'}->{ListRecords}->{record}->[$i]->{metadata}->{meta}->{description}->[$k]; push (@descriptions, $description); } # 最後に@descriptionsの中身を全部
でつなげる $descs = join("\<\;br\>\;", @descriptions); # RSSのitem出力 # RSS1.0 $rss1->add_item( title => $title, link => $url, description => $descs, pubDate => $pubdate, ); # RSS2.0 $rss2->add_item( title => $title, link => $url, description => $descs, pubDate => $pubdate, ); } # RSS出力 # RSS1.0 print $rss1->save($rssfname1); # RSS2.0 print $rss2->save($rssfname2); # 最後に落としてきたファイルを削除(wget使わないなら不要) unlink $fname;