2007年11月30日 (金)
ビデオ共有のAPI(XML形式)を使ってみよう 第一回
はじめまして~、@niftyビデオ共有の開発見習いの砂ずりです♪
今回、上司の焼き鳥から
「せっかくAPIを公開したんだから、なんかサンプル作れ~!!」
との指示を受けまして、PerlでXML形式のAPIを呼んで「初音ミク」なビデオを検索しちゃうサンプルコードを作ってみました。少し気が引けますが、ご紹介させていただきます(^_^;)
その前に、Perlでビデオ共有のXML形式のAPIを扱う場合にちょっとだけ注意することがあります。
実は、文字コードが最近主流の「UTF-8」でなく「Shift_JIS」(Windows-31Jとかcp932ともいう)なので、そのままでは取り扱いが面倒です。 そこで以下の2番目と3番目の下準備をして、文字コード依存の心配を取り除きますv
- まずは実行環境を整えることから、ActivePerl 5.8.8をインストールします。
- XML::Parser でAPIの結果をパースすると、UTF-8フラグがついてしまうので、このフラグを再帰的に落としてくれる便利なモジュール Unicode::RecursiveDowngrade をCPANサイトからダウンロードしてインストールします。 この Unicode::RecursiveDowngrade は、フィルターも設定できるすぐれものなので、UTF-8フラグを落とすのと同時に文字コードの変換もできてしまいます。
- XML::Parser は、Shift_JISのエンコーディングに対応していないので、変換ツールmkenc.plを使って「x-sjis-cp932.enc」から「Shift_JIS.enc」を追加します。
※ 「Perl XMLでencoding='Shift_JIS'や'euc-jp'を使う」のページを参考にさせてもらいました。 - 最後にサンプルコード(sample01.pl)を実行します。
#!/usr/bin/perl
#/////////////////////////////////////////////////////////////////////////////
# Copyright(c), 2007 NIFTY Corporation.
# Created: 2007-11-29 by 砂ずり
#
# sample01.pl - @niftyビデオ共有 REST-XMLサンプルコード
#
#「タイトル」もしくは「説明コメント」に文字列「初音ミク」を含むビデオを検索する例
# % perl sample01.pl 初音ミク
#
# $Id: $
#/////////////////////////////////////////////////////////////////////////////
use strict;
use warnings;
use Data::Dumper;
use LWP::Simple;
use XML::Simple;
use Unicode::RecursiveDowngrade;
use Devel::Peek;
use Encode;
#/////////////////////////////////////////////////////////////////////////////
my $SYS_ERR =1;
my $URL = 'http://api.video.nifty.com/cs/catalog/video_metadata/listapi-v1/efg_0/1.xml?pgcnf=10';
#-----------------------------------------------------------------------------
# 文字コードをUTF-8をWindows-31J(CP932)に変換する。
sub enc {
my $str = shift;
Encode::from_to($str, 'utf8', 'cp932');
return $str;
}
#-----------------------------------------------------------------------------
# コマンドライン引数の文字列をタイトルと説明に含むビデオを検索する。
sub main {
unless( $#ARGV == 0 ) {
print STDERR "usage: perl $0 s1(search string) \n";
exit($SYS_ERR);
}
my $url = $URL . "&s1=$ARGV[0]";
my $content = get($url) or die "cannot get content from $url";
my $parser = XML::Simple->new;
# includes flagged UTF-8
my $data = $parser->XMLin( $content, ForceArray=>1 );
my $rd = Unicode::RecursiveDowngrade->new;
# set encode filter
$rd->filter(sub { enc(shift) });
# unflagged UTF-8
$data = $rd->downgrade($data);
my $list = $data->{result}->[0]->{video};
foreach my $video ( @$list ) {
# print Dumper( $video );
my $id = $video->{id}->[0];
my $title = $video->{title}->[0];
my $user_name = $video->{user_name}->[0];
my $p_url = $video->{p_url}->[0];
print "--------\n";
print "id=[$id]\n";
print "title=[$title]\n";
print "user_name=[$user_name]\n";
print "p_url=[$p_url]\n";
}
}
#/////////////////////////////////////////////////////////////////////////////
main;
↓拙いですが、やり方のビデオも作ってみたので、よかったら参考にしてください。
Perlが好きな人がいましたら、いろいろいじって遊んでくださいね~☆




