写真サービスのFlickr(フリッカー)に投稿されている写真URLから、画像データに直接アクセスできるURLを取得する方法をまとめてみました。ブログで画像を貼りたいときや、javascript等のプラグイン作成時に参考となりましたら幸いです。

使ってる言語はNode.js(ES6)です。また、Flickrにアップロードされたオリジナルサイズの画像をダンロードする方法は過去の記事をご覧ください。

Golden apple | Sony α7 + Sonnar T* FE 55mm F1.8 ZA
 Golden apple | Sony α7 + Sonnar T* FE 55mm F1.8 ZA ©

目次

Flickr APIで取得できる画像サイズ

フリッカーで画像の各アドレスを取得するには、Flickr APIを使用する事になります。また、各画像の情報を取得するにはgetSize()やというメソッドを使います。

Flickr API
flickr.photos.getSize

Size Suffixes

前述のメソッドgetSize()では次のようなサイズの画像URLや画像の高さ等を取得できます。

ラベル名 画像サイズ 画像URLの接尾辞
Square 正方形 75px s
Large Square 正方形 150px q
Thumbnail 長辺 100px t
Small 長辺 240px m
Small 320 長辺 320px n
Medium 長辺 500px なし
Medium 640 長辺 640px z
Medium 800 長辺 800px c
Large 長辺 1024px b
Original オリジナルサイズ o

サムネイルサイズからオリジナルサイズまで色んな種類の画像サイズをFlickrから取得する事ができるようになっています。詳しい内容はFlickr APIのSize Suffixesをご覧ください。

Flickr API
The App Garden| Size Suffiexes

オリジナルサイズは2段階の処理を行う

ただしOriginalサイズや非公開設定されている写真画像のURLを取得する場合には、以下の記事で解説するように2段階の手順を踏むことになります。

今回はまず、上記記事のような2段階の手順を踏まないケースを例に取り上げ、シンプルな画像URL取得を行ってみたいと思います。

Flickrの画像アドレスを取得するコード

フリッカーで各サイズの画像のURLを取得するには、例えば以下のようなコードで可能になります。まずは、取得したい対象のFlickrのURLを以下のように改行区切りで記述しておきます。

flickrURLList.txt
1
2
3
4
5
6
7
8
https://www.flickr.com/photos/your-user-name/38423953551/in/album-72157691613251455/
https://www.flickr.com/photos/your-user-name/39322064172/in/album-72157691613251455/
https://www.flickr.com/photos/your-user-name/38392627092/in/album-72157691613251455/
https://www.flickr.com/photos/your-user-name/38368119846/in/album-72157691613251455/
https://www.flickr.com/photos/your-user-name/39351384131/in/album-72157691613251455/
https://www.flickr.com/photos/your-user-name/38643816484/in/album-72157691613251455/
https://www.flickr.com/photos/your-user-name/38643816394/in/album-72157691613251455/
https://www.flickr.com/photos/your-user-name/39322065252/in/album-72157691613251455/

続いて以下のように、画像アドレス取得に関する操作を記述していきます。今回は長辺1024pxの画像URLを取得するコードです。

flickr-image-url-resolve.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const fs        = require("fs")
const FlickrAPI = require("flickrapi")

// APIの各情報を設定。アカウント情報はFlickr APIのThe App Gardenで取得する
const flickrApiOptions = {
api_key : "xxx" ,
secret : "xxx" ,
permissions : "delete" ,
user_id : "xxx@Nxx" ,
access_token : "xxx-xxx" ,
access_token_secret: "xxxx"
}

// flickrのURLが改行区切りとなったテキストファイルを読み込み、配列を取得する
let readListFile = () =>
new Promise( ( resolve , reject ) => {
try {
let fileData = fs.readFileSync('./flickrURLList.txt', 'utf8')
let urlList = fileData.split("\n");

resolve( urlList )
} catch (e) {
reject( new Error(e) )
}
})


// flickrのURLからphoto IDを抜き出す
let getPhotoIDFromURL = (inList) =>
Promise.all( inList.map( (flickrUrl) =>
new Promise( ( resolve , reject ) => {
let matc = flickrUrl.match(/https\:\/\/www\.flickr\.com\/photos\/[a-zA-z0-9\-]+\/([0-9]+)\//)
if(matc){
resolve(matc[1])
}else{
reject( new Error('This URL not found photo ID.') )
}
})
))


// 長辺1024pxの画像URLを取得する
let get1024URL = (photos) =>
photos.reduce( (promise, value) =>
promise.then( (editedArray) =>
parallel_get1024URL(value).then( (editedElement) => {
editedArray.push(editedElement)
return editedArray
})
)
, Promise.resolve([]))

let parallel_get1024URL = (photoId) =>
new Promise( ( resolve , reject ) => {
FlickrAPI.authenticate(flickrApiOptions, (error, flickr) => {
let parameter = {
"api_key" : flickrApiOptions.api_key ,
"photo_id" : photoId
}

if(!error){
flickr.photos.getSizes(parameter, (err, result) => {
if(err) {
console.log("flickr APIの実行に失敗しました")
console.log("エラーメッセージ:")
console.log(err)
console.log("パラメータ:")
console.log(parameter)
reject()
}else{
let photoInfo = {
width : "",
height: "",
source: "",
}
for(let s of result.sizes.size){
if(s.label == "Large"){
photoInfo.width = s.width
photoInfo.height = s.height
photoInfo.source = s.source
break
}
}

resolve(photoInfo)
}
})
}else{
console.log("flickr APIのアクセスに失敗しました")
reject()
}
})
})


// 出力するテキストを加工する
let putConsole = (inList) =>
Promise.all( inList.map( (photoInfo) =>
new Promise( ( resolve , reject ) => {
console.log(`${photoInfo.source}`)
resolve()
})
))


// 各関数の実行
readListFile()
.then(getPhotoIDFromURL)
.then(get1024URL)
.then(putConsole)
.then( (inObj) => {
return new Promise( (resolve , reject) => {
process.exit(1)
resolve()
})
})

node.jsやnpmそしてコマンドラインについてご不明な場合は以下をご覧ください。