Patreon API(javascript)でパトロン一覧を取得する

日本語の記事が死ぬほど少なかったので。
Patreonのパトロン（支援者）一覧をAPIから取得する方法について解説します。
[公式ドキュメント](https://docs.patreon.com/#introduction)も存在しますが、一応備忘録として...
Javascriptで書いていきます。

# 用語
内包している値等はドキュメントを参照してください。

## User
Patreonのユーザー（アカウント）に関する情報です。これはクリエイター、パトロンのどちらともに作成されます。

[User v2](https://docs.patreon.com/#user-v2)

## Campaign
Userと似ているんですが、こちらはクリエイターのみにしか作成されません。
**今回使うのは基本こっちです。**

[Campaign v2](https://docs.patreon.com/#campaign-v2)

## Rewerd
Patreonで作成するTier(プラン)と考えて大体OKだと思います
プランなしの一回きりの支援の場合、内部的には「無」のRewardで支援されるっぽいです。

[Tier](https://docs.patreon.com/#tier) (ドキュメントは多分これです。名前が違いますが)

## Pledge
金銭に関わる活動だと思います。多分ですが(説明が無いので)
パトロンがUserとして、パトロンが支援しているプランがRewardとして取得することが出来ます。

[Pledge](https://docs.patreon.com/#pledge)


# 準備
Patreonのアカウントを持っていること、Patreon自体の諸々の設定が終わっていることを前提にしています。

## アクセストークンを取得する
[ここ](https://www.patreon.com/portal/registration/register-clients)に移動して、クライアントを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/107334/1ef144b8-28b6-03c0-8c92-ef0025ccac22.png)
必要な部分を入力し、APIバージョンを**2**に設定します。
![chrome_2018-12-26_13-39-14.png](https://qiita-image-store.s3.amazonaws.com/0/107334/a8ed4873-b546-c94f-84e9-f2bd6d89e6c6.png)

こんなふうに生成されると思います。

必要なのは`Creator's Access Token`ですので、これを`.env`ファイルに追加しておきましょう。（.envファイル等の扱いは[dotenv](https://www.npmjs.com/package/dotenv)を参考にしてください。）

```
PATREON_ACCESS_TOKEN=hogehoge
```

## インストール

[patreon.js](https://github.com/Patreon/patreon-js)をインストールします。

```
yarn add patreon
```

または

```
npm install patreon
```

# コードを書く
各々適宜修正してください。

## Campaign IDを取得する

最初に、手動で自分の`Campaign ID`を取得します。[^1]

`process.env`に対応する環境変数が入っていることにします。

```javascript
import { patreon as PatreonAPI } from 'patreon'

async getPatrons(){
	const client = PatreonAPI(process.env.PATREON_ACCESS_TOKEN) // 1
	const { store } = await client('/current_user') // 2
	console.log(store.findAll('campaign')[0].id) // 3
}
```

1. 先程のトークンからクライアントを生成します。
2. 自分のユーザー情報を取得します。
3. `campaign`を型にもつ値をすべて取得し、1番目の要素のidをconsole.logで取得します。（ちなみにデータの形式は`JsonApiDataStoreModel`という形式で扱われているようです。[Github](https://github.com/beauby/jsonapi-datastore)）

これにより自分の`Campaign ID`が出力されますので、これを保存しておきます。

.envファイルに`MY_PATREON_CAMPAIGN_ID`として追加しておきましょう。

## pledgeを取得する
先程の`Campaign ID`から、Pledge（金銭活動）を取得します。

先程のコードを書き直して、

```javascript
import { patreon as PatreonAPI } from 'patreon'

async getPatrons(){
	const client = PatreonAPI(process.env.PATREON_ACCESS_TOKEN)
	const { store } = await client(`/campaigns/${env.MY_PATREON_CAMPAIGN_ID}/pledges`) // 1
	const pledges = store.findAll('pledge') // 2
	Object.values(pledges).forEach(pledge => { // 3
		const patron = pledge.patron // 4
		const reward = pledge.reward // 4
	}
}
```

1. campaignに紐づけされたpledgesに関する情報を取得します。
2. `pledge`を型に持つ値を全て取得します。
3. `Object.values()`で回していきます（`Object.keys`だとpledge idが返ってくるので）
4. pledgeからパトロンのユーザー情報、プランなどを取得していきます。

あとは取得した情報などからデータをあれやこれやして扱います。（適当）

# おわりに
いろいろ活用方法があるかと思います。
自分はこんなふうに使っています。(@calmery氏 ありがとうございます。:thumbsup:)

https://blog.sno2wman.graphics/support
![chrome_2018-12-26_18-34-21.png](https://qiita-image-store.s3.amazonaws.com/0/107334/d0915c33-5c77-b268-079a-16cb264c7802.png)


ちなみに下記のリンクは私のPatreonです、支援してもらえると泣いて発狂します。

https://www.patreon.com/SnO2WMaN

[^1]: 普通は手動ではやらないと思うんですが、今回は自分のパトロンを取得するだけなので...