[Symbol] Pythonでハーベスト履歴を取得

# 概要
- デスクトップウォレットに表示されるような内容をプログラム（Python）から取得する方法を残しています。
- 全コードは[Githubにて公開中](https://github.com/ancte0721/symbol-python-training)
    - バグや次回の要望あればコメントください
- 投げXYMは「**NDLS6GYOIPHATATNAVVOUNJXBD6X4BXU6IRBHIY**」まで
- あなたの委任お待ちしております。
    - **symbol-node.takagi-tech.com**
    - ハーベスト報酬は技術検証や記事執筆、ノード維持費に使わせていただきます。

## 前回記事
https://qiita.com/nobu_kyutech/items/690ac286f27a3a84e57f

# 事前準備
公式ドキュメントはこちら。v1.0.0で動作確認しています。

https://docs.symbolplatform.com/symbol-openapi/v1.0.0/

## ハーベスト履歴の取得

https://docs.symbolplatform.com/symbol-openapi/v1.0.0/#operation/searchReceipts
こちらを叩きます。

確認したいウォレットのアドレスとノードURL、定数としてHarvest_FeeのEnum値を設定します。
他の定数は[こちら](https://docs.symbolplatform.com/symbol-bootstrap/enums/_node_modules_symbol_openapi_typescript_fetch_client_src_models_receipttypeenum_.receipttypeenum.html)

```python
import urllib.request
import json

# メインネットで安定しているノードURL
NODEURL = "http://00fabf14.xym.stir-hosyu.com:3000"
# 確認対象ウォレットアドレス
ADDRESS = "NBMWZZZOCUKZXXHKB7R3P3G2ZCO4CSGIXC37USI"
# Harvest_FeeのEnum値
ENUM_Harvest_Fee = 8515
```

APIの返却値のウォレットアドレスには48桁のものが使用されるので、自分のアドレスの48桁版を[前回の記事](https://qiita.com/nobu_kyutech/items/9c40a267dcf1f2042faf)を参考に取得します。

```python
# 48桁のアドレスを取得
req = urllib.request.Request(NODEURL + '/accounts/' + ADDRESS)
with urllib.request.urlopen(req) as res:
    accountInfo = json.load(res)
ADDRESS48 = accountInfo['account']['address']
```

自分のウォレットアドレスの場合
`ADDRESS = "NBMWZZZOCUKZXXHKB7R3P3G2ZCO4CSGIXC37USI"`
`ADDRESS48 = "68596CE72E15159BDCEA0FE3B7ECDAC89DC148C8B8B7FA49"`
となりました。
わざわざAPIを叩かなくともADRESSか公開鍵から求められる（python SDKでできる？）気がしているので、
ご存じの方はそっとコメントで教えてくださいmm

次にトランザクション履歴を問い合わせます。

```python
url = NODEURL + '/statements/transaction'
params = {
    'targetAddress': ADDRESS,
    'order': 'desc',
}

req = urllib.request.Request('{}?{}'.format(url, urllib.parse.urlencode(params)))
with urllib.request.urlopen(req) as res:
    data = json.load(res)
    print(json.dumps(data, indent=2))
```

結果

```
{
  "data": [
    {
      "statement": {
        "height": "193175",
        "source": {
          "primaryId": 0,
          "secondaryId": 0
        },
        "receipts": [
          {
            "version": 1,
            "type": 8515,
            "targetAddress": "68596CE72E15159BDCEA0FE3B7ECDAC89DC148C8B8B7FA49",
            "mosaicId": "6BED913FA20223F8",
            "amount": "129334920"
          },
          {
            "version": 1,
            "type": 8515,
            "targetAddress": "68693706B3EA603157D423C4F29ED6701CF70960E831D2AD",
            "mosaicId": "6BED913FA20223F8",
            "amount": "9238208"
          },
          {
            "version": 1,
            "type": 8515,
            "targetAddress": "685F060B8CD3197D5DC270B61167EDD81749C4CBC3DF0EFA",
            "mosaicId": "6BED913FA20223F8",
            "amount": "46191042"
          },
          {
            "version": 1,
            "type": 20803,
            "mosaicId": "6BED913FA20223F8",
            "amount": "183764522"
          }
        ]
      },
      "id": "60A9BCD3067648686E551012"
    },
    ..........
    ..........
  ],
  "pagination": {
    "pageNumber": 1,
    "pageSize": 20
  }
}
```

`type` と `targetAddress` が一致しているものを探します。

```python
for d in data['data']:
    height = d['statement']['height']
    for receipt in d['statement']['receipts']:
        if receipt['type'] == ENUM_Harvest_Fee and receipt['targetAddress'] == ADDRESS48:
            amount = int(receipt['amount'])/1000000
            print("height:{}, amount:{}".format(height, amount))
```

直近のハーベスト履歴が表示できました。

```
height:193175, amount:129.33492
height:178610, amount:128.647486
height:168289, amount:134.39793
height:148821, amount:134.52498
height:6433, amount:143.702062
```

全コードは[こちら](https://github.com/ancte0721/symbol-python-training/blob/master/03_getHarvestHistory.ipynb)