JavaでFlickrのprivateなファイルの公開URLを取得する

※ タイトルがイミフかもですが、読み進めていくと何となく分かります(^ω^;)

皆様は[Flickr](https://www.flickr.com/)使ってますか？
1TBも無料なので、画像も動画も全てここにアップしたいですよね！
APIもあるからプログラムからもいい感じに使えるハズ…
と思い試したり検索してみたところ、公開されている画像の取得方法は結構載ってるんですが、意外とprivateの画像の取得方法はあまり載っていなさそう…
ということで、備忘録代わりに投稿します(*･ω･)ﾉ

## API keyの取得
これがないと始まりません(>_<)
以下から取得してください。
https://www.flickr.com/services/apps/create/apply/

## OAuth TokenとOAuth Token Secretの取得
privateな画像を取得する場合、OAuth TokenとOAuth Token Secretが必要になります。
アップロードにも必要になるので、取得しておいても損はないでしょう(･∀･)
以下の手順を参考に取得してください。
[Getting a Request Token](https://www.flickr.com/services/api/auth.oauth.html#yui_3_11_0_1_1513049868577_371)

## コードを実行する
これで

* Api Key
* Shared Secret
* OAuth Token
* OAuth Token Secret

が揃いました！
次はコードを実行する準備です。

### Flickr4Javaの取得
今回はライブラリを使おうと思います。
gradleの場合は以下を追記します。

```groovy:build.gradle
.....

dependencies {
	compile('com.flickr4java:flickr4java:2.17')
}

.....
```

### 実行コード生成
以下のようにAuthクラスを生成し、RequestContextにセットすることでprivateなファイルにもアクセスできるようになります。
${Api Key}の部分はご自身に合わせて適宜読み替えてください。

```java:Main.java
import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.REST;
import com.flickr4java.flickr.RequestContext;
import com.flickr4java.flickr.auth.Auth;

public class Main {
    public static void main(String... args) throws FlickrException {
        final Flickr flickr = new Flickr(
                "${Api Key}",
                "${Shared Secret}",
                new REST()
        );

        Auth auth = new Auth();
        auth.setToken("${OAuth Token}");
        auth.setTokenSecret("${OAuth Token Secret}");
        RequestContext requestContext = RequestContext.getRequestContext();
        requestContext.setAuth(auth);

        PhotosetsInterface photosetsInterface = flickr.getPhotosetsInterface();
    }
}
```

### privateなファイルの公開URL

以下を参考に、フォーマットすると公開URLが取得できます。
https://www.flickr.com/services/api/misc.urls.html

こんな感じにすると、APIユーザーのsmallサイズ（320px）の画像を公開・非公開関係なく全て取得することができます。

```java:Main.java
import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.REST;
import com.flickr4java.flickr.RequestContext;
import com.flickr4java.flickr.auth.Auth;
import com.flickr4java.flickr.photosets.Photoset;
import com.flickr4java.flickr.photosets.Photosets;
import com.flickr4java.flickr.photosets.PhotosetsInterface;

public class Main {

    private static final String IMAGE_URL = "https://farm%s.staticflickr.com/%s/%s_%s_%s.jpg";

    public static void main(String... args) throws FlickrException {
        final Flickr flickr = new Flickr(
                "${Api Key}",
                "${Shared Secret}",
                new REST()
        );

        Auth auth = new Auth();
        auth.setToken("${OAuth Token}");
        auth.setTokenSecret("${OAuth Token Secret}");
        RequestContext requestContext = RequestContext.getRequestContext();
        requestContext.setAuth(auth);

        PhotosetsInterface photosetsInterface = flickr.getPhotosetsInterface();
        Photosets photosets = photosetsInterface.getList(null);

        photosets.getPhotosets().stream().map(Photoset::getId).flatMap(id -> {
            try {
                return photosetsInterface.getPhotos(id, 0, 0).stream();
            } catch (FlickrException e) {
                throw new RuntimeException();
            }
        }).forEach(photo -> System.out.println(
                String.format(IMAGE_URL, photo.getFarm(), photo.getServer(), photo.getId(), photo.getSecret(), "n")
                )
        );
    }
}
```

## 雑感
比較的簡素なコードでprivateなファイルの公開URLも取得することができました！
個人的なアプリであれば、こんな処理も使えるんじゃないでしょうか♪