コアダンプの数だけ強くなれるよ

見習いエンジニアの備忘log

coincheckでビットコインを自動で定期購入してみる

今回はcoincheckのAPIを使ってビットコインを購入するスクリプト(python)を作ってみます。 cronと組み合わせれば定期購入もできそうです。実行環境はLinux(CentOS 7)です。

取引用のAPIキーを作成

APIを利用して取引を操作するにはAPIキーを作成する必要があるため先にやっておきます。coincheckにログイン後、設定からAPIキーを選択して下方の「新たにAPIキーを追加する」を選択しAPIキーを作成します。

f:id:segmentation-fault:20170922155233p:plain

許可する操作を選択できますので、必要なものにチェックを入れましょう。

f:id:segmentation-fault:20170922154946p:plain

ソースコード

取引用のAPIキーが用意できたので、下記のドキュメントを参考にスクリプトを作成していきます。 10000円分のビットコインを成り行きで購入するスクリプトです。

coincheck.com

# -*- coding: utf-8 -*-
import sys
import json
import requests
import time
import hmac
import hashlib

class ccapi:
    def __init__(self, key, key_secret, endpoint):
        self.key = key
        self.key_secret = key_secret
        self.endpoint = endpoint

    def get(self, path):
        nonce = str(int(time.time()))
        text = nonce + self.endpoint + path

        signature = hmac.new(
                bytes(self.key_secret.encode('ascii')),
                bytes(text.encode('ascii')),
                hashlib.sha256).hexdigest()

        return requests.get(
                self.endpoint + path ,
                headers = self.__get_header(self.key, nonce, signature))

    def post(self, path, payload):
        payload = json.dumps(payload)
        nonce = str(int(time.time()))
        text = nonce + self.endpoint + path + payload

        signature = hmac.new(
                bytes(self.key_secret.encode('ascii')),
                bytes(text.encode('ascii')),
                hashlib.sha256).hexdigest()

        return requests.post(
                self.endpoint+path,
                data = payload,
                headers = self.__get_header(self.key, nonce, signature))

    def delete(self,path):
        nonce = str(int(time.time()))
        text = nonce + self.endpoint + path

        signature = hmac.new(
                bytes(self.key_secret.encode('ascii')),
                bytes(text.encode('ascii')),
                hashlib.sha256).hexdigest()

        return requests.delete(
                self.endpoint+path,
                headers = self.__get_header(self.key, nonce, signature))

    def __get_header(self, key, nonce, signature):
        headers = {
            'ACCESS-KEY': key,
            'ACCESS-NONCE': nonce,
            'ACCESS-SIGNATURE': signature,
            'Content-Type': 'application/json'
        }

        return headers

if __name__ == '__main__':

    argv = sys.argv
    argc = len(argv)

    if (argc != 3):
        print('usage: python %s <key> <secret key>' % argv[0])
        quit()

    key = argv[1]
    key_secret = argv[2]
    endpoint = 'https://coincheck.com'

    cc = ccapi(key,key_secret,endpoint)

    # 販売レートの確認(特に意味は無い)
    salerate = '/api/rate/btc_jpy'
    rate = cc.get(salerate).json()
    print('BTC-JPY : \%s' % rate['rate'])

    # \10000分の成り行き買い注文
    order = '/api/exchange/orders'
    payload = {
       "pair": "btc_jpy",
       "order_type": "market_buy",
       "market_buy_amount": 10000,
    }
    result = cc.post(order, payload).json()
    print(result)

    # 注文キャンセル
    #order = '/api/exchange/orders/[id]'
    #result = cc.delete(order)
    #print(result)


実行結果

恐る恐る実行してみるとリクエストは成功した模様。早速、coincheckにログインして結果を確認します。

$ python3 ccauto.py 'アクセスキー' 'シークレットアクセスキー'
BTC-JPY : \414875.0
{'stop_loss_rate': None, 'id': xxxxxxxx, 'rate': None, 'amount': None, 'pair': 'btc_jpy', 'order_type': 'market_buy', 'market_buy_amount': '10000.0', 'success': True, 'created_at': '2017-09-22T05:53:30.127Z'}


スマホアプリで取引履歴と残高を確認。

f:id:segmentation-fault:20170922160459j:plain

f:id:segmentation-fault:20170922160509j:plain


キッチリ10000円分の購入が出来ていました。(一安心)

cronと組み合わせて定期購入

ビットコインが欲しいけど価格変動のリスクは抑えたい... そんな時に頼りになるのがドル・コスト平均での定期購入(積立)ですね。

cronと組み合わせれば簡単に実現できます。

まぁ自分で作らずとも他社の取引所には仮想通貨の積立サービスはあったりしますが趣味の世界なのでDon't care。

zaif.jp

まとめ

実際にやってみると、驚くほど簡単にビットコインの購入が出来ることが分かります。(もちろん売却も) 入力する桁を間違えたりすると大変なことになってしまうのでチェック機能はキチンと作りたいですね。