外出時や仕事中でもBOTの稼働状況を監視して把握する方法の2つ目です。
前回の記事ではコマンドラインへの出力結果と同じ内容をメールで送信する方法を解説しました。
今回はもう1つの定番のLINE通知の方法について解説します! やる前は難しそうに感じるかもしれませんが、15分もかからないほど簡単なので安心してください。
BOTの状況をLINEに通知する方法
今回の記事では、PythonでLINEに通知する関数を作ります。
そしてprint文と同じように要所要所に1行入れるだけで、そのテキスト内容をLINEに飛ばす方法を解説します。
手順
(1)LINE公式ページで開発者向けのアクセストークンを発行する
(2)Pythonで自由なメッセージをLINEに飛ばす関数を作る
(3)エントリーや決済・損切りなどの箇所に1行追加して通知する
では、やっていきましょう!
1.LINE公式でアクセストークンを取得する
(1)まず最初に以下の「LINE Notify」のページにアクセスします。
(https://notify-bot.line.me/ja/)
右上の「ログイン」をクリックして、ご利用のLINEアカウントでログインしてください。
登録したメールアドレスを忘れた方は、LINEのスマホ端末側で、「設定 -> アカウント -> メールアドレス」で確認できます。
ログインが完了したら、右上のメニューから「マイページ」を選択してください。
マイページをクリックして画面をスクロールすると、下の方に「アクセストークンの発行(開発者向け)」という箇所があるので、そこで「トークンを発行する」をクリックしてください。
▽ アクセストークンの発行(開発者向け)
すると、以下のようなトークン発行画面になります。
▽ トークン発行画面
設定する箇所は、「トークン名」と「トークルーム」の2つです。
トークン名は何でも構いませんが、この名前で通知が来るので、通知が来たときにわかる名前を付けておきましょう。ここでは「自動売買BOT(チャネルブレイクアウト)」としています。トークルームの方は、「1:1でLINE Notifyから通知を受け取る」を選択します。
できたら「発行する」をクリックします。
すると以下のようにトークンが表示されます。
▽ 発行されたトークン番号
このトークン画面は再表示できないので、コピーをしてメモ帳などに保存しておきましょう。
ただしもし間違えて閉じてしまっても、もう1度、新しいトークンを作ればいいだけなので大した問題ではありません。
2.LINE通知する関数を作る
次はBOTのPythonコードの方です。
以下のようなLINE通知をする関数を作ります。
import requests # 設定項目 line_token = "************" # さっき保存したLINEトークン # LINEに通知する関数 def line_notify( text ): url = "https://notify-api.line.me/api/notify" data = {"message" : text} headers = {"Authorization": "Bearer " + line_token} requests.post(url, data=data, headers=headers)
はい、LINE通知する関数はこれで完成です!
これでLINEに通知を送りたい箇所に、 line_notify(“テキスト”) のかたちでコードを1行追加すれば、LINE通知を実装することができます。
LINE通知の実装例
例えば、前回の第4回「BOT作成編」の章で作成したBOTでは、エントリーするたびに以下のような出力をしていましたよね。
# 売買の決済をする箇所 if data["close_price"] < last_data["close_price"]: print("前回の終値を下回ったので" + str(data["close_price"]) + "あたりで成行で決済します")
ここに以下のように行を追加すれば、LINEにも同じ通知を送ることができます。
# 売買の決済をする箇所 if data["close_price"] < last_data["close_price"]: print("前回の終値を下回ったので" + str(data["close_price"]) + "あたりで成行で決済します") line_notify("前回の終値を下回ったので" + str(data["close_price"]) + "あたりで成行で決済します")
同じことを2回書かないといけませんが、エントリー・決済・損切りなどの重要な箇所だけLINEに通知させたいのであれば、この方法が一番いいと思います。
3.出力を全て1行にまとめたい場合
逆にすべての print文の出力結果をLINEにも通知したい場合は、全部の箇所で同じことを2回書くよりも、1つの関数にまとめてしまった方が管理が楽です。
例えば、前回の記事の内容とあわせて、コマンドラインへの標準出力・ログファイルへの書き出し・LINEへの通知をすべて1つの関数にまとめておけば、コードはもっとすっきりします。
import requests from logging import getLogger,Formatter,StreamHandler,FileHandler,INFO # ログの設定 logger = getLogger(__name__) handlerSh = StreamHandler() handlerFile = FileHandler("c:/Pydoc/helloBot.log") handlerSh.setLevel(INFO) handlerFile.setLevel(INFO) logger.setLevel(INFO) logger.addHandler(handlerSh) logger.addHandler(handlerFile) # LINEの設定 line_token = "************" # print文のかわりに使用 def print_log( text ): # コマンドラインへの出力とファイル保存 logger.info( text ) # LINEへの通知 url = "https://notify-api.line.me/api/notify" data = {"message" : text} headers = {"Authorization": "Bearer " + line_token} requests.post(url, data=data, headers=headers)
これで、全てのprint("")文の箇所を上記の print_log("") に置き換えれば、同じことを2回書かなくても済みます。
例えば、以下の1行だけで、コマンドラインへの出力・ファイルへのログ保存・LINEへの通知がすべて実行できます。
print_log("前回の終値を下回ったので" + str(data["close_price"]) + "あたりで成行で決済します")
ただし全ての出力内容をいちいちLINEに通知させるのは、少し鬱陶しいかもしれませんね。