酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Python3でXPコインの現在価格を取得するSlackbotを作る

本記事では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です。')

実行結果

f:id:ch3cooh393:20171226173952p:plain

XPコインっていつのまにか0.03円まで上がっていましたね。

まとめ

「JSONデータを取得する」「JSONをパースして特定のkeyの値を取得する」ことができるようになりました。ほとんどコピペの塊のようなものですが、この調子でPythonの書き方を学んでいければと考えています。

次回は認証情報ありのPOSTを使ったコマンドを作ってみたいと思います。

XPのアドレスは XZohDtwmZELtpurnmJjLJ4pAEq8C4Zc7Tb です!よろしくお願いします! ←

関連記事