djangoでline botを作る

line botdjangoを使って作る

まずはline developersのアカウントを取得するためlineのアカウントでログイン

developers.line.biz

f:id:saitama_28:20200523135220p:plain



左上のconsole homeから新規provider をcreateする

f:id:saitama_28:20200523135039p:plain

そのしたのproviderからcreate new channelを選択し、channel typeはmessaging API

その後はそれぞれの設定をする。ここまでするとqrコードで自分の作るline botが登録できるようになる。

f:id:saitama_28:20200523143840j:plain

 

今回は予約botを作るのでLINEでよく見るこういうようなメニュー(リッチメニュー と言います)を押したらメッセージを送り、それに対して、line bot側がいつにしますか?というメッセージとともにlineのテンプレートメッセージというものを使って日時表示カルーセル とともにline botがメッセージを送り返す。それに対してユーザーが日時を選択すると予約ができるというシステムを作っていきます

 

まずはここにログインして先ほど作ったアカウントを選択

www.linebiz.com

  • 左のメニューからリッチメニューを選択右上の作成ボタンをクリック

    f:id:saitama_28:20200523135559p:plain

  • 表示設定はタイトル以外はデフォルトでOK

f:id:saitama_28:20200523135718p:plain

  •  その下のコンテンツ設定はテンプレートを選択し画像を貼るか、自分で文字入りの画像を作る
  • 作れたらアクションのところでタイプをテキストにして予約にする

保存して実際に作ったメニューを自分のスマホでタップすると予約というメッセージが送られると思います。

djangoを使ってメッセージを返す

ここまで行ったら次はdjangoで送られてきたメッセージに対してメッセージテンプレートというものを使ってカルーセルをline botから送信したいと思います。

今回はpythonのバージョン・パッケージ管理システムであるanacondaを使ってdjangoをinstallします

www.anaconda.com

 入れてない人は↑の一番したからダウンロードしてください

f:id:saitama_28:20200523132930p:plain

anacondaが入れられたらanaconda navigatorを立ち上げて

  • Environmentsを選択
  • 左下のcreateを選択
  • 名前をdjango37などにしてpythonを選択しversionは3.7を選択-

右下のcreateを選択し環境構築が完了

この状態ではまだdjangoは入ってないのでターミナルを開いて

$ conda activate django37

で環境を立ち上げる

その後

$ conda install django

djangoをinstallこれで環境ができました。

そしたらまずは 

$ django-admin startproject reception_line_bot

でプロジェクトを作成します。

reception_line_bot/
    manage.py
    reception_line_bot/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

 こんな感じに作れたと思います。

次にアプリケーションを作ります。

$ cd reception_line_bot

でreception_line_botの中に入ってから,

$ python manage.py startapp bot 

とすると

bot/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

となったと思います。

次にエディタでreception_line_bot/urls.pyを編集していきます。

"""reception_line_bot URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

urlpatterns = [
path('admin/', admin.site.urls),
]

こうなっていると思いますが、urlpatternsのところにdjangoが受け取ったline botのリクエストをどのファイルのどの関数に送るかを指定します。

なので今回は

import bot.views
urlpatterns = [
#path('admin/', admin.site.urls),
path('', bot.views.reception),
]

とします。receptionはこれからviews.pyに書く関数です。

views.pyにコードを書く前にline botを作成した時に発行されたチャンネルシークレットとアクセストークンはコードの中に直接書くとまずいので、jsonを通してviews.pyで受け取れるようにしたいと思います。なので一番上のline_reception_botの下にsetting.jsonを作り、

f:id:saitama_28:20200523154823p:plain

providersからチャネルを選択しmessaging APIの一番したでaccess tokenを発行し、コピペします。

次に

f:id:saitama_28:20200523155117p:plain

messaging APIの隣のBasic settingsのところからChannel secretを取得します。

その二つを先ほど作ったsetting.jsonにコピペしていきます

{
"LINE":{
"channel_secret":"fakfkajpdpaida132941",
"access_token":"a3nm7yOY7IoUt8blZ6QqK6RShadfsajdjfadfljfafdsdjsdfailfajjpqjpoejpqjpfjpqejiepqwifqpjdjidcS9yEBGieq+VMQs0EL+mQDtwdB04daft89/aad1O/w1cDnyilFU="
}
}

こんな感じ、(channel_secretとaccess_tokenは適当に変えました)

そしたらviews.pyを開いてユーザーが送ってきたメッセージに対して何か送るコードを書いていきます。

from django.views.generic import TemplateView
from django.shortcuts import render
from django.http.response import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
import urllib.request
from reception_line_bot.settings import BASE_DIR
# Create your views here.

@csrf_exempt
def reception(request):
json_open = open('setting.json', 'r')
json_load = json.load(json_open)
channel_secret = json_load['LINE']['channel_secret']
access = json_load['LINE']['access_token']
request_body = request.body
data = confirm_json_loads(request_body)
body = request.body.decode('utf-8')
user_message = data["events"][0]["message"]["text"]
reply_token = data["events"][0]["replyToken"]
send_message(reply_token,user_message,access)
return JsonResponse({"message":"OK"})

 

今日はここまでにして次回は何か送り返すところぐらいまで行けたらいいなと思っています。

anacondaとかpythonの知識はそこそこわかるようになってきたのですが。lineからのリクエストなどpostやgetやhttpなど見えないところがまだわかりません。がんばります。