サイトアイコン ITC Media

【Python】DjangoでLINEBot構築する方法と実例紹介

(最終更新月:2023年1月)

✔このような方へ向けて書かれた記事となります

「DjangoでLINEBotを構築したい」

「ローカル環境で試せるものってなにかあるのかな?」

「実例があるとわかりやすいんだけど。」

✔当記事を通じてお伝えすること

当記事では、LINEボットを作る手順やコードはもちろん、実際のボット例を動画でご覧いただけます。

ぜひ最後までご覧ください。

✔LINEボット紹介ショートムービー

運営者プロフィール

現在はIT企業のプロダクトマネージャーとして、個人向け/社内向けシステムなど、複数のシステム開発・運営に携わっています。

Webサイト構築やECサイトの開発経験に加えて、PythonなどのプログラミングやSalesforceなどのクラウドアプリケーションに関する幅広い知識・経験を活かして「プログラミング初心者がスムーズに学べるサイト」を目指しています。

Githubでは、趣味で作成したアプリなどを公開しています。

https://github.com/Yulikepython/

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

LINEボットを作るための手順

当記事でLINEボットを作るための手順は以下のとおりです。

LINEアカウントでの事前準備

LINEアカウントで事前におこなっておくことは以下のとおり。

LINE公式アカウントの作成

LINEの公式アカウントを作成します。

以下の2通りから適したものを選びましょう。

どちらでもお好きな方をお使いください。

以下のページより作成可能です。

LINE Business ID

LINE Developersサイトの設定

LINE公式アカウントができたら、LINE Developersサイトへログインし、以下の設定をおこないましょう。

プロバイダ・チャネルの作成

プロバイダーとは開発者といえるでしょう。

その開発者がチャネルを持ち、チャネルと構築したボットを紐付けることになります。

まずはプロバイダーを作り、その中にチャネルを作ってください。

チャネル > Messaging API設定

Messaging API設定でおこなうことは2つ。

チャネルアクセストークンは以下の場所で発行できます。

アプリの完成後、Webhook URLにボットのURLを入れることになります。

のちほどおこないましょう。

LINE公式アカウントの設定

Developerサイトの設定が終わったら、LINE公式アカウントへ戻ります。

Line Developersサイトで作成したチャネル名と同じアカウントが見つかるはずです。

そのアカウントの中で以下の設定をおこないましょう。

設定 > 応答設定

Webhookの設定をONにします。

設定 > Messaging API

こちらのURLはのちほど入力するので、覚えておきましょう。

Djangoでアプリを立ち上げる

PythonをベースとしたDjangoプロジェクトを立ち上げて準備しましょう。

仮想環境を準備

プロジェクトのフォルダを決めたら、仮想環境を準備します。

ターミナルで以下のコマンドを実行します。

virtualenv -p python3 venv

Djangoプロジェクトのための仮想環境立ち上げを詳しく知りたい方はこちら。

必要なライブラリをインポート

仮想環境内で必要なライブラリをインポートしましょう。

pip install ライブラリ名

最低限必要なものは以下のとおりです。

初期設定

プロジェクト・アプリを立ち上げて初期設定をしましょう。

私はlinebotapiという名前のアプリを以下のようにして立ち上げて、設定をおこないました。

django-admin startproject main .

詳しい設定方法がわからない方はこちらの通りにおこないましょう。

✔Djangoのインストールからプロジェクトを立ち上げる方法

✔Djangoの初期設定

✔アプリの立ち上げ方

LINEBotの構築方法

アプリの立ち上げが完了したら、LINEボットを作っていきましょう。

以下のファイルを設定していきます。

ページを表示するわけではありませんので、HTMLテンプレートは不要です。

bot_base.py

LINEメッセージを返すためのクラスを定義します。

メッセージオブジェクトを受け取り、返信をする機能が付いています。

import urllib.request
import json, requests

REPLY_ENDPOINT_URL = "https://api.line.me/v2/bot/message/reply"
ACCESSTOKEN = "発行したアクセストークン"
HEADER = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + ACCESSTOKEN
}

class LineBotMSG():
    def __init__(self, messages):
        self.messages = messages

    def reply(self, reply_token):
        body = {
            'replyToken': reply_token,
            'messages': self.messages
        }
        req = urllib.request.Request(REPLY_ENDPOINT_URL, json.dumps(body).encode(), HEADER)

アクセストークンをコピペして入力してください。

bot_messages.py

シンプルなテキストを返す関数を定義します。

def create_message(msg):
    message = [
                {
                    'type': 'text',
                    'text': msg
                }
            ]
    return message

私が作成したアプリではカルーセルテンプレートを使用しているので以下のようになりました。

def create_carousel():
    msg = [
            {
            "type": "template",
            "altText": "ITCブログの検索一覧",
            "template": {
                "type": "carousel",
                "columns": [
                    {
                        "thumbnailImageUrl": thumbnail_url,#画像用のURLを入れる
                        "imageBackgroundColor": "#FFFFFF",
                        "title": title_text, #タイトルのテキストを入れる
                        "text": "", #テキストを入れたい場合はこちら
                        "actions": [
                        {
                            "type": "uri",
                            "label": "記事を読む",
                            "uri": link_to,#リンクURL
                        }
                        ]
                    },
                    #forループで複数作ります
                ],
                "imageAspectRatio": "rectangle",
                "imageSize": "cover"
            }
        }
    ]
    return msg

今回はシンプルなテキストを返すアプリとして進めていきます。

views.py

Django REST FrameworkのAPIViewを使った方法をご紹介します。

from linebotapi.bot_base import LineBotMSG
from linebotapi.bot_messages import create_message
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status

class LineBotApiView(APIView):
    @method_decorator(csrf_exempt)
    def post(self, request, format=None):
        res = request.data
        response_text = {"text": "正常に検索されました。"} #レスポンスとして返す
        code = status.HTTP_200_OK #レスポンスのステータスコード
        if len(res['events']) > 0:
            data = res['events'][0] #リストの中に辞書がひとつ
            message_obj = data['message']
            text = message_obj.get('text')
            reply_token = data['replyToken']
            msg = create_message("テスト用ボットのテキスト")
      line_message = LineBotMSG(msg)
            line_message.reply(reply_token)
        else:
            response_text["text"] = "Webhookの確認" #確認時に返すレスポンス
        return Response(response_text, status=code)

urls.py

urls.pyのURLがWebhookで設定するURLになります。

from django.urls import path
from linebotapi.views import LineBotApiView
urlpatterns = [
    #...
    path("linebot/webhook/", LineBotApiView.as_view(), name="linebot-webhook"),
]

以下のようなURLを設定しました。

ドメイン/linebot/webhook/

ローカル環境で試せるngrokとその設定

構築したアプリをローカル環境で試すためにはngrokの設定が必要です。

なぜならlocalhostというドメインでは、LINE公式アカウントのWebhookが利用できないから。

ngrokとは

ngrokとは、ローカルホストのアドレスに外部からアクセスできるようにしたネットワークツールです。

ngrokを設定することで、httpsに対応したアドレスも発行できます。

以下のサイトで無料登録できますので、まずは登録してサーバーを立ち上げましょう。

ngrok Log in — Manage Tunnels, Domains & API Gateways
Sign in to ngrok to manage your tunnels, custom domains, endpoints, and API gateways. Authenticate with email, GitHub, G...

使用する際は、Djangoのポート番号8000で立ち上げましょう。

ngrok http 8000

Webhookの設定

ngrokの設定と立ち上げが完了したら、以下にてWebhookの設定をします。

LINEBotを公開しよう

LINEBotを公開するには以下の手順が必要です。

公開用のサーバーを準備する

DjangoなどのWebアプリは一般的なレンタルサーバーでは公開できません。

その理由は、Djangoアプリを公開するにはより高度な設定が必要になるからです。

例えば以下のようなVPSが使いやすいでしょう。

>>ConoHaVPS<<

もしくはこちらからお好きなものを選んで契約してください。

サーバーの設定をする

VPS上でWebサーバーを構築するには以下の記事を参考にしてください。

公開用サーバーにアプリをデプロイする

以下の記事を参考にアプリをサーバーにデプロイしましょう。

まとめ:Python・DjangoでLINEBotは作れる

当記事の内容をまとめます。

PythonをベースとしたDjangoフレームワークでのLINEBot構築方法をご紹介しました。

こちらのやり方を応用すればさまざまなLINEボットが作れます。

以下のITCブロブ公式LINEアカウントでは、当ブログ内の記事検索ができるボットとなっています。

最新の情報なども配信してますが、気軽にLINEから検索もできるので、ぜひお友だち登録をいただいて、試してみてください。

もしくはボット作成を依頼したいという方も、気軽にご連絡ください。

モバイルバージョンを終了