【Python入門】LineAPIを使って公式アカウントから画像と文章を送信する

前回の記事はこちら

関連記事

この記事は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 = 'テストメッセージ'))

結果

Line結果1

ちゃんとメッセージが送られてきました。めちゃくちゃ簡単ですね

 

画像を送信

注意: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)

 

結果

linebotoutput2

画像も送ることができました

仮想通貨の分析結果を画像として送信する

私がブログ運営のために借りているサーバーに画像をアップロードして、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)

 

結果

bitbankoutput3

グラフが画像として送信できました