前回の記事はこちら
この記事はWindows10でAnaconda3を使ってプログラミングをする人向けに書いてあります 前回でコードを記述する準備ができたので、今回はbitcoinの価格を分析します。 前回の記事はこちらから [sitecar[…]
pythonでbitbankの仮想通貨botを作成第3弾です
前回の記事でビットコインのチャートのテクニカル分析を行ったので、注文情報と分析結果をLINEで送信できるようにしたいと思います。
参考 ⇒ https://developers.line.biz/ja/docs/messaging-api/overview/
LINE Developerの準備
自分が使っているLINEのアカウントがあればすぐに(10分くらいで)LINE Developerでアカウントをつくって準備ができます
https://developers.line.biz/ja/ ⇐ LINE Developer
- アカウントを作成(自分のLINEアカウントでログインすればよい)
- Providerを新規作成
- 作成したProviderでChannelを作成( Messaging APIを選択)
- message APIタブからChannel access tokenのissueを選択してChannel access token (long-lived) を発行しておく(チャンネルアクセストークンといって後で使います)
- 作成したチャンネルをQRコードなどからline友達追加
line-bot-sdkライブラリのインストール
今までと同じで、仮想環境のターミナルを開いて以下のコマンドを入力
pip install line-bot-sdk
メッセージを送信
Pythonのコード
from linebot import LineBotApi
from linebot.models import TextSendMessage
access_token = ""#作成したbotのアクセストークン
line_api = LineBotApi(access_token)
line_bot_api.broadcast(TextSendMessage(text = 'テストメッセージ'))
結果
ちゃんとメッセージが送られてきました。めちゃくちゃ簡単ですね
画像を送信
注意:httpsで指定したjpg形式の画像のみ送信可能
私のワードプレスにアップロードしている画像で検証してみます
Pythonのコード
from linebot import LineBotApi
from linebot.models import ImageSendMessage
image_message = ImageSendMessage(
original_content_url = 'https://meriek.com/wp-content/uploads/2019/11/bitcoin.jpeg',
preview_image_url = 'https://meriek.com/wp-content/uploads/2019/11/bitcoin.jpeg'
)
line_api.broadcast(image_message)
結果
画像も送ることができました
仮想通貨の分析結果を画像として送信する
私がブログ運営のために借りているサーバーに画像をアップロードして、LineBotApiで送信できるようにします。
matplotlibはpngでしか出力できず、lineapiはjpgでしか送信できないので、手順は少し面倒です
- matplotlibライブラリでグラフのpng画像を出力
- PIL(pillow)ライブラリでpng画像をjpg画像に変換
- ftplibライブラリでjpg画像をサーバーにアップロード
- LineBotApiで画像を送信
PILライブラリをインストール
Anaconda Navigatorなどから今までと同じようにpillowパッケージ(PILという名前では見つからないです)をインストールします
matplotlibを画像で出力
matplotlib.pythonをインポートする前にmatplotlib.use(‘Agg’)と入力するとmatplotlibを画像として出力できます。
なのでplt.show()の代わりにplt.savefig(‘ファイル名’)にして画像として保存します
import matplotlib
matplotlib.use('Agg') #出力を画像として保存
import matplotlib.pyplot as plt
"""省略"""
#plt.show()
plt.savefig('output2.png')
コード(全部)
import python_bitbankcc as bb
import matplotlib
matplotlib.use('Agg') #出力を画像として保存
import matplotlib.pyplot as plt
import talib
import numpy as np
from datetime import datetime
import requests
import time
from linebot import LineBotApi
from linebot.models import TextSendMessage, ImageSendMessage
from ftplib import FTP
from PIL import Image
### bitbanc APIのパブリックapiのインスタンスを作成
pub = bb.public()
today = datetime.today()
time8 = str(today.year).zfill(4) + str(today.month).zfill(2) + str(today.day).zfill(2)
### 1分足で現在時刻のローソク足を取得
value = pub.get_candlestick('btc_jpy','1min',time8)
ohlcv = value["candlestick"][0]["ohlcv"]
close_prices = [float(i[3]) for i in ohlcv]
ohlcv_time = [tmp[5] for tmp in ohlcv]
times = [datetime.fromtimestamp(i/1000) for i in ohlcv_time]
### テクニカル分析
np_close = np.array(close_prices,dtype='f8')
SMA10 = talib.SMA(np_close, timeperiod = 10)
SMA20 = talib.SMA(np_close, timeperiod = 20)
RSI20 = talib.RSI(np_close, timeperiod = 20)
RSI50 = talib.RSI(np_close, timeperiod = 50)
upper, middle, lower = talib.BBANDS(np_close, matype=talib.MA_Type.SMA)
plt.figure(figsize=(25,50))
plt.subplot(4,1,1)
plt.plot(times,close_prices,label='price')
plt.legend()
plt.subplot(4,1,2)
plt.plot(times,SMA10,label='SMA10')
plt.plot(times,SMA20,label='SMA20')
plt.legend()
plt.subplot(4,1,3)
plt.plot(times,close_prices,label='price')
plt.plot(times,upper)
plt.plot(times,middle)
plt.plot(times,lower)
plt.legend()
plt.subplot(4,1,4)
plt.plot(times,RSI20,label='RSI20')
plt.plot(times,RSI50,label='RSI50')
plt.legend()
#plt.show()
plt.savefig('output2.png')#ローカルに保存
## LineBotApiを使って結果を送信
acces_token = ""#作成したbotのアクセストークン
line_api = LineBotApi(access_token)
ftp = FTP(
"",#FTPサーバーのホスト名
"",#ユーザー名
passwd=""#パスワード
)
#pngをjpgに変換
img = Image.open('output2.png')
rgb_img = img.convert('RGB')
rgb_img.save('output2.jpg')
#ftpでサーバーにアップロード
with open("output2.jpg", "rb") as f:
ftp.storbinary("STOR /output2.jpg", f)
#lineapiでテキストと画像を送信
line_api.broadcast(TextSendMessage(text=time8+"日"+str(times[-1].hour).zfill(2)+"時"+str(times[-1].minute).zfill(2)+"分"))
image_message = ImageSendMessage(
original_content_url = '',#サーバーの画像のパス
preview_image_url = '' #サーバーの画像のパス
)
line_api.broadcast(image_message)
結果
グラフが画像として送信できました