本記事では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 です!よろしくお願いします! ←