안녕하세요.
이번 포스팅에서는 라인 챗봇의 로컬 테스트 환경 구축에 대한 내용을 써보려고 합니다.
같은 코드/브랜치지만 다른 서버만 필요할 경우에 사용할 수 있는 방법인데, 라인 챗봇과 heroku를 통해 예시를 들어보겠습니다.
큰 흐름은 다음과 같습니다.
1. ngrok 설치, dotenv 설치
2. 라인 개발자콘솔에서 본방용 챗봇, 테스트용 챗봇을 각각 생성해 토큰 발급
3. heroku 등의 배포 플랫폼에서 환경변수 등록
4. 코드 수정
5. 실행
아래 링크에서 ngrok를 다운받아 설치합니다.
ngrok 설치
dotenv도 설치합니다.
$ pip install python-dotenv
라인 챗봇의 생성에 대한 자세한 설명은 생략하도록 하겠습니다. 신청 및 심사가 필요한 카카오톡과 다르게 회원가입만으로 간단하게 봇 생성이 가능하니 자세한 것은 공식문서를 참고해주세요.
heroku의 콜백 url을 등록할 본방용 챗봇과, ngrok의 로컬 콜백 url을 등록할 테스트용 챗봇 두 개를 생성합니다. 라인에서는 이 봇들을 "채널"이라고 부릅니다.
각 채널 생성 후, 아래 내용을 기록해주세요.
기록 해두었던 토큰 중, 본방용 채널의 토큰을 heroku에 등록합니다.
앱의 설정에서 쉽게 등록이 가능합니다.
먼저 루트 폴더에 .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)
준비가 완료되었다면, 다음과 같은 순서로 실행합니다.
1. app.py를 실행합니다
2. 다음 커맨드로 ngrok를 실행합니다.
$ ngrok http 9000
여기서 Forwarding이라고 적힌 url을 복사하고, 라인 개발자콘솔에서 테스트용 챗봇의 콜백 url에 등록합니다. 콜백 url이므로 url뒤에 /callback을 붙여야합니다.