雑食性雑感雑記

知識の整理場。ため込んだ知識をブログ記事として再構築します。

flickr API を使う ( Python )

概要

  • flickr API を Python で使用してみる。
  • 特定ユーザの画像リストを取得する。

flickr って?

  • https://www.flickr.com/
  • 画像共有サービス
  • 無料アカウントでも 1TB まで画像を入れておける!!
    • ( 2014/03/26 時点。将来はもっと増えるのかも?? )
  • 日本では、そこまで流行っていない感がある。基本が英語だから?

flickr API

  • flickr アカウントがあれば使用することができる API。
  • API Key を取得すれば使用可能。ただし、登録の手間が少しかかる。
    • 『flickr API』でググると色々方法出てくる。ここでは省略。

API の使用

  • API Key と Secret を入手すると、様々な言語で利用可能。
  • The App Garden に大量に置いてある。

flickrpy

  • 今回は、Python の flickrpy を使用した。

初期設定

  • flickr.py 内の API_KEY と API_SECRET に、取得した値を入れる。

# (前半部省略)

# set these here or using flickr.API_KEY in your application
API_KEY = ''      # <= ここに API Key を設定
API_SECRET = ''   # <= ここに API secret を設定
email = None
password = None
AUTH = False
debug = False

# (以下省略)

使ってみる。

  • 後は、他の python ファイルから「import flickr」すれば使用可能。
  • 以下では、指定したユーザのオリジナルサイズ画像一覧の URL を取得している。
    • 使用例:『$python get_flickr_user_photos.py 101142033@N08 out.csv』

  • get_flickr_user_photos.py
# -*- coding: utf-8 -*-

import flickr

import csv
import json
import sys


def execute( user_id, dest_filename ) :
    '''
    flickr API を用いて、指定ユーザの写真 URL を取得します。
    写真名と URL を対にした CSV ファイルとして出力します。

    TODO : ユーザが存在することのチェック
    TODO : 出力ファイル名のファイルが書き込めることのチェック
    '''

    destfile = open( dest_filename, 'w' )
    dest = csv.writer( destfile, lineterminator = '\n' )

    header = [ "Title", "URL" ]
    dest.writerow( header )

    page_count = 0
    photo_max  = 1
    while ( photo_max > 0 ) :

        page_count += 1

        photos = flickr.people_getPublicPhotos( user_id, page = str( page_count ) )

        photo_max   = len( photos )
        photo_count = 0

        for photo in photos :
            photo_count += 1

            title = str( photo.title )
            print "Page {0} ({1}/{2}), Get photo : {3}".format( page_count, photo_count, photo_max, title )

            sizes = str( photo.getSizes() )
            url = _getOriginalUrlFromSizes( sizes )

            row = []
            row.append( title )
            row.append( url )
            dest.writerow( row )


    destfile.close()


def _getOriginalUrlFromSizes( sizes ) :
    '''
    各サイズの URL からオリジナルサイズの URL を取得します。
    '''

    text = sizes.replace( "'", "\"" )
    json_sizes = json.loads( text )

    result = None
    for json_objs in json_sizes :
        label = json_objs["label"]
        if ( label == "Original" ) :
            result = json_objs["source"]
            break

    return result


'''
メイン処理
'''
if __name__ == '__main__' :

    argv = sys.argv
    argc = len( argv )

    user_id = None
    dest_filename = "out.csv"

    if ( argc < 2 ) :
        print "Usage: $ python {0} <user ID> <dest filename>".format( argv[0] )
        quit()

    user_id = argv[1]

    if ( argc >= 3 ) :
        dest_filename = argv[2]

    execute( user_id, dest_filename )

他の使い方

  • ドキュメントが無いので、基本は「ソースを読め」というスタンスと思われる。
  • flickr.py の処理名は flickr API の名前とほぼ同じなので、その辺りから引いてくれば問題なさそう。