##はじめに
プログラミングがまったく初心者の記録的投稿
またこの記事がほかの初心者の方のお役に立てれば幸いです
今回はコチラで紹介したBOTの開発工程を記していきたいと思います
###実現したいこと
今回作成するのは、"bitflyer", **"zaif"**など仮想通貨取引所の名前を送ると、
そこで取引されているビットコインの現在取引額をかえしてくるLINE BOT です
###前提・事前準備
- macOS 10.13.4
- Python 3.6.5
- Herokuアカウント作成
##LINE developers の設定
まずLINE側の設定から
LINE developersにアクセスをし、自身のLINEアカウント(このご時世もってない人はいないはず...)でログイン、開発者登録などをもとめられるので必要事項を入力していきます
次に新規プロバイダーを作成し、つづいてMessaging API
というところから今回の仮想通貨BOTのchannel作成をします
こちらの方もアプリ名
, 業種
, メールアドレス
などの項目を入力、
プラン
のところは「Developer Trial」に設定しておきましょう
ここでまだ「設定が完了していません」とでているはずなのでそこからChannel基本設定へと入ります
Webhook送信
の項目を「利用しない」から「利用する」に変更。この設定をしないとメッセージを送信してもなにもBOTは反応しないので忘れずに
またのちに使うChannel Secret
とアクセストークン
の文字列を控えておきましょう
アクセストークン
は再発行ボタンを押すとその度に新しいトークンを発行してくれます
あとは適当に設定したらOK
これでひとまずLINEの設定は完了!
##BOT開発
お次はいよいよBOT本体の開発です
このBOTはLINEの公式が推奨しているサンプルボットのSDK(ソフトウェア開発キット)に
少し手を加えてつくりました
###BOTプログラム作成
まずline-bot-sdk
と、そのなかで使われているWebアプリケーションフレームワークが[Flask]
(http://flask.pocoo.org/)なので、この2つのパッケージをインストールしていきます
任意の仮想環境内で、
$ pip install flask
$ pip install line-bot-sdk
とコンソールに打ち込みインストールしましょう(仮想環境作成については前回を参照!)
仮想通貨BOTを格納するディレクトリを新しく作成し、
さらにそのディレクトリ内にmain.py
というファイルをつくります
そしてline-bot-sdkのこのコードをコピー&ペースト
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
# 追加
import os
app = Flask(__name__)
#以下2行追加
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)
@app.route("/callback", methods=['POST'])
def callback():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text))
if __name__ == "__main__":
# app.run() 削除
# 以下2行追加
port = int(os.getenv("PORT", 5000))
app.run(host="0.0.0.0", port=port)
(ちょっぴり追記、削除箇所しています)
しかしこのコードでは送信したメッセージがそっくりそのままかえってくる「オウム返し」のBOTになるので、ビットコインの価格を返信する部分をつくっていきます
それにはまず仮想通貨取引所のAPIを取得しなければいけません
各取引所のAPIを用いてビットコインの現在取引価格等の情報を取得していきますが、
既存のライブラリでそれをカンタンに行うことができるので、今回はそちらを利用したいと思います
APIパッケージのpybitflyerとzaifapiをそれぞれインストールしてみましょう 1
インストールが完了したらさっそくmain.py
ファイルにインポートしていきます
import pybitflyer
bitflyer = pybitflyer.API() # bitFlyerのAPI取得
bit_ticker = bitflyer.ticker(product_code="BTC_JPY") # bitFlyerのticker情報
from zaifapi import ZaifPublicApi
zaif = ZaifPublicApi() # ZaifのAPI取得
zaif_ticker = zaif.ticker('btc_jpy') # Zaifでのticker情報
そしてこの部分↓を削除し
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text))
その箇所に下記のコード↓を挿入
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
text = event.message.text
if text == "zaif":
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="現在のビットコイン取引額:\n"
+ str(zaif_ticker["last"]) + "円です。")) # Zaifのticker情報のうち"last"を取得
elif text == "bitflyer":
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="現在のビットコイン取引額:\n"
+ str(bit_ticker["ltp"]) + "円です。")) # bitFlyerのticker情報のうち"ltp"を取得
else:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="もう一度おねがいします。"))
ちなみにこれは**"bitflyer"**, **"zaif"**と送信すれば「Zaif」,「bitFlyer」それぞれの取引所で取引きされているビットコインの価格が、それ以外の文字列を送ると「もう一度おねがいします。」が返ってくるようになっています
これでBOT本体は完成!!
##Herokuへデプロイ
クラウド環境へデプロイ(配置)します
###設定ファイル作成
まずmain.py
ファイルと同じディレクトリで以下の名前で3つ新しいファイルを作成します
Procfile
requirements.txt
runtime.txt
それぞれこのように↓記載します
web: python main.py
Flask==1.0.2
line-bot-sdk==1.5.0
zaifapi==1.6.2
pybitflyer==0.1.9
python-3.6.5
###Herokuへアクセス
次にHerokuへログインします
コンソールに
$ heroku login
と入力しEmailアドレスとパスワードを聞かれるので自身が登録したものをそれぞれ入力
つづいてHeroku上にアプリケーションを作成
アプリ名を指定しなければランダムなものが与えられます
$ heroku create <任意のアプリ名>
Creating ⬢ <任意のアプリ名>... done
https://<任意のアプリ名>.herokuapp.com/ | https://git.heroku.com/<任意のアプリ名>.git
###環境変数の設定
LINE developersのChannel設定のときに控えたChannel Secret
とアクセストークン
を以下のように入力し設定します
$ heroku config:set YOUR_CHANNEL_SECRET="XXXXXXXXXX(Channel Secret)" --app <アプリケーション名>
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="XXXXXXXXXX(アクセストークン)" --app <アプリケーション名>
###デプロイ
$ git init
$ git add .
$ git commit -m "first commit"
$ git push heroku master
これでHerokuへのデプロイも完了
##Webhook設定
いよいよラストスパート
再びLINE developersにアクセスをし、Channel基本設定のWebhook URL
ところに先ほど任意で設定したアプリ名を使い
https://<アプリ名>.herokuapp.com/callback
と設定しましょう
####これで完成!!!!
うまくいけばこんな感じ
##ソースコード
GitHubにもコードを公開してます
こちらcachio/cachio-coin
##おわりに
上にも書きましたが今回のBOTはLINEの公式のサンプルボットを少し改変しただけの単純なもので
ほとんど書き写したような代物であり実際じぶんでも細かな部分が理解しきれていませんが、それでも目的のものができたのでよかったです。
handle_message
関数の部分をアレンジすればシンプルなBOTができるので興味ある方は挑戦してみてくだいませ
##参考
-
ちなみに今回価格情報を取るAPIは**「パブリックAPI」というもので、公の情報が取得できるのに対し、仮想通貨を実際に売買するなど個人的なトレードができるAPIは、セキュリティのため暗号化が必要だったりするので「プライベートAPI」**というものを使います。こちらの使用に関しては自己責任で使用してください ↩