#!/usr/local/bin/perl
# y2rss.cgi(2005/12/3)
# Takao Funami
#
# 以下のソースから変更しました
# yjwebsearch.pl
# Serch example perl script Ver.1(2005/11/30)
#
# Yahoo! JAPAN Web Search.
#
use strict;
use LWP::Simple;
use XML::Simple;
use CGI;
use Jcode;
use XML::RSS;
use utf8;
use Encode qw/from_to/;
#recive query
my $q = new CGI;
my $query = $q->param('query');
my $enc = $q->param('enc');
my $style = $q->param('style');
if ($enc){
from_to($query,$enc,'UTF-8');
}else{
#from_to($query,'UTF-8');
#$query = Jcode->new($query)->utf8;
}
# Set your unique Yahoo! Application ID
my $appID = "xxxxxxxxxxxxx"; #←ここは自分のIDに変更してからお使いください。
# keyword null
if (!$query){
print << "end_no_query";
Content-Type: text/html
Yahoo!の検索結果をRSSにする
Yahoo!APIを使って、Yahoo!検索結果からRSSを生成します。
|
ソースのダウンロード
ソースは、参考程度にご覧ください。SDKのサンプルを改造しています。
Author T.Funami@iRSSの日記
|
Web Services by Yahoo! JAPAN -
Yahoo!デベロッパーネットワーク
end_no_query
exit;
}
#urlエンコード
sub urlencode {
my($str) = @_;
utf8::encode(($str));
$str =~ s/(\W)/'%'.unpack("H2", $1)/ego;
$str =~ tr/ /+/;
return $str;
}
# Construct RSS from a Yahoo! JAPAN Web Search
#YahooAPIでの検索はここから
my $base_url = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch";
my $type = "all"; #alternates: any, phrase.
my $results = 20;
my $language = "ja";
my $results_sort = "rank"; #alternate: date.
my $req_url = "$base_url?appid=$appID&query=$query&results=$results";
$req_url .= "&language=$language&sort=$results_sort";
# Make the request
my $yahoo_response = get($req_url);
# Parse the XML
my $xmlsimple = XML::Simple->new();
my $yahoo_xml = $xmlsimple->XMLin($yahoo_response);
# Set some variables
my $out;
my $result_count = 0;
# Add the column header
my $totalresult = $yahoo_xml->{totalResultsAvailable};
#YahooAPIでの検索はここまで
#$yahoo_xmlに取得した検索結果がある。
#XML::RSSでRSS1.0の生成をはじる。
utf8::decode($query);
my $title = "Yahoo!API検索 - $query";
my $rss = new XML::RSS (version => '1.0');
$rss->add_module(
prefix=>"content",
uri=>"http://purl.org/rss/1.0/modules/content/",
);
my $myUrl = 'http://rss.rdy.jp/y2rss.cgi?query=' . &urlencode($query) . "&enc=UTF-8";
my $description = "検索結果".$totalresult."件";
#channelの生成
$rss->channel(
about => $myUrl."&style=1",
title => $title,
link => $myUrl,
description => $description,
dc => {
date => '',
creator => 'http://rss.rdy.jp/y2rss.cgi',
publisher => 'http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch',
language => 'ja',
},
);
#itemの生成
foreach my $result (@{$yahoo_xml->{Result}}) {
$result_count++;
my $y_title = $result->{Title};
my $y_summary = $result->{Summary};
my $y_url = $result->{ClickUrl};
my $y_modificationdate = $result->{ModificationDate};
(my $sec,my $min,my $hour,my $mday,my $mon,my $year) = localtime($y_modificationdate);
$year += 1900; $mon++;
my $date = sprintf("%04d-%02d-%02dT%02d:%02d:%02d+9:00",$year,$mon,$mday,$hour,$min,$sec);
$rss->add_item(
link => $y_url,
title => $y_title,
description => $y_summary,
dc => {
date => $date,
},
content =>{
},
);
}
#RSS出力
my $outStr = $rss->as_string;
#ちょっと、どんくさいねえ。置換でスタイルシートを埋め込んでいます。
if ($style){
$outStr =~ s/<\?xml version="1.0" encoding="UTF-8"\?>/<\?xml version="1.0" encoding="UTF-8"\?>\n<\?xml-stylesheet href="yrss.xsl" type="text\/xsl" media="screen"\?>\n/;
}
print $q->header('application/xml; charset=utf-8');
print $outStr;