写真サービスのFlickr(フリッカー)に投稿されている写真URLから、画像データに直接アクセスできるURLを取得する方法をまとめてみました。ブログで画像を貼りたいときや、javascript等のプラグイン作成時に参考となりましたら幸いです。
使ってる言語はNode.js(ES6)です。また、Flickrにアップロードされたオリジナルサイズの画像をダンロードする方法は過去の記事をご覧ください。
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.txt1 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.js1 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")
const flickrApiOptions = { api_key : "xxx" , secret : "xxx" , permissions : "delete" , user_id : "xxx@Nxx" , access_token : "xxx-xxx" , access_token_secret: "xxxx" }
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) ) } })
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.') ) } }) ))
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そしてコマンドラインについてご不明な場合は以下をご覧ください。
node.jsやコマンドラインについて
node.jsの環境を用意する方法やコマンドラインの使い方については以下を併せてご覧ください。