今回は、仮想通貨の価格が一定以上(or 以下)になったらメールを送信してくれるプログラムをPythonで実装していきます。
smtplib(メール送信処理のPython標準ライブラリ)を利用すればメール送信の処理部分はほとんど実装することなく、超手軽にメール送信処理を実装することができます。
↑の記事のように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
無事、送信先に指定したメールアドレスに価格アラートが飛んできました!
あとは、HerokuのSchedulerなどを活用して10分に1回ファイルを呼び出すように設定しておけば価格アラートを自動でメール通知することができます。
僕はHerokuで定期的に処理を呼び出して、売買の基準になるような値動きがあれば検知できるようにしています。なんども値動きを見るのって結構めんどくさいので自動で検知できるようにしておくのオススメです。
では!