Python

Python(Django 2.x) + HerokuでサクッとLINE BOTを作成する


こんにちは,しまさん(@nitkcdadon)です.

最近ふとLINEでBOTを作ってみたいなーと思い調べてみると意外と簡単に作成できそうだったので試しに作ろうと思いました.

であれば最近ハマってるPythonのWebフレームワークであるDjangoを使い,Herokuを用いてサクッと作ってしまおうという魂胆です.

Django 1.x でやられているかたもいましたがやはり今やるなら2.xでしょう!!ということでDjangoは2系でいきたいと思います.

今回は簡単なオウム返しBOTを作成していきます.

環境

macOS Mojave 10.14

pyenv Python 3.6.7
 Django==2.1.7
 line-bot-sdk==1.8.0
 gunicorn
 django-heroku
 psycopg2-binary

Heroku

LINE Developers

まぁ何はともあれLINE BOTを作りたいのでAPIを使いたいわけです.

なので最初にLINE Developersでアカウントを作成・登録を行っておきましょう.

ここで必要なキーやBOTアカウントをGETします.

LINEアカウントを持っているとログインすることができます.便利ですね.

先程のURLからログインしたらまずは「新規プロバイダー作成」を選択してください.

選択するとプロバイダー名を決める画面にいきます.名前は適当に決めてください.

プロバイダー名を決めたら次はチャンネル作成を行っていきます.

真ん中の「Messaging API」でチャンネル作成をお願いします.

新規チャンネル作成にあたって様々な設定をしていきます.

・アプリアイコン画像

・アプリ名

・アプリ説明

・プラン – Developer Trial

・大業種 – 個人

・小業種 – 個人(学生)

・メールアドレス

全て入力するとチャンネルが新しく作成されます.

Channel Secretの値をまずはメモしておいてください.

アクセストークンは再発行をし,でてきた文字列をメモしておいてください.

Webhook周りは後で設定します.もしBotにグループトーク参加させたい場合はBotのグループトーク参加を編集して「利用する」にしておいてください.

LINE@機能については編集から「利用しない」に変更しておいてください.特に自動応答メッセージは利用しないようにお願いします.

ここまで設定したらページの一番下にQR コードがありますので自分のLINEから友達登録しておきましょう.

ここではBOTを友達登録できており,Channel Secretの値とアクセストークンの値がメモできていたらOKです!!!

あとでWebhook周りは設定するので頭の片隅にでも置いてあげてください.

Python(Django)

今回はline-bot-sdk-pythonにて紹介されているFlaskでのサンプルをDjango用に変えていくことでオウム返しBOTを作成します.

ライブラリのインストールはpipで行えます.

pip install line-bot-sdk

ではDjangoのプロジェクトを作成し,botアプリを作成します.

django-admin startproject djangobot && cd djangobot
python manage.py startapp bot

あとはbot/にurls.pyを作成しておいてください.ではファイルを少しづつ編集していきます.

djangobot/settings.py

import osの下にdjango_herokuを追加しておいてください.

import os
import django_heroku # 追加

INSTALLED_APPSにbot. … を追加します.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bot.apps.BotConfig', #追加
]

末尾でLANGUAGE等の変更をします.

LANGUAGE_CODE = 'ja' #変更

TIME_ZONE = 'Asia/Tokyo' #変更

末尾に以下を追加します.

django_heroku.settings(locals()) #追加

djangobot/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('callback/', include('bot.urls')),
]

bot/urls.py

from . import views
from django.urls import path

app_name = 'bot'

urlpatterns = [
    path('', views.callback, name='callback'),
]

bot/views.py

from django.shortcuts import render
from django.http import HttpResponseForbidden, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from linebot import (LineBotApi, WebhookHandler)
from linebot.exceptions import (InvalidSignatureError)
from linebot.models import (
    MessageEvent,
    TextMessage,
    TextSendMessage,
)
import os

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)


@csrf_exempt
def callback(request):
    signature = request.META['HTTP_X_LINE_SIGNATURE']
    body = request.body.decode('utf-8')
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        HttpResponseForbidden()
    return HttpResponse('OK', status=200)


# オウム返し
@handler.add(MessageEvent, message=TextMessage)
def handle_text_message(event):
    line_bot_api.reply_message(event.reply_token,
                               TextSendMessage(text=event.message.text))

ここのYOUR_CHANNEL_ACCESS_TOKENやYOUR_CHANNEL_SECRETに最初メモしておいた値が入ることになります.

ここはHeroku側で設定しますので問題ありません.

ここからは今の階層でHerokuのために必要なファイルを作成していきます.

「Procfile」と「requirements.txt」と「runtime.txt」です.

Procfile

web: gunicorn djangobot.wsgi --log-file -

requirements.txt

Django==2.1.7
line-bot-sdk==1.8.0
gunicorn
django-heroku
psycopg2-binary

runtime.txt

python-3.6.8

Heroku

Herokuはサクッとアプリケーションを公開するのにマジで便利なPaaSです.

こういう簡単なものに対してサーバーをいちいち用意するのは面倒ですし,なるべくお金は使いたくありません(私はお金ないですし…).

Herokuには無料枠があり,使う分には問題ありませんので今回はHerokuを使っていきたいと思います.

HerokuはGUI操作でもいいのですが今回はHeroku CLIを使います.

Macの方はbrewでインストールできます.

brew tap heroku/brew && brew install heroku

では作成したアカウント情報を使ってログインします.

heroku login
Enter your Heroku credentials:
Email: XXX@XXX
Password: ***

heroku createコマンドでアプリケーションを作成します.

名前かぶっているとダメだよーってエラーがでるので被らないような名前にするといいかもしれません.

heroku create アプリケーション名
git remote add heroku https://git.heroku.com/アプリケーション名.git

次にDjangoの際に設定するといっていたYOUR_CHANNEL_ACCESS_TOKENとYOUR_CHANNEL_SECRETを設定します.

heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの欄の文字列" --app アプリケーション名
heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの欄の文字列" --app アプリケーション名

さぁデプロイまであと少しです!!!!!!

git init
git add .
git commit -m "new commit"
git push heroku master

これでデプロイできているはずです!

ログを確認するには,

heroku logs --tail -a アプリケーション名

を実行します.絶対にどこかで失敗していると思って,実行してエラーが出ていないか定期的に確認することを強くおすすめします.

では最後の最後にLINE Developersへ戻り,Webhookの設定をします.

Webhook送信を編集し,「利用する」にします.

Webhook URLは「https://アプリケーション名.herokuapp.com/callback/」とします.

※ Webhook送信の欄ですが何度かページ更新を行ってみることを推奨します.編集して「利用する」にしていたのに「利用しない」になってるなんてことが私の場合ありました.

では実際に試してみると???

うまくいっていますね.DjangoでBOT作成完了です!!

さいごに

今回はDjango+HerokuでサクッとLINE BOTを作成してみました.

サクッとといいつつ色々な作業をした気がしますが…きっと気の所為でしょう.

LINEは使用しているひとが多いので他にも色々試してBOT作ってみたいと思います.

参考

ABOUT ME
しまさん
てくてくぷれいす運営者のしまさんです. 高専→大学編入してから行動的な大学生  自身の変化を求めてブログを始める グレープフルーツと本が大好物 IT系のことやブログ,高専や編入,大学生活に関することを発信中!!詳しいプロフィールはこちら≫ 投げ銭はコチラへ 質問はコチラ