仮想サーファーの波乗り

仮想化エンジニアの日常

プログラミング・SNS分析・仮想通貨・自動化などに関してよく書く雑記ブログ

Pythonで仮想通貨価格のアラートメールを送信する


f:id:virtual-surfer:20180613235336p:plain

今回は、仮想通貨の価格が一定以上(or 以下)になったらメールを送信してくれるプログラムをPythonで実装していきます。

smtplib(メール送信処理のPython標準ライブラリ)を利用すればメール送信の処理部分はほとんど実装することなく、超手軽にメール送信処理を実装することができます。


www.virtual-surfer.com

↑の記事のようにPythonの環境構築は済んでいることを前提とします。


まずは、CoinGeckoAPIから現在価格と24時間の価格変化率データを取得してきて、指定した価格と変化率以上であればメール送信を行うメソッドを実装したファイル「mail_service.py」を用意します。

mail_service.py

# coding=utf-8
import requests
import json
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
import os

COINS_API_URL = 'https://api.coingecko.com/api/v3/coins/'
BINANCE_URL = 'https://www.binance.com/'
COIN_GECKO_URL = 'https://www.coingecko.com/en/coins/'
FROM_ADDRESS = os.environ['FROM_ADDRESS']
FROM_PASSWORD = os.environ['FROM_PASSWORD']
TO_ADDRESS = os.environ['TO_ADDRESS']


def check_send_alert(id, target_price, target_change, is_high):
    apiPath = COINS_API_URL + id
    payload = {'Content-Type': 'application/json'}
    json = requests.get(apiPath, params=payload).json()
    price = json['market_data']['current_price']['jpy']
    price_change = json['market_data']['price_change_percentage_24h']
    if is_high:
        is_alert = check_price_alert(target_price, price, target_change, float(price_change), True)
    else:
        is_alert = check_price_alert(target_price, price, target_change, float(price_change), False)
    if is_alert:
        send_price_alert(id, str(price), price_change)


def send_price_alert(id, price, price_change):
    subject = '【価格アラート】{} ¥{}({}%)'.format(id, price, price_change)
    body = '{}の価格が¥{}(変動率:{}%)になったよ。\n\nBinanceでチェック {}\n\nCoinGeckoでチェック {}'\
        .format(id, price, price_change, BINANCE_URL, COIN_GECKO_URL + id)
    message = create_default_message(subject, body)
    send_default_mail(message)


def check_price_alert(target_price, price, target_change, change, is_high):
    """
    指定した価格以上or以下、かつ変化率が指定したもの以上になった場合にはTrueを返す。
    :param target_price: 指定価格
    :param price: 現状価格
    :param target_change: 指定変化率
    :param change: 現状変化率
    :param is_high: 以上かどうか(True=以上, False=以下)
    :return: True = 価格アラート, False = 価格アラートなし
    """
    if change < 0:
        target_change = target_change * -1
    if target_change > change:
        if is_high:
            if target_price > price:
                return True
            else:
                return False
        else:
            if target_price < price:
                return True
            else:
                return False
    else:
        return False


def create_default_message(subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = FROM_ADDRESS
    msg['To'] = TO_ADDRESS
    msg['Date'] = formatdate()
    return msg


def send_default_mail(msg):
    smtp_obj = smtplib.SMTP('smtp.gmail.com', 587)
    smtp_obj.ehlo()
    smtp_obj.starttls()
    smtp_obj.ehlo()
    smtp_obj.login(FROM_ADDRESS, FROM_PASSWORD)
    smtp_obj.sendmail(FROM_ADDRESS, TO_ADDRESS, msg.as_string())
    smtp_obj.close()


Gmailのメールアドレスやパスワードは間違ってもGitにあげてしまわないように.envファイルに定義して環境変数から取得するようにします。

.env

# 送信元メールアドレス
FROM_ADDRESS=xxxxx@gmail.com
# 送信元メールアカウントのパスワード
FROM_PASSWORD=xxxxx
# 送信先メールアドレス
TO_ADDRESS=yyyyy@gmail.com


以下のようなmail_serviceの処理を呼び出すファイルを用意し、そのファイルを定期的に呼び出すことで、アラートメールを自動で送信できます。

batch.py

# coding=utf-8
import mail_service


BTC_ID = 'bitcoin'
# 100万円以上になったら通知用
BTC_TARGE_PRICE_HIGH = 1000000
# 70万円以下になったら通知用
BTC_TARGE_PRICE_LOW = 700000
# 4%以上の変動率になったら通知用
BTC_TARGE_CHANGE = 4


# 価格アラート(1時間に1回呼び出される想定)
mail_service.check_send_alert(BTC_ID, BTC_TARGE_PRICE_HIGH, BTC_TARGE_CHANGE, is_high=True)
mail_service.check_send_alert(BTC_ID, BTC_TARGE_PRICE_LOW, BTC_TARGE_CHANGE, is_high=False)


これでファイルの用意はOK。


環境変数からデータ取得するためにforegoを利用するので、インストールしたことがなければインストールしておきます。

$ brew install forego


メール送信の準備ができたので、以下のコマンドでbatch.pyを実行してみると...

$ forego run python batch.py


f:id:virtual-surfer:20180613234725p:plain

無事、送信先に指定したメールアドレスに価格アラートが飛んできました!


あとは、HerokuのSchedulerなどを活用して10分に1回ファイルを呼び出すように設定しておけば価格アラートを自動でメール通知することができます。

僕はHerokuで定期的に処理を呼び出して、売買の基準になるような値動きがあれば検知できるようにしています。なんども値動きを見るのって結構めんどくさいので自動で検知できるようにしておくのオススメです。


では!