[Symbol] PythonでCatapult REST Endpointsから送受信履歴の取得

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

## 前回記事
https://qiita.com/nobu_kyutech/items/9c40a267dcf1f2042faf

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

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

## トランザクション情報の取得

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

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

```python
import urllib.request
import json

# メインネットで安定しているノードURL
NODEURL = "http://00fabf14.xym.stir-hosyu.com:3000"
# 確認対象ウォレットアドレス
ADDRESS = "NDLS6GYOIPHATATNAVVOUNJXBD6X4BXU6IRBHIY"
# TransferTransactionのEnum値（0x4154 [16724 decimal] -> TransferTransaction.）
ENUM_TransferTransaction = 16724
```

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 = "NDLS6GYOIPHATATNAVVOUNJXBD6X4BXU6IRBHIY"`
`ADDRESS48 = "68D72F1B0E43CE09826D056AEA353708FD7E06F4F22213A3"`
となりました。
わざわざAPIを叩かなくともADRESSか公開鍵から求められる（python SDKでできる？）気がしているので、
ご存じの方はそっとコメントで教えてくださいmm

本題のトランザクション履歴を問い合わせます。

```python
url = NODEURL + '/transactions/confirmed'
params = {
    'address': 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": [
    {
      "meta": {
        "height": "188954",
        "hash": "853743C7C1014E63261576DA81CFB82CAD15EC823F9B964E7EC1622F5706107C",
        "merkleComponentHash": "853743C7C1014E63261576DA81CFB82CAD15EC823F9B964E7EC1622F5706107C",
        "index": 0
      },
      "transaction": {
        "size": 176,
        "signature": "B1C9FB561C78AE4A93A7B42455D6AAFDA9914FB171B88FA129D13DDF8B134A61AA9C0E6A6D1C66DF479E5DB8837478CFE0F18BC1DE0D71B1A50A33BC1EDF4F0B",
        "signerPublicKey": "5DB471481B3A39AC5CEEE949B64A577C0D5CA67176BE4462145CAD6ABD84CEBC",
        "version": 1,
        "network": 104,
        "type": 16724,
        "maxFee": "50000",
        "deadline": "5764020638",
        "recipientAddress": "68596CE72E15159BDCEA0FE3B7ECDAC89DC148C8B8B7FA49",
        "mosaics": [
          {
            "id": "6BED913FA20223F8",
            "amount": "15400000000"
          }
        ]
      },
      "id": "60A7CE33067648686E54B9B1"
    },
    .........
    .........
  "pagination": {
    "pageNumber": 1,
    "pageSize": 20
  }
}
```

`recipientAddress` が先ほど求めた自分のアドレスと一致していれば受信、そうでなければ送信と判断できます。

```python
for d in data['data']:
    mosaic = None
    # モザイクの送受信があるか
    if "mosaics" in d['transaction']:
        for xym in d['transaction']['mosaics']:
            # モザイクがXYM(ID=6BED913FA20223F8)であるか
            if xym['id'] == '6BED913FA20223F8':
                mosaic = xym['amount']
            else:
                continue
            # 受け取り人が自分であるか
            if d['transaction']['recipientAddress'] == ADDRESS48:
                isRecipient = True
            else:
                isRecipient = False
            print("height:{}, {}, {}xym".format(d['meta']['height'], '受信' if isRecipient else "送信", int(mosaic)/1000000))
```

直近の送受信履歴が表示できました。

```
height:188954, 送信, 15400.0xym
height:188326, 送信, 10.0xym
height:188317, 送信, 10.0xym
height:188296, 受信, 15000.0xym
height:155725, 受信, 500.0xym
height:143157, 送信, 29420.61xym
height:143146, 送信, 56.0xym
```

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