2011年11月21日月曜日

突然FlashでFlickrから画像を読めなくなったら「staticflickr問題」。よりHTML5に移行しないとダメだな感が募った。

どうやら2011.11.19日頃から、FlickrのAPIの仕様が変わったようだ。

その影響でFlashのプログラムから画像を読み込めなくなった。より正確に言うと、BitmapData化できなくなった。

とは言え、完全に読み込めなくなったわけではない。スモールサイズは普通に読み込める。読み込めなくなったのは、分かっている限りでは、ラージサイズの画像だ。

では、画像が無くなったのか?と思うと、そうではなかった。

APIでスモールサイズとして返ってきたURLはこれ。
http://farm7.static.flickr.com/6055/6340479554_c0cc8307df_s.jpg

ラージサイズの画像は末尾の「s.jpg」を「b.jpg」に変えればアクセスできる。
http://farm7.static.flickr.com/6055/6340479554_c0cc8307df_b.jpg

つまり、画像は無くなっていない。何なんだ?

実際のエラーはこれだった。

SecurityError: Error #2122: セキュリティサンドボックス侵害 : BitmapData.draw:http://〜 は
http://〜 にアクセスできません。ポリシーファイルが必要ですが、このメディアがロードされたとき、checkPolicyFile フラグが設定されませんでした。

ということで、ポリシーファイルの読み込みがうまくいっていないのか?とも疑ったが、それならスモールサイズも読み込めるはずがない。

しばらく途方に暮れたが、APIで返ってきたラージサイズ用のURLにごく僅かな違いを発見した。
http://farm7.staticflickr.com/6055/6340479554_c0cc8307df_b.jpg

「static.flickr」が「staticflickr」になっているのだ!

これだと、すでに読み込んでいるポリシーファイル「http://farm7.static.flickr.com/crossdomain.xml」は無効になる。なぜなら、ドメインが違うから。

しかも、新サーバーには「http://farm7.staticflickr.com/crossdomain.xml」が無い!403だ \(^o^)/

一瞬オワタか?と思った。しかし、どちらのサーバーもドメインが違うだけで構造もコンテンツも同じなので、こうした。

url = url.replace(/staticflickr/g, "static.flickr");

無事読み込めて、BitmapData化できるようになった(*´∀`*)


Flashのクロスドメイン問題はめんちゃすぎる。しかも、今回のように、いつサーバー側にcrossdomain.xmlが用意されなくなるかも分からないのだ。

こりゃ、ますますHTML5に移行しないとダメだな感が募った。

追記11.11.21:徐々にFlickrコミュニティーでも問題になりつつあるね
Flickr: Discussing Crossdomain.xml returning 403 Forbidden in Flickr API

追記11.11.22:新しいサーバーにcrossdomain.xmlが設置されて問題は解決したようだ。crossdomain.xmlに依存する開発は危険だということを改めて考えるいい機会だった。