PythonでFlickr APIを使って写真を検索する

Flickr APIを使うブログ記事が気になり、せっかくのお休みなのだが台風も来ていることだし、Pythonでやってみることにした。参考にした下記ブログサイトではJavaでプログラミングしている。

Flickr APIを使ってみよう(1.APIキーの取得) | Tech Booster

本家FlickrのAPIの説明は下記URLに説明されている。英語力に自信の無い僕はGoogle翻訳でざっと説明を読んだ。

Flickr Services

実験環境

  • ThinkPad X200
  • Windows7 Professional 64bit
  • Python 2.7.3

APIキーの取得

何はともあれ、APIキーを取得しないとAPIを使えない。最初にYahoo.comのアカウントを取得し、次にFlickrのAPIキーを取得する手順となります。

下記URLを表示させると、YahooのID入力画面が表示されたので、Create New AccountからYahooアカウントを取得します。
https://www.flickr.com/services/api/keys/

WS000051

アカウントを作る過程で携帯電話番号を入力しなければなりません。Yahoo.comから登録した携帯電話に”4桁の番号”が届き、本人認証する仕組みになっているようです。日本の携帯電話番号で大丈夫なのかと不安になりましたが、ちゃんと自分の携帯にCメールで受信できました。これは凄い、ちょっと感動ものでした。

さて、無事にログインできたら、下記URLからAPI KEYを取得します。
https://www.flickr.com/services/apps/create/apply/

仕事じゃないんで、Non-Commercialから登録します。
WS000052
アプリケーションの名前と利用目的を入力してsubmitすると、API KEYとsecretを取得できます。

写真検索する

写真を検索するために知っておかないといけないのは、検索するときに使うURL、検索APIの仕様、JSONレスポンスの仕様です。

検索結果をJSON形式で表示するプログラムを書いてみます。

# -*- coding: utf-8 -*-

import json
import requests

url = 'https://api.flickr.com/services/rest/'
API_KEY = 'YOUR API KEY'

payload = {
    'method': 'flickr.photos.search',
    'api_key': API_KEY,
    'text': 'daifuku',
    'per_page': '5',
    'format': 'json',
    'nojsoncallback': '1'
    }

r = requests.get(url, params=payload)

print r
print json.dumps(r.json(), sort_keys=True, indent=2)

Flickr APIのurlは https://api.flickr.com/services/rest/ でパラメータを次のようにしてみました。method に 検索のAPIを、api_keyに 先ほど取得した自分のAPIキーを指定します。textに検索するワードを入力しますが、今回は daifuku を検索することにします。そして、per_pageは検索結果数ですが、結果をわかりやすく表示するため5を指定し、formatは検索結果をjson形式とし、jsonコールバックは使わないようにnojsoncallbackに1を指定します。

requests.get でAPIをたたき、検索結果を取得し、json.dumpsメソッドで整形することで、段組のついたわかりやすい表示で出力します。

<Response [200]>
{
  "photos": {
    "page": 1,
    "pages": 597,
    "perpage": 5,
    "photo": [
      {
        "farm": 4,
        "id": "14676462357",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "107369966@N07",
        "secret": "de3d8c1e63",
        "server": "3882",
        "title": "Fruits Daifuku picture2"
      },
      {
        "farm": 3,
        "id": "14804540585",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "32889649@N08",
        "secret": "3d735c3f54",
        "server": "2904",
        "title": "ichigo daifuku"
      },
      {
        "farm": 6,
        "id": "14769419672",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "55490231@N08",
        "secret": "c47646a535",
        "server": "5563",
        "title": "berry daifuku"
      },
      {
        "farm": 3,
        "id": "14583104169",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "55490231@N08",
        "secret": "5a32527b06",
        "server": "2895",
        "title": "Yomogi daifuku/\u84ec\u5927\u798f"
      },
      {
        "farm": 4,
        "id": "14741129311",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "64779930@N08",
        "secret": "33c49c4e18",
        "server": "3881",
        "title": "Mmoochhiii! Azukii! Strawberries!"
      }
    ],
    "total": "2985"
  },
  "stat": "ok"
}

ちょっと長くなったので、続きは次のエントリーで

Python

Posted by skw