ngrok로 로컬에서 라인 챗봇 테스트 환경 구축하기

Madang Garden·2021년 12월 30일
0

안녕하세요.
이번 포스팅에서는 라인 챗봇의 로컬 테스트 환경 구축에 대한 내용을 써보려고 합니다.
같은 코드/브랜치지만 다른 서버만 필요할 경우에 사용할 수 있는 방법인데, 라인 챗봇과 heroku를 통해 예시를 들어보겠습니다.

큰 흐름은 다음과 같습니다.
1. ngrok 설치, dotenv 설치
2. 라인 개발자콘솔에서 본방용 챗봇, 테스트용 챗봇을 각각 생성해 토큰 발급
3. heroku 등의 배포 플랫폼에서 환경변수 등록
4. 코드 수정
5. 실행

1. ngrok, dotenv 설치

아래 링크에서 ngrok를 다운받아 설치합니다.
ngrok 설치

dotenv도 설치합니다.

$ pip install python-dotenv

2. 챗봇 생성 및 토큰 발급

라인 챗봇의 생성에 대한 자세한 설명은 생략하도록 하겠습니다. 신청 및 심사가 필요한 카카오톡과 다르게 회원가입만으로 간단하게 봇 생성이 가능하니 자세한 것은 공식문서를 참고해주세요.

heroku의 콜백 url을 등록할 본방용 챗봇과, ngrok의 로컬 콜백 url을 등록할 테스트용 챗봇 두 개를 생성합니다. 라인에서는 이 봇들을 "채널"이라고 부릅니다.

각 채널 생성 후, 아래 내용을 기록해주세요.

  • 액세스 토큰
  • 채널 시크릿키

3. heroku에서의 환경변수 등록

기록 해두었던 토큰 중, 본방용 채널의 토큰을 heroku에 등록합니다.
앱의 설정에서 쉽게 등록이 가능합니다.

4. 코드 수정

먼저 루트 폴더에 .env 파일을 작성합니다.


// .env

# LINE ACCOUNT INFO
LINE_CHANNEL_ACCESS_TOKEN = YOUR_CHANNEL_ACCESS_TOKEN
LINE_CHANNEL_SECRET = YOUR_CHANNEL_SECRET

# ngrok용 포트번호 설정
PORT=9000

다음은 라인챗봇의 app.py 코드를 수정합니다.
코드의 예시는 공식 깃허브 리포지토리에서 가져왔습니다.


# app.py

import os # 여기 추가 
from dotenv import load_dotenv # 여기 추가
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

# .env에서 읽어들이기
# heroku에서는 자동으로 heroku에 등록되어있는 환경변수를 읽어들입니다.
load_dotenv()

channel_access_token = os.getenv("LINE_CHANNEL_ACCESS_TOKEN")
channel_secret = os.getenv("LINE_CHANNEL_SECRET")

app = Flask(__name__)

line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

## 여기 수정
if __name__ == "__main__":
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)

5. 실행

준비가 완료되었다면, 다음과 같은 순서로 실행합니다.
1. app.py를 실행합니다
2. 다음 커맨드로 ngrok를 실행합니다.

$ ngrok http 9000
  1. ngrok를 실행하면, 터미널에 다음과 같은 화면을 확인할 수 있습니다.

여기서 Forwarding이라고 적힌 url을 복사하고, 라인 개발자콘솔에서 테스트용 챗봇의 콜백 url에 등록합니다. 콜백 url이므로 url뒤에 /callback을 붙여야합니다.

https://veryLongYourNgrokURL.ngrok.io/callback

주의점

  • ngrok는 2시간의 시간 제한이 있습니다. 로그인을 하면 시간제한은 사라진다고 합니다.
  • ngrok는 실행시킬 때 마다 url이 변경되므로, 테스트용 챗봇의 url도 변경해줘야합니다.(본방용 채널과 heroku는 상관없습니다.)
profile
삽질 스페셜리스트, 프로 사부작러

0개의 댓글