Djangoで画像を返すLINE BOTを作成した

- django

DjangoでLINE BOTを作った

諸事情あってLINE BOTを作ることになったのでその備忘録を残しておきます。

概要

とりあえず動くものを作りたかったので「正解」に対しては画像1, それ以外のワードに対しては画像2を返すものを試験的に作りました。

手順

  • 仮想環境名:venv(venv)
  • プロジェクト名:line_bot、app名:line_bot_aiでstartproject, startappした
  • line_botディレクトリ下のurls.pyを次のように変更した
from django.contrib import admin
from django.urls import include, path # 追加部分

urlpatterns = [
    path('line_bot_ai/', include('line_bot_ai.urls')), # 追加部分
    path('admin/', admin.site.urls),
]
  • line_bot_aiディレクトリ下のurls.pyを追加した
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='callback'),
]
  • views.pyで使うのでpip install django-environ line-bot-sdkをしておいた
  • LINE BOTの新しいチャネル(プロバイダー)を作る
  • LINE DeveloperのページのMessagingAPI設定タブをクリックし、一番下にあるチャネルアクセストークンをコピーしておく
  • プロジェクト直下に環境設定用のファイル.envを作成した
ACCESSTOKEN={取得したチャネルアクセストークン}
  • line_bot_aiディレクトリ下のviews.pyを追加した
from email.mime import image
from django.shortcuts import render
from django.http import HttpResponse
import json
from django.views.decorators.csrf import csrf_exempt

from linebot import LineBotApi
from linebot.models import ImageSendMessage
from linebot.exceptions import LineBotApiError

import environ

env = environ.Env()

ACCESSTOKEN = env("ACCESSTOKEN")

line_bot_api = LineBotApi(ACCESSTOKEN)

@csrf_exempt
def index(request):
    if request.method == 'POST':
        request = json.loads(request.body.decode('utf-8'))
        data = request['events'][0]
        message = data['message']['text']
        reply_token = data['replyToken']
        if message == '正解':
            res_image = ImageSendMessage(original_content_url=r"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTGwjQL1IJHjHO4p3Z16VSdNsVRzrTvIcbNW4FVLJgnoe7ZiACh&s", preview_image_url=r"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTGwjQL1IJHjHO4p3Z16VSdNsVRzrTvIcbNW4FVLJgnoe7ZiACh&s")
        else:
            res_image = ImageSendMessage(original_content_url=r"https://2.bp.blogspot.com/-b8RGYZ3IXX4/Vf-aJng1qzI/AAAAAAAAyDo/pTdU_3xTK0w/s400/dame_man.png", preview_image_url=r"https://2.bp.blogspot.com/-b8RGYZ3IXX4/Vf-aJng1qzI/AAAAAAAAyDo/pTdU_3xTK0w/s400/dame_man.png")

        try:
            line_bot_api.reply_message(reply_token, res_image)
            # print(message)
            # print(res_image)
        except LineBotApiError as e:
            print(e)

        return HttpResponse("ok")

なおエンドポイントやapiの叩き方、jsonのデータ型等は公式のドキュメントに丁寧に書かれている。