画像共有サービスのURLから画像データを 取得する
こんにちは!松本です。
ちょっと前にInstagramがFacebookに10億ドルで買収されるというニュースがネットを駆け巡りました。
Instagramを始め、Twitterが流行りだしてから現在まで画像を投稿して共有するサービスが多くローンチされています。
企業がTwitterを使ってキャンペーンなどを行う際にも専用のハッシュタグを使って画像をtwitterに投稿してもらい、運営サイドでそれを使用してコンテンツを作っていく形式をよく見ますね。
ですが実際どのサービスがどんな特徴を持っているのかわかりにくく、キャンペーンを行なっても各ユーザーが様々なサービス経由で画像を投稿してきます。
多くの場合主要なサービスに絞ってリリースすることになりますが、案件ごとに微妙に対応するサービスが違うため開発者はそのたびにAPIのドキュメントを読む作業に追われ、サービスによってはAPIすらなかったりするのでそういう場合はサービスページのHTMLソースをパースして該当imgタグのsrcを正規表現を使って取得しなければいけないこともあるわけです。
各画像共有サービスのURLから投稿された画像を保存する、もしくは直接アクセスするためのURLを取得する方法を備忘録的に書きます。
商用利用の場合は商用のアカウント作ったりしなきゃいけないこともあるので注意。
今回取得したサービスは以下の6つ。
- twitter公式
- flickr
- Yfrog
- picplz
- twitpic
ここではtwitterに投稿されたTweetからの取得をベースにしています。
各サービス短縮URLで投稿されるようですがTwitterAPIは遷移先のURLを取得してくれるので便利です。
ユーザ名からタイムラインを取得するAPIを叩きます。
include_entitiesを指定しないと画像情報をとってこれないので注意。
http://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&screen_name=hogehoge
帰ってきたjsonにentitiesというプロパティがあります。これ以降はその中のデータを使います。
Twitter公式
entitiesの中にmedia_urlというプロパティがありますのでそれを叩くと画像へ直接アクセスできます。公式だけあって簡単!
ちなみに画像の拡張子の後に
:large
:medium
:small
:thumb
などつけることでリサイズされた画像を取得できます。
デフォルトはmediumになっています。
flickr
flickrも利用者は結構多いですね。flickrの場合はapiを叩く際にapiキーが必要になりますので取得しておいて下さい。
twitterへ投稿される場合は独自の短縮URLが使われています。
entitiesのなかにexpanded_urlというプロパティがあります。twitterにurlを投稿するとtwitterの短縮URLが表示されますが飛び先のURLをtwitterで展開して渡してくれます。
http:://flic.kr/p/******
という感じのflickrの短縮URLが取り出せます。
この******の部分が画像のIDなんですが、base58エンコーディングされていますのでデコードしてやります。
デコードして得られる数字が画像の生IDです。それを使ってapiを叩きます。
http://www.flickr.com/services/rest?method=flickr.photos.getInfo&format=json=api_key=[API_KEY]&photo_id[PHOTO_ID]
各クエリパラメータ
method:apiのメソッド名を指定します。ここでは画像情報を返すphoto.getInfoを指定します
format:返ってくるデータの形式。jsonを指定
api_key:各自取得するapiキー。(商用アプリの場合は商用アカウントが必要な模様。)
photo_id:上で取得した画像の生ID
エラーの場合はエラーコードが返って来ますが省略します。
返ってくるjsonのphotoというプロパティが画像の情報です。
URLが直接返ってくれば楽なんですが、この中のデータを使ってURLを成形する必要があります。
使用するのは
farm
server
secret
id
です。flickrの画像データは
http://farm[FARM].staticflickr.com/[SERVER]/[ID]_[SECRET]_b.jpg
というURLにおいてあります。[]の中に取得した各データを入れてやります。
最後の_b.jpgの部分ですが、ここはサイズを指定します。
サムネイル、トリミングした画像などをアルファベット一文字で指定します。
flickrで有料ユーザになっている場合はoを指定することでオリジナルの画像を取得できますが、無料ユーザーの場合は最大1024pxのbが一番大きいサイズになります。
現在画像の拡張子は全てjpgになるようです。試しにアニメーションgifを上げましたがjpgになってしまいました。
Instagramでは取得方法が一つじゃないようですが、ここでは一番簡単だと思われる方法で取得します。
まず、apiのURLは以下の形式。
http://api.instagram.com/oembed?url=************
********の部分にはentitiesの中のexpanded_urlを指定。
返ってきたjsonにurlというプロパティがありますのでそれが画像の直リンクURLです。
こちらも簡単ですね。
Yfrog
expanded_urlには
http://yfrog.com/******
こんな感じでURLが渡ってきますので******部分の画像IDを正規表現で抜き出したら
リクエストするapiのurlは以下のようになります。
http://yfrog.com/api/xmlInfo?path=******
Yfrogは取得できるデータの形式がxmlなのでsimpleXMLなどでパースしてやります。
画像のURLはlinksの中のmedia_linkで取得できますが、オブジェクトなので
(string) $xml->links->media_link
上記のようにキャストして使いました。
※Yfrogは同じ方法で動画のURLも取得できます。
picplz
InstagramがAndroidに対応していなかったため、Androidユーザーに広まったpicplzです。
読み方はピックプリーズが正しいようですが間違ってたらごめんなさい。
expanded_urlにはYfrogなどと同じように
http://picplz.com/*****
こんなURLが入っています。*****の部分、画像IDを正規表現で抜き出します。
http://api.picplz.com/api/v2/pic.json?shorturl_id=******
apiのurlは上記のようにshorturl_idという名前でIDを指定。
ここまでは簡単なんですが、データの構造が深いので少しだけめんどくさいです。
valueの中picsの下に画像が配列で並んでいます。配列のキーを指定したらその中、pic_filesには各サイズへのリンクが入っていますので欲しいサイズのurlを取得。ちょっとわかりにくいですが、
$response[“value”][“pics”][0][“pic_files”][“640r”][“img_url”]
こんな感じでアクセスします。
twitpic
Instagramの次くらいに使われてる気がします。あくまで自分の周りのお話ですが。
http://twitpic.com/*****
twitpicもurlは上記のようになっています。apiもシンプルで
http://api.twitpic.com/2/media/show.json?id=*****
これでデータを取得できます。.jsonを他のフォーマットにすることもできます。
データの中にidと、ファイルの拡張子であるtypeというプロパティがあるんですが、
これを使って画像のURLが生成できます。
[1-5]としてある部分はサーバの番号なんですが、1から5までどれを指定しても現状同じ画像へアクセスできるので好きな数字を入れて下さい。urlは以下のように指定します。
http://s1-0[1-5].twitpicproxy.com/photos/full/[ID].[拡張子]
twitpicも動画に対応しているサービスですが、動画のURLは上記のような指定ができませんでした。
ですがFrickrのようにFlashが使われておらずHTML5での実装のため動画URLのHTMLをパースして特定のタグをスクレーピングすれば
動画の実データを取得することはできます。
コンテンツ動画の場合はapiのレスポンスデータにvideoというプロパティがありますのでそれで判別可能です。
技術