アレクサに仮想通貨の総資産を答えさせる

## どうせならAIスピーカーに現在の資産を答えさせたい
仮想通貨は値動きが激しいのでこまめに値段をチェックしたくなると思います
レートは「<a href="https://alexa.amazon.co.jp/spa/index.html#skills/dp/B0778H7F8D/?ref=skill_dsk_skb_sr_1">仮想通貨チャート</a>」というスキルですぐ確認できるのですが、
（僕が作ったスキルなのでインストールお願いします！笑）
総資産は見れません（APIキーが必要なので公開スキルでは無理そう）
仮想通貨の所持数をいちいち手動で登録して総資産を算出するものもありますが登録が面倒ですよね...
だけど、どうせAIスピーカー×仮想通貨という近未来感満載の環境があるなら総資産もスマートに聞きたい！
というわけでアレクサに取引所(今回はzaif)にある総資産を答えさせるスキルを作ってみました

## 開発環境
AWS lambda (Python3.6)
Alexa Skills kit

## ZaifAPIキーの利用
このスキルでは残高情報取得のためにウォレットのAPIキーを使用します
昨今APIの不正使用で勝手に出金されたなどのニュースがあるのでAPIキーの管理はしっかりと行いましょう
今回のスキルでは取引所の口座内の仮想通貨の量さえわかればいいので，
APIキーには残高を確認できる権限のみ付与します
特にAPIキーは暗号化せずlambdaにベタ打ちします
あとこのスキルの公開の申請は絶対にやめましょう(テストが通った時点で自分のアカウントではスキルを使うことができます)
（スキルを公開したらあなたの総資産が他の人にわかってしまいますw）

### ZaifでAPIキーを取得
<a href="https://zaif.jp/api_keys?ac=dz0p1xlz3a" rel="nofollow">Zaif開発者向けAPI</a>
まずここからAPIキーを発行します
写真のようにinfoとpersonal_infoのみチェックを付けました．
![zaif_api.png](https://qiita-image-store.s3.amazonaws.com/0/222303/821e2281-936d-1d87-2543-ab9d17efb838.png)
発行できたらkeyとsecretをコピーしておきます．

### APIキーをpythonで使う
ZaifのAPIを扱えるzaifapiというpythonパッケージがあります．今回はそれを使うこととします．
lambdaでソースコードはzipアップロードするため，そのディレクトリで以下のコマンドでパッケージをインストールします

```pip install zaifapi -t.
```

総資産を取得するのは以下のようなものを書いてみました(asset_info.py)
これ単体を実行するだけでもコマンドライン上で総資産を確認することは可能です

```python3
asset_info.py

import zaifapi
class AssetInfo(object):
    def __init__(self, key_zaif, secret_zaif):
        self.key_zaif = key_zaif
        self.secret_zaif = secret_zaif
    def get_zaif_asset(self):
        zaif_trade = zaifapi.ZaifTradeApi(key=self.key_zaif, secret=self.secret_zaif)
        zaif_public = zaifapi.ZaifPublicApi()
        deposits = zaif_trade.get_info2()["deposit"] #所有通貨とその量を取得
        asset_zaif = 0 #初期値
        for currency, amount in deposits.items():
            if currency == "jpy": #jpyのみレートはいらない
                asset_zaif += amount
            else:
                asset_zaif += amount * zaif_public.last_price(currency.lower() + "_jpy")["last_price"]
        return round(asset_zaif) #小数点以下省略
```

## Alexa Skills Kitでスキルの設定
「総資産」というスキルを作ります
スキルを呼び出すときに総資産を言ってくれればいいのでカスタムインテントは本来不要ですが，
カスタムインテントなしで先に進めなかったので形だけ作りました
(slotsは「ザイフ」のみ登録しましたが，将来的に他の取引所ごとに総資産を取得することもできます)
<a href="https://github.com/naokitbit/alexa_total_asset/tree/master/alexa_skills_kit">github</a>

## lambdaの記述
一から記述するのは面倒なので，
僕は<a href="https://gist.github.com/n8henrie/3db1205331d0f6195b01">alexa-skills-kit-color-expert-python</a>を参考にいつも書いています
lambdaのソースコードは<a href="https://github.com/naokitbit/alexa_total_asset/blob/master/lambda/lambda_function.py">github</a>に上げましたので参考まで
lambda_function.pyの初めの部分のkeyとsecretは各々のAPIキーをコピペしてください
ただしzaifのAPIのget_info2()のところでかなり時間がかかるため，lambdaの実行時間(「基本設定」の「タイムアウト」)を20秒にします
時間がかかりすぎるとタイムアウトになってしまうためです

## 実際に使ってみる
pythonコードをlambdaにアップロードできたら準備完了です
以上で設定はできました
あとはアレクサに向かって
「アレクサ、総資産を開いて」と聞くだけ！
アレクサ「現在の総資産は〜円です」
と答えてくれたらOKです
実際に使うと情報の取得に時間がかかりすぎるのでどうにかしたいですが...
ここは諦めています笑

#さいごに
zaifの総資産を教えてくれるスキルを作りました
AIスピーカーで総資産を聞けるなんてとってもスマート！(笑)
あと、くれぐれもAPIキーを公開しないよう最新の注意を払ってくださいね
今回のスキル開発は全て自己責任でお願いします
スキルに必要なソースは全て<a href="https://github.com/naokitbit/alexa_total_asset">github</a>にまとめましたのでよければそちらを参考にして下さい！

仮想通貨のレートを答えてくれるスキル(<a href="https://alexa.amazon.co.jp/spa/index.html#skills/dp/B0778H7F8D/?ref=skill_dsk_skb_sr_1">仮想通貨チャート</a>)も開発したので、ぜひインストールしてください！
今回の記事が参考になった方、投げ銭お願いします！

XEM : NB5TFT3OELRHD7VEAF3OW3CTL2IL4UI6GBDBGZLV
MONA : MCxcdUeTiFkpZr6BqrYtZqAGEB5AAPPihC
Counterpartyトークン : 1FsKWsuarQa57HXYvrSQegKNk21K46B8hX