Djangoで画像を返すLINE BOTを作成した
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のデータ型等は公式のドキュメントに丁寧に書かれている。