LINEからMessaging APIが新しくリリースされたそうなので相変わらず形態素解析をするだけのBOTを作った


## はじめに

以前にTrialアカウントで全く同じものを作ったのですが、「アカウント一斉削除すっぞ！！」というような脅しメールが来たので移行しました。

## リポジトリ

### 私の作ったもの

https://github.com/nnsnodnb/morphological-linebot

### LINEオフィシャルのSDK

https://github.com/line/line-bot-sdk-python

## BOT

![9FlxYyqoOH.png](https://qiita-image-store.s3.amazonaws.com/0/97280/bcb09b97-91b3-30e6-3ce9-14e9a0848125.png "9FlxYyqoOH.png")

SDKの[Wikiページ](https://github.com/line/line-bot-sdk-python/wiki/Projects-Using-SDK)に乗ったらいいなぁなんて...

## 環境

- Python3.5.2
- Virtualenv
- Flask
- 夜のテンション
- キチガイのテンション
- 晩御飯食べてないけど開発意欲が半端ない

## ソースコード

```python:bot.py
# coding: utf-8

from __future__ import unicode_literals

from flask import Flask, request, abort

from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage

from janome.tokenizer import Tokenizer

import os, re, json

def load_env():
    try:
        with open('.env') as f:
            content = f.read()
    except IOError:
        content = ''

    for line in content.splitlines():
        m1 = re.match(r'\A([A-Za-z_0-9]+)=(.*)\Z', line)
        if m1:
            key, val = m1.group(1), m1.group(2)
            m2 = re.match(r"\A'(.*)'\Z", val)
            if m2:
                val = m2.group(1)
            m3 = re.match(r'\A"(.*)"\Z', val)
            if m3:
                val = re.sub(r'\\(.)', r'\1', m3.group(1))
            os.environ.setdefault(key, val)

load_env()

app = Flask(__name__)

line_bot_api = LineBotApi(os.environ.get('CHANNEL_ACCESS_TOKEN'))
handler = WebhookHandler(os.environ.get('CHANNEL_SECRET'))

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-LINE-Signature']

    body = request.get_data(as_text=True)
    receive_json = json.loads(body)
    message = receive_json['events'][0]['message']['text']

    response_arrays = []
    t = Tokenizer()
    for token in t.tokenize(message):
        response_arrays.append(str(token))

    response = ''
    for item in range(len(response_arrays)):
        if len(response_arrays) == item + 1:
            response += str(response_arrays[item])
        else:
            response += str(response_arrays[item] + '\n')

    try:
        line_bot_api.reply_message(receive_json['events'][0]['replyToken'], TextSendMessage(text = response))
    except InvalidSignatureError:
        abort(400)

    return 'OK'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port = 8003, threaded = True, debug = True)
```

```:.env
CHANNEL_ACCESS_TOKEN='hogehoge' # めっちゃ長いやつ
CHANNEL_SECRET=''					# 今まで通り隠れてるやつ
```

## LINE管理画面側の設定

案の定、HTTPSでないとダメなので頑張りましょう！

![スクリーンショット 2016-10-21 午前0.45.56.png](https://qiita-image-store.s3.amazonaws.com/0/97280/f2b2aae4-017d-cb2a-7513-913061952f58.png "スクリーンショット 2016-10-21 午前0.45.56.png")

LINE@の管理画面に頑張ってたどり着いて **「アカウント設定」** > **「Bot設定」** で自分の思うような設定をしましょう！

## 実際のレスポンス

![FullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/97280/06fc9db6-aea2-cb5f-9555-d08c24603b11.jpeg "FullSizeRender.jpg")

とても見づらいですね...

## 最後に

なにかあればPullRequestなどドンドン出してほしいです！
あとLINEさんWikiページお願いします。

旧APIと今回の新APIでは `request.headers['X-LINE-Signature']` があるのとないのではじめ焦りました。ちなみに旧APIでは `request.headers['X-Line-Channelsignature']` に相当します。