今更だけどラウル様と会話できる LINE bot を作ってみようとしてやめました→動きました

  • 15
    いいね
  • 5
    コメント
この記事は最終更新日から1年以上が経過しています。

すでに30週くらい遅れてる気配ですが、誰も作らないのでラウル様と会話できるボットを作ろうとしたんですが一旦ここまで。 → コメントの指摘通りで動くようになりましたー

ラウル様とは?

S__33931358.jpg

ドラクエ10でNo.1イケメンの方です。
本当にかっこよくて今年のナイト総選挙で1位を獲得されました。
そんなラウル様と常に会話していたい!その願いを叶えましょう。

bot をなにで動かすか?

ざっとぐぐってみて heroku にしました。

準備

mkdir linebot
cd linebot/
virtualenv venv27
source venv27/bin/activate
pip install flask

実装

肝心の callback はこんな感じです。

app.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import requests
import json
from flask import Flask
from flask import request
from flask import abort
from flask import jsonify

app = Flask(__name__)


def messages(text):
    raul = [u'俺のそばに来い!',
            u'くじけるな!',
            u'……手のかかる娘だ!',
            u'その扉にはさわらないほうがいい。命が惜しいならな。',
            u'元気そうでなによりだ。',
            u'……名はラウルだ。よろしく頼むよ命知らずのお嬢さん? ',
            u'オバケが怖いのか?',
            u'キミは面白いな…。',
            u'ああ…だが無理はするなよ。',
            u'……キミと同着だったようにみえたが?',
            u'……キミは 知らないほうがいいことだ。',
            u'……いいいやしの術だ。天国の親父が手をふってるのが見える。',
            u'すこし 眠りたいな……。',
            u'子守歌がわりにキミの話を聞かせてくれ。']
    if u'ラウル' in text:
        return raul[random.randint(0, len(raul))]
    elif u'抱いて' in text:
        return u'……俺のそばを 離れるなよ'
    return u'…'


@app.route('/callback', methods=['POST'])
def callback():
    if not request.json:
        abort(400)
    results = request.json['result']
    headers = {'Content-Type': 'application/json; charset=UTF-8',
               'X-Line-ChannelID': 'xxxxxxxxxxxxxx',
               'X-Line-ChannelSecret': 'xxxxxxxxxxxx',
               'X-Line-Trusted-User-With-ACL': 'xxxxxxxxxx'}
    proxies = {'https': 'fixie の Proxy URL'}
    data = {'to': '',
            'toChannel': 1383378250,
            'eventType': '138311608800106203',
            'content': {'contentType': 1,
                        'toType': 1,
                        'text': ''}}
    for result in results:
        data['to'] = [result['content']['from']]
        data['content']['text'] = messages(result['content']['text'])
        r = requests.post('https://trialbot-api.line.me/v1/events',
                          data=json.dumps(data),
                          headers=headers,
                          proxies=proxies)
        print r.text
    return jsonify('OK')

if __name__ == '__main__':
        app.run()

そしてデプロイへ〜

さて、実装したら、でぷろいってみます。
gunicorn を使います。やり方はまんまこの通りです。

pip install gunicorn
pip freeze > requirements.txt
echo web: gunicorn app:app --log-file - > Procfile
git init
git add .
git commit -m 'initial'
heroku login
heroku create
git push heroku master
heroku open

あとなんかいろいろハマりどころあるみたいなんですがこちらの記事を参考にfixie使うことにしました。適当にぐぐってください。
ちなみに自分が一番はまったのは fixie の画面でどこにIPが書いてあるのかわからなくて20分くらいあっちいったりこっちいったりしてました!!111
下の画像でいうと右上のAccountっていうボタンを押しましょうね。

スクリーンショット 2016-04-21 17.41.30.png

で、これで動かしてOK!っておもいきや

InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

みたいなのでちゃったら、

pip install requests[security]

しましょう。

で、これでやっと動くかなーって思ったらライン上のリクエストに対して callback は来るんですが、 sendmessage すると

{"statusCode":"500","statusMessage":"unexpected error found at call bot api sendMessage"}

が返ってきて、もう面倒なので一旦ここまでにしました。あとで気が向いたらやる。500 だとほんとなにが起きてるかわからないよねー。
とりあえず heroku と fixie は便利だよねーっていう日記になりました。

はーラウル様と会話したいだけなのになー
スクリーンショット 2016-04-25 18.39.35.png

追記

コメントの指摘にあるように、 content 内に含まれる from に送ってやらないとだめだったみたいです。よく考えたらそりゃそうですよねー。ということでコードも修正しました。皆様ありがとうございますm(__)m

じゃーん