本記事ではPython3でXPコインの現在価格を取得するSlackbotを作る方法を紹介します。
これまで社内連絡用にGitterを使っていましたが、Slackに移行するので諸々の処理にbotを使いたいと考えています。ただPython自体がいまいちわかっておらず、少しずつコードを書きながら勉強している段階です。
タイトルでは「XPコイン(eXperience Points)の現在価格を取得する」としていますが、実際にやっていることは「認証なしのJSONを提供するWebAPIを叩いて特定のkeyの値を取得する」です。
JSONデータを取得して特定のkeyの値を取得してSlackで表示する
環境について
前回、準備編ということで特定のキーワードを言うとそれに応じた返信するbotを作成しました。本記事は、以下の記事を読んでいる、プロジェクトを構築していることを前提としています。
実行環境はmacOS High Sierraを想定しています。
XPコインの現在値を取得する方法
CoinMarketCapというサイトでAPIを提供しており、仮想通貨to仮想通貨、仮想通貨to法定通貨などの変換をすることができるAPIを提供しています。
XPコインから日本円に変換する場合、https://api.coinmarketcap.com/v1/ticker/xp/?convert=JPY
を叩くことで以下のようなJSONが返ってきます。特に認証情報は必要ありません。
[ { "id": "xp", "name": "Experience Points", "symbol": "XP", "rank": "205", "price_usd": "0.000234525", "price_btc": "0.00000002", "24h_volume_usd": "595601.0", "market_cap_usd": "46053894.0", "available_supply": "196370937247", "total_supply": "240412963214", "max_supply": null, "percent_change_1h": "-9.17", "percent_change_24h": "-12.56", "percent_change_7d": "24.71", "last_updated": "1514276947", "price_jpy": "0.0265714534", "24h_volume_jpy": "67481011.511", "market_cap_jpy": "5217861211.0" } ]
パラメータを変更することでXPコイン以外の通過の情報を得ることができますので、色々と試してみてください。
JSONデータを取得してSlackで表示する
plugins以下にxpcoin.py
を作成します
$ touch plugins/xpcoin.py
xpcoin.py
botに対して「xpいくら」とリプライを送るパターンと、チャンネル内で「,xpいくら」と投稿するパターンの両方に対応したコマンドを実装しました。
import urllib import json import sys import codecs from slackbot.bot import listen_to from slackbot.bot import respond_to sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout, errors='ignore') def dataGet(): url = 'https://api.coinmarketcap.com/v1/ticker/xp/?' param = { 'convert': 'JPY' } paramStr = urllib.parse.urlencode(param) readObj = urllib.request.urlopen(url + paramStr) response = readObj.read() return response def jsonConversion(jsonStr): data = json.loads(jsonStr) return data @respond_to('xpいくら') def xp2jpy_func(message): resStr = dataGet() res = jsonConversion(resStr) message.reply(res[0]['price_jpy'] + '円/XPです。') @listen_to(',xpいくら') def xp2jpy_listen_func(message): resStr = dataGet() res = jsonConversion(resStr) message.reply(res[0]['price_jpy'] + '円/XPです。')
実行結果
XPコインっていつのまにか0.03円まで上がっていましたね。
まとめ
「JSONデータを取得する」「JSONをパースして特定のkeyの値を取得する」ことができるようになりました。ほとんどコピペの塊のようなものですが、この調子でPythonの書き方を学んでいければと考えています。
次回は認証情報ありのPOSTを使ったコマンドを作ってみたいと思います。
XPのアドレスは XZohDtwmZELtpurnmJjLJ4pAEq8C4Zc7Tb です!よろしくお願いします! ←