適当な思いつきで書くブログ

UbuntuやPerlやJavaScriptやVimやZshやShellScriptやMySQLと戯れている中で適当な思いつきでやってみたことを書いています。

Yahoo!画像検索APIが表示できない画像も返すからjquery.lightbox.jsがうまいこと動いてくれなくなってしまうのでLWP::UAでcontent-typeを見て画像ではなかったらデフォルト画像にリダイレクトさせるようにしてみました

最近、めっきり寒くなってきましたね。
私ごとですが先週末にこじらせた風邪が週中にひどくなり、会社を一日お休みさせて頂きました。(今はほぼ完治です
皆様もお体には十分お気をつけください。

Yahoo!画像検索APIが直リンで表示できない画像も返しちゃう

Yahoo!画像検索APIはキーワードを渡すとそれに関連する画像URLや掲載ページURLなどを返してくれるAPIです。

結構便利なAPIなのでちょくちょく使わせてもらっていますがちょっと問題がありまして、返ってくる検索結果の中に直リンクだと表示できない(例えばFC2ブログの画像や新聞社サイトの削除済みのページの画像など)も含まれていたりします。

表示できない画像だとjQuery.jsのLightBoxプラグイン jquery.lightbox.jsが動かなくなる

jQuery.jsでLightBoxなインタフェースを実現するプラグインはいろいろと出ているようなのですが、自分がよく使っているjsはWarren Krewenkiさん作のものです。

使い方は上のURLをご覧ください。なかなか簡単な設定で書けてしまいます。
(relを使うのがちょっと気にくわないんですけどね…)


さて、このプラグインYahoo!画像検索APIが返した直リンで表示できない画像を表示しようとすると

  • 当たり前ですが、表示できない。ローディングがエンドレス
  • 次の画像にも進めない、前の画像にも戻れない
  • いったんCloseして再度表示可能な画像クリックしてもまだローディング中で表示できない

というニューマシンガンズVSヘルミッショネルズ戦のキン肉マンでいうところの「地獄の三重苦」状態に陥ってしまいます><

結局、LWP::UAで。

LWP::UserAgentで表示しようとする画像URLのcontent-typeを見てimage/***か否かをチェックし、画像でない場合(404ページとか)はデフォルトの画像にリダイレクトさせることにしました。
jquery.lightbox.jsでonerrorの処理を追加するという手もあったかも知れませんが、プラグインのupdateなどがあったら面倒なので…)


hoge.pl?src=http://www.example.com/fuga.jpg で画像URLを渡し、

  • content-typeが"image"から始まらない文字列だったら用意してあるデフォルト画像404.jpgにリダイレクト
  • そうでない場合は、OKということでその画像URLにリダイレクト

させました。


hoge.pl

#!/usr/bin/env perl

use strict;
use warnings;
use CGI;
#use HTTP::Request;
use LWP::UserAgent;

my $q = new CGI;
my $src = $q->param('src');
#my $req = HTTP::Request->new( GET => $src );
my $ua  = LWP::UserAgent->new;
#my $res = $ua->request( $req );
my $res = $ua->head( $src );  #HEADリクエストに変更

#if ( $res->{_headers}->{'content-type'} !~ /^image/ ) {
if ( $res->header('Content-Type') !~ /^image/msx ) {  # アクセサメソッドに変更
# ステータスコードも見た方がいいのかな?
# if ( $res->code ne '200' || $res->header('Content-Type') !~ /^image/msx ) {
    $src = '/404.jpg';
}
print CGI::redirect( $src );
追記

id:holidays-l さんからご指摘をいただき2箇所修正しました。ありがとうございました。

ということで、問題解決しました

お互いがお互いを助け合う、まさに友情パワーですね。

おまけ

風邪がとりあえず治ったので、11/27のShibuya.pm#10に参加させて頂きます!楽しみです><