流行のLINE BOT APIを使って形態素解析BOTを作ろうとしたら既読スルーBOTになったハナシ

#背景
最近巷でLINE BOT APIが流行っている（気づくの遅い？）
公式のアナウンスやプレスリリースによると
>”BOT API Trial Account”とは？
BOT API Trial AccountではあなたのサービスとLINEユーザーの 双方向コミュニケーションを可能にするAPI開発をお試しいただけます。
[BOT API Trial Accountのご紹介 | LINE Business Center](https://business.line.me/services/products/4/introduction)


>企業アカウントがユーザーと会話形式でやりとりするメッセージングAPIのオープン化に先駆け、サードパーティの開発者先着1万人に開放する。

>ユーザーが開発したシステムやサービスとLINEアカウントを連携させ、APIを介してメッセージを送受信するbotアカウントを作成できる。レストラン検索やスケジュールアプリと連携した予定通知やクーポン発行、家電製品などのハードウェア類と連携し、LINEから操作――など、さまざまな用途・分野の活用を見込む。
[ITmedia LINE BOT APIのニュース](http://www.itmedia.co.jp/news/articles/1604/07/news134.html)

one to oneマーケティングの可能性？
<img width="1061" alt="スクリーンショット 2016-08-04 1.52.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/132984/a36cf543-2df3-753e-2626-c750e9036b28.png">

http://lbc.line.me/
より

おもしろいものを作っている人がいて、真似してみたくなった。
・[LINE APIが公開されたのでGoogle Cloud Vision使って画像解析しちゃうBOTをAWS Lamdaで作ってみた話](http://qiita.com/dkawashi/items/4329d8ec085678b346e4)

・[LINE BOT APIで英単語の翻訳を教えてくれるBOTを実装した話](http://milk0824.hatenadiary.jp/entry/2016/04/09/223121)


・[LINE BOT APIで今日のランチを検索する](http://qiita.com/ichikawa_0829/items/2e640e162976ec341ff1)
googleのAPIともつないでいる様子




#やったこと
・BOT API Trial Accountのアカウント登録をする
・Callback URLの登録
・Server IP Whitelistの設定（メッセージ送信する際に許可するIPアドレスを登録）
・形態素解析コード作成

#

一般に言われるつまずきポイント
・コールバックURLは暗号化対応されたものが必要。且つポート443(SSLのポート番号)を指定する必要がある(https://○○○○.ssl-xserver.jp:443/linebot/callback.py)
・設定したコールバックの反映が遅い。
・Server IP Whitelistの反映も遅い。

#登録の流れ
[LINE Business Center](https://business.line.me/services/products/4/introduction)から登録、先着1万人と言われていたが、おそらく違う
<img width="959" alt="スクリーンショット 2016-08-04 1.37.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/132984/ee1a59a6-7d3f-9ea4-4065-b809e8f4c44d.png">

普通に入力していくだけ。

登録が完了すると、
・Channel ID
・Channel Secret
・MID
の3つのキーがもらえます。APIリクエスト時にリクエストヘッダに設定する事になるコードです。

<img width="1242" alt="スクリーンショット 2016-08-04 1.37.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/132984/40976f76-2f1c-92da-6f13-5e73227f082f.png">


#サーバー
AWSの人もいれば、レンタルサーバの人もいれば、Heroku(PaaS？)の人もいますよと。
今回は、レンタルサーバのXserverを使いました。
<img width="763" alt="スクリーンショット 2016-08-04 1.58.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/132984/0e8b787f-6921-af3c-73a8-3d59f535b5ee.png">
SSL設定をクリックして

<img width="741" alt="スクリーンショット 2016-08-04 1.58.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/132984/751c463a-141d-9d06-42cd-ebbe675e582c.png">

共通SSLを設定してあげるだけ。
設定されたURL(https://○○○○.ssl-xserver.jp)をコールバックURLとしてLINE developersのダッシュボードで記載

#形態素解析
言語はPythonです。
[このサイト](http://nnsnodnb.hatenablog.jp/entry/line-bot-made-flask)を参考にしました。

```py:callback.py
from flask import Flask
from flask import request

from janome.tokenizer import Tokenizer

import requests
import json
import re

import settings

LINEBOT_API_EVENT ='https://trialbot-api.line.me/v1/events'
LINE_HEADERS = {
    'Content-type': 'application/json; charset=UTF-8',
    'X-Line-ChannelID':settings.CHANNEL_ID,
    'X-Line-ChannelSecret':settings.CHANNEL_SECRET,
    'X-Line-Trusted-User-With-ACL':settings.MID
}

def post_event(to, content):
    msg = {
        'to': [to],
        'toChannel': 1383378250,
        'eventType': "138311608800106203",
        'content': content
    }
    r = requests.post(LINEBOT_API_EVENT, headers = LINE_HEADERS, data = json.dumps(msg))

def post_text(to, text):
    content = {
        'contentType':1,
        'toType':1,
        'text':text,
    }
    post_event(to, content)


commands = (
    (re.compile('作者', 0), lambda x: 'https://nnsnodnb.moe'),
)

app = Flask(__name__)

@app.route("/callback", methods=['POST'])
def callback():
    messages = request.json['result']

    for message in messages:
        text = message['content']['text']
        for matcher, action in commands:
            if matcher.search(text):
                response = action(text)
                break
        else:
            post_text(message['content']['from'], '解析中...')
            # 形態素解析
            response = ''
            t = Tokenizer()
            for token in t.tokenize(message['content']['text']):
                response += str(token) + '\n'
        post_text(message['content']['from'], response)
    return ''

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

これをFTPソフトでサーバー上にアップしておしまい！

###のはずが！！！

けいたいそかいせきされず
既読スルーされる
<img width="375" alt="IMG_0466.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/132984/cbd08df1-6e45-517f-d603-bad981253a54.jpeg">



コードのミスかコールバックURLの反映待ちかわからないが、もう少し待とうと思う

既読スルーBOTを使って見たい方は友達になってください（予告なく消す場合がございます）
<img width="162" alt="スクリーンショット 2016-08-04 2.08.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/132984/ea67a150-3e10-ccfd-eb1b-16789dacd0ec.png">



#終わりに

やりかたによっては、便利機能を持たせたBOTやビジネスシーンで光るBOTを個人が簡単に作れるようになっている気がした（形態素解析もさせられなかったが...）
チャットボットも界隈では流行っているらしいし。

サーバーまわりの知識があるともっと違うアプローチがあったとも感じる

既読スルーがこんなに辛かったのは久しぶりでした。

おなじようなことを書いている方がいて謎の親近感
http://naoyashiga.hatenablog.com/entry/2016/04/12/123312

#参考にしたサイト
Python + FlaskでLINE botを作った
http://nnsnodnb.hatenablog.jp/entry/line-bot-made-flask


LineBotの事例を21個まとめてご紹介
http://blog.minato.jp.net/entry/linebot

個人でも利用可能なLINE API（BOT API）の使い方（PHP）。トライアル版は先着10,000名様まで利用可能！
https://www.panzee.biz/archives/9115
LINE developers BOT API公式
https://developers.line.me/bot-api/overview