Django에서 line bot로 뭔가를 반환 할 때까지!

장고로 line bot 만들기!



우선 line developers 계정을 얻기 위해 line 계정으로 로그인


왼쪽 상단의 콘솔 홈에서 새 공급자를 만듭니다

그런 다음 provider에서 create new channel을 선택하고 channel type은 messaging API

그 후는 각각의 설정을 한다. 여기까지 하면 qr코드로 자신이 만드는 line bot을 등록할 수 있게 된다.


이번에는 이 미팅 예약을 누르면 사용자가 예약과 자동으로 보내도록 하고 그에 대해 뭔가를 돌려주고 싶습니다.

우선 여기에 로그인하여 방금 만든 계정을 선택
htps //w w. 네이비…
왼쪽 메뉴에서 리치 메뉴 선택 오른쪽 상단 만들기 버튼을 클릭

표시 설정은 제목 이외는 기본적으로 OK


그 아래의 콘텐츠 설정은 템플릿을 선택하여 이미지를 붙이거나 직접 문자가있는 이미지를 만듭니다.
만들면 액션에서 유형을 텍스트로 예약합니다.
저장하고 실제로 만든 메뉴를 자신의 스마트 폰으로 탭하면 예약이라는 메시지가 전송된다고 생각합니다.

장고를 사용하여 메시지를 반환



여기까지 가면 다음은 장고에서 보낸 예약 메시지에 대해 뭔가를 반환하고 싶습니다.

이번에는 파이썬 버전 패키지 관리 시스템 인 anaconda를 사용하여 django를 install합니다.
htps //w w. 아나 콘다. 코 m / p 로즈 cts / ぢゔ
넣지 않은 사람은 ↑의 최상이므로 다운로드하십시오.

아나콘다가 들어오면 아나콘다 네비게이터를 시작하고
Environments 선택
왼쪽 하단의 create 선택
이름을 django37 등으로 파이썬을 선택하고 version은 3.7을 선택
오른쪽 하단의 create를 선택해 환경 구축이 완료
이 상태에서는 아직 장고가 들어 있지 않기 때문에 터미널을 열고
$ conda activate django37

에서 환경을 시작
그 후
$ conda install django37

에서 장고를 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를 편집합니다.

urls.py
"""reception_line_bot URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
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
import bot.views
urlpatterns = [
    path('admin/', admin.site.urls),

]

이런 식으로 생각하지만 urlpatterns에서 django가받은 line bot 요청을 어떤 파일의 어떤 함수로 보낼지 지정합니다.

그래서 이번에는

urls.py
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을 만들고,

공급자에서 채널을 선택하고 messaging API의 맨 처음에 액세스 토큰을 발행하고 복사합니다.
다음

messaging API 옆의 기본 설정에서 채널 비밀번호를 가져옵니다.
그 두 가지를 방금 만든 setting.json에 복사합니다.

setting.json
{

"LINE":{

"channel_secret":"fakfkajpdpaida132941",

"access_token":"a3nm7yOY7IoUt8blZ6QqK6RShadfsajdjfadfljfafdsdjsdfailfajjpqjpoejpqjpfjpqejiepqwifqpjdjidcS9yEBGieq+VMQs0EL+mQDtwdB04daft89/aad1O/w1cDnyilFU="

 }

}

이런 식으로 (channel_secret과 access_token은 적절하게 바뀌 었습니다)
그런 다음 views.py를 열고 사용자가 보낸 메시지에 대해 뭔가 보내는 코드를 작성합니다.

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)
    request_body = request.body
    body = request.body.decode('utf-8')
    print(body)
    reply_token = data["events"][0]["replyToken"]
    reply_message(reply_token,access)
    return JsonResponse({"message":"OK"})

def confirm_json_loads(body:str)->dict:
    """
    json_loadsが動いているのかの確認

    Args:
        body str:
            requestのjson文字列

    Return:
        dict:
            Seccess:json.loads(body)の返り値
            Error:ログイン失敗のメッセージ


    """
    try:
        return json.loads(body)
    except Exception as e:
        print("error")
        message = JsonResponse({'message': 'Login failure.'}, status=403)
        return message

def reply_message(token:str,access)->None:
    return False
    """
    ユーザーに返答メッセージを送ります

    Args:
        token str:
            lineトークン

        message str:
            select_message関数で返されたメッセージ

        user_id str:
            メッセージ送信者のlineユーザid

    """

    url = 'https://api.line.me/v2/bot/message/reply'
    print(url)
    data = {
        'replyToken': token,
        'messages':[
            {
                'type': 'text',
                'text': "hello world"
            },
        ]
    }
    print(f"data{data}")
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer'+" "+access
    }
    print(f"headers:{headers}")
    req = urllib.request.Request(url, json.dumps(data).encode(), headers)
    print(req)
    with urllib.request.urlopen(req) as res:
        body = res.read()


이것으로 완성입니다.

좋은 웹페이지 즐겨찾기