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

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


今回は[コチラ](https://qiita.com/cachio_qiita/items/7f87bd879581785e86c2)で紹介したBOTの開発工程を記していきたいと思います


###**実現したいこと**
今回作成するのは、**"bitflyer"**, **"zaif"**など仮想通貨取引所の名前を送ると、
そこで取引されているビットコインの現在取引額をかえしてくるLINE BOT です

###**前提・事前準備**
- macOS 10.13.4
- Python 3.6.5
- [Heroku](https://www.heroku.com/)アカウント作成

##**LINE developers の設定**
まずLINE側の設定から
[LINE developers](https://developers.line.me/ja/)にアクセスをし、自身のLINEアカウント(このご時世もってない人はいないはず...)でログイン、開発者登録などをもとめられるので必要事項を入力していきます
次に新規プロバイダーを作成し、つづいて`Messaging API`というところから今回の仮想通貨BOTのchannel作成をします
こちらの方も`アプリ名`, `業種`, `メールアドレス`などの項目を入力、
`プラン`のところは「Developer Trial」に設定しておきましょう

ここでまだ「設定が完了していません」とでているはずなのでそこからChannel基本設定へと入ります
`Webhook送信`の項目を「利用しない」から「利用する」に変更。この設定をしないとメッセージを送信してもなにもBOTは反応しないので忘れずに
またのちに使う`Channel Secret`と`アクセストークン`の文字列を控えておきましょう
`アクセストークン`は**再発行ボタン**を押すとその度に新しいトークンを発行してくれます
あとは適当に設定したらOK

これでひとまずLINEの設定は完了！

##**BOT開発**
お次はいよいよBOT本体の開発です
このBOTはLINEの公式が推奨しているサンプルボットの[SDK(ソフトウェア開発キット)](https://github.com/line/line-bot-sdk-python)に
少し手を加えてつくりました

###**BOTプログラム作成**

まず`line-bot-sdk`と、そのなかで使われているWebアプリケーションフレームワークが[Flask]
(http://flask.pocoo.org/)なので、この２つのパッケージをインストールしていきます
任意の**仮想環境**内で、

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

とコンソールに打ち込みインストールしましょう(仮想環境作成については[前回](https://qiita.com/cachio_qiita/items/d96e67ebfee5e1c8774f)を参照！)

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

```python: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__)

#以下２行追加
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()  削除

    # 以下２行追加
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)
```
(ちょっぴり追記、削除箇所しています)

しかしこのコードでは送信したメッセージがそっくりそのままかえってくる「オウム返し」のBOTになるので、ビットコインの価格を返信する部分をつくっていきます

それにはまず仮想通貨取引所のAPIを取得しなければいけません
各取引所のAPIを用いてビットコインの現在取引価格等の情報を取得していきますが、
既存のライブラリでそれをカンタンに行うことができるので、今回はそちらを利用したいと思います

APIパッケージの[pybitflyer](https://github.com/yagays/pybitflyer)と[zaifapi](https://github.com/techbureau/zaifapi)をそれぞれインストールしてみましょう [^1]

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

```python: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情報
```
そしてこの部分↓を削除し

```python:main.py（この部分を全て「削除」）
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))
```
その箇所に下記のコード↓を挿入

```python: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](https://zaif.jp/login)」,「[bitFlyer](https://bitflyer.jp/ja-jp/)」それぞれの取引所で取引きされているビットコインの価格が、それ以外の文字列を送ると「もう一度おねがいします。」が返ってくるようになっています

これでBOT本体は完成！！







##**Herokuへデプロイ**
クラウド環境へデプロイ(配置)します

###**設定ファイル作成**
まず`main.py`ファイルと同じディレクトリで以下の名前で３つ新しいファイルを作成します
 
- `Procfile`
- `requirements.txt`
- `runtime.txt`

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

```text:Procfile(プログラムの起動方法の設定)
web: python main.py
```
```text:requirements.txt(インストールライブラリ)
Flask==1.0.2
line-bot-sdk==1.5.0
zaifapi==1.6.2
pybitflyer==0.1.9
```
```text:runtime.txt(Pythonのバージョン)
python-3.6.5
```
###**Herokuへアクセス**
次にHerokuへログインします
コンソールに

```console
$ heroku login
```
と入力しEmailアドレスとパスワードを聞かれるので自身が登録したものをそれぞれ入力

つづいてHeroku上にアプリケーションを作成
アプリ名を指定しなければランダムなものが与えられます

```console
$ heroku create <任意のアプリ名>
Creating ⬢ <任意のアプリ名>... done
https://<任意のアプリ名>.herokuapp.com/ | https://git.heroku.com/<任意のアプリ名>.git
```
###**環境変数の設定**
LINE developersのChannel設定のときに控えた`Channel Secret`と`アクセストークン`を以下のように入力し設定します

```console
$ heroku config:set YOUR_CHANNEL_SECRET="XXXXXXXXXX(Channel Secret)" --app <アプリケーション名>
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="XXXXXXXXXX(アクセストークン)" --app <アプリケーション名>
```
###**デプロイ**

```console
$ git init
$ git add .
$ git commit -m "first commit"
$ git push heroku master
```

これでHerokuへのデプロイも完了

##**Webhook設定**
いよいよラストスパート
再び[LINE developers](https://developers.line.me/ja/)にアクセスをし、Channel基本設定の`Webhook URL`ところに先ほど任意で設定したアプリ名を使い
`https://<アプリ名>.herokuapp.com/callback`
と設定しましょう

####**これで完成！！！！**
うまくいけばこんな感じ

<img width="320" alt="fullsizeoutput_2d5.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/243693/7984b7cb-0875-0c7d-c3a4-87f20fc714cc.jpeg">

##**ソースコード**
GitHubにもコードを公開してます
こちら[cachio/cachio-coin](https://github.com/cachio/cachio-coin)

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


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

##**参考**

- [PythonでLine botを作ってみた](https://qiita.com/krocks96/items/67f7510b36945eb9689b)
- [bitFlyer LightningのAPIをPythonから使えるパッケージ「pybitflyer」を作りました](http://wolfin.hatenablog.com/entry/2016/08/29/010112)

- [[Zaif]Pythonで簡単に仮想通貨の取引が出来るようにしてみた](https://qiita.com/Akira-Taniguchi/items/e52930c881adc6ecfe07)

***