LoginSignup
14
18

More than 5 years have passed since last update.

【Python】ビットコインの価格を教えてくれるLINE BOTを 右も左もわからない初心者がつくってみた

Last updated at Posted at 2018-06-05

はじめに

プログラミングがまったく初心者の記録的投稿
またこの記事がほかの初心者の方のお役に立てれば幸いです

今回はコチラで紹介した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なので、この2つのパッケージをインストールしていきます
任意の仮想環境内で、

$ pip install flask
$ pip install line-bot-sdk

とコンソールに打ち込みインストールしましょう(仮想環境作成については前回を参照!)

仮想通貨BOTを格納するディレクトリを新しく作成し、
さらにそのディレクトリ内にmain.pyというファイルをつくります
そしてline-bot-sdkのこのコードをコピー&ペースト

main.py
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パッケージのpybitflyerzaifapiをそれぞれインストールしてみましょう 1

インストールが完了したらさっそくmain.pyファイルにインポートしていきます

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情報

そしてこの部分↓を削除し

main.py(この部分を全て「削除」)
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

その箇所に下記のコード↓を挿入

main.py(先ほど削除した箇所にこれを書き加える)
@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

それぞれこのように↓記載します

Procfile(プログラムの起動方法の設定)
web: python main.py
requirements.txt(インストールライブラリ)
Flask==1.0.2
line-bot-sdk==1.5.0
zaifapi==1.6.2
pybitflyer==0.1.9
runtime.txt(Pythonのバージョン)
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
と設定しましょう

これで完成!!!!

うまくいけばこんな感じ

fullsizeoutput_2d5.jpeg

ソースコード

GitHubにもコードを公開してます
こちらcachio/cachio-coin

おわりに

上にも書きましたが今回のBOTはLINEの公式のサンプルボットを少し改変しただけの単純なもので
ほとんど書き写したような代物であり実際じぶんでも細かな部分が理解しきれていませんが、それでも目的のものができたのでよかったです。
handle_message関数の部分をアレンジすればシンプルなBOTができるので興味ある方は挑戦してみてくだいませ

参考



  1. ちなみに今回価格情報を取るAPIは「パブリックAPI」というもので、公の情報が取得できるのに対し、仮想通貨を実際に売買するなど個人的なトレードができるAPIは、セキュリティのため暗号化が必要だったりするので「プライベートAPI」というものを使います。こちらの使用に関しては自己責任で使用してください 

14
18
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
18