메시지에 인터넷 루머가 포함되어 있는지 확인하는 라인 봇입니다.
이것은 真的假的의 하위 프로젝트 중 하나입니다.
이 상태 다이어그램은 LINE 봇이 사용자와 대화하는 방법을 설명합니다.
Rurums-line-bot을 개발하려면 다음 설정을 완료해야 합니다.
이 저장소와 CD를 프로젝트 디렉터리에 복제한 후 종속성을 설치합니다.
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
LINE 공식 튜토리얼의 모든 단계를 따르세요.
.env.sample
템플릿에서 .env
파일을 생성하고 최소한 다음을 입력하세요.
API_URL=https://dev-api.cofacts.tw/graphql
LINE_CHANNEL_SECRET=<paste Messaging API's channel secret here>
LINE_CHANNEL_TOKEN=<paste Messaging API's channel access token here>
LINE_LOGIN_CHANNEL_ID=<paste LINE Login channel ID here>
LIFF_URL=<paste LIFF app's LiFF URL>
기타 사용자 정의 가능한 환경 변수는 다음과 같습니다.
REDIS_URL
: 지정하지 않으면 redis://127.0.0.1:6379
사용됩니다.PORT
: 라인 봇 서버가 수신 대기할 포트입니다.GTM_ID
: 구글 태그 관리자 ID. dataLayer
에 푸시하는 이벤트 및 변수에 대해서는 아래의 'Google 태그 관리자' 섹션을 참조하세요.DEBUG_LIFF
: LIFF에서 외부 브라우저 확인을 비활성화합니다. 외부 브라우저에서 LIFF를 디버깅할 때 유용합니다. 프로덕션에서는 이 기능을 활성화하지 마세요.RUMORS_LINE_BOT_URL
: 튜토리얼 이미지 URL과 LINE Notify의 인증 콜백 URL을 생성하는 데 사용되는 서버 공개 URL입니다. 계속하려면 Node.JS
16 이상이 필요합니다.
$ npm i
다음을 사용하여 Redis 및 MongoDB와 같은 주변 장치를 가동합니다.
$ docker-compose up -d
그런 다음 다음을 사용하여 LIFF용 챗봇 서버 및 webpack-dev-server를 포함한 애플리케이션을 가동합니다.
$ npm run dev
서버는 localhost:5001
(또는 .env
파일에 지정한 PORT
)에서 시작됩니다.
주변 장치를 중지하려면 docker-compose stop
실행하세요.
npm test
실행하세요. 앞서 언급한 도커를 자동으로 실행하고 단위 테스트를 실행합니다.
ngrok
사용하여 LINE 서버에서 로컬 컴퓨터로 트래픽을 전달하는 공개 주소를 만드는 것이 좋습니다. 당신의 길에 ngrok
있으면, 그냥
$ ngrok http 5001
ngrok
공개 URL을 제공합니다. 이를 사용하여 채널의 웹훅 URL을 설정합니다(LINE 공식 튜토리얼의 '채널 콘솔' 섹션 참조).
고정된 subdomain
이 있는 터널을 설정하려면 ngrok 구성 파일을 사용하는 것이 좋습니다. 이러한 방식으로 subdomain
다른 사람이 사용하지 않는 한 공개 URL을 수정할 수 있습니다(LINE 채널 설정에 반복적으로 복사하여 붙여넣을 필요가 없음을 의미합니다!).
LINE 개발자 콘솔 내 Message API 채널의 Messaging API > Webhook 설정에서 Webhook URL을 ${ngrok_url}/callback
으로 설정하고 Use webhook 을 켭니다. 확인을 클릭하여 로컬 컴퓨터에 성공적으로 연결되었는지 확인하세요.
우리는 기사 및 부정적인 피드백을 제출할 때 사용자의 이유를 수집하기 위해 LIFF를 사용하고 있습니다.
LIFF를 개발할 필요가 없다면 스테이징 LIFF 사이트로 연결되는 .env.sample
에 제공되는 LIFF_URL
직접 사용할 수 있습니다.
LIFF를 수정하려면 다음 단계를 따라야 할 수도 있습니다.
LIFF 앱을 만들려면 공식 문서의 지침을 따르세요.
chat_message.write
선택합니다(LIFF가 메시지를 보내려면). LIFF URL을 획득한 후 .env
에 LIFF_URL
로 배치합니다.Endpoint URL
설정하고 /liff/index.html
접미사로 추가합니다. LIFF를 개발하려면 npm run dev
후 개발 서버(http://localhost:5001) 또는 프로덕션 챗봇 서버의 /liff/index.html
에서 액세스할 수 있습니다.
개발 모드에서는 localhost:<LIFF_DEV_PORT>
(기본값은 8080
)에서 webpack-dev-server를 회전시키고, 챗봇 서버의 /liff
모든 요청을 webpack-dev-server로 프록시합니다.
브라우저에서 LIFF를 개발하는 팁은 다음과 같습니다.
https://<your-dev-chatbot.ngrok.io>/liff/index.html?p=<page>&...
방문하세요.liff.logout()
입력해야 합니다. liff.init()
데스크톱 브라우저에서 계속 작동하므로 앱이 렌더링되어 데스크톱에서 웹 레이아웃을 디버깅할 수 있습니다. 그러나 liff.sendMessages()
작동하지 않습니다. liff.closeWindow()
브라우저 창이 로그인 리디렉션을 거친 경우에도 작동하지 않습니다.
LINE 봇 서버는 Cofacts GraphQL API와 LINE 챗봇 전용 API를 연결하는 GraphQL 서버를 시작합니다.
Cofacts API가 업데이트될 때마다 npm run cofactsapi
사용하여 최신 Cofacts API 스키마를 가져옵니다.
개발 중에 다음 명령을 사용하여 로컬 머신에서 스토리북을 시작하세요.
npm run storybook # Then visit http://localhost:6006
master
브랜치에 사전 구축된 스토리북을 보려면 https://cofacts.github.io/rumors-line-bot을 방문할 수도 있습니다.
프로덕션에서 LIFF 파일은 /liff
디렉터리로 컴파일되고 챗봇 서버에 의해 정적 파일로 제공됩니다.
LIFF에서 400 bad request
받은 경우 컴파일된 JS 바이너리에서 liff.init
함수 호출을 검색하고 LIFF ID가 https://liff.line.me/
로 시작하지 않는 경로여야 하는 LIFF URL과 일치하는지 확인하세요. .
LIFF ID는 빌드 중에 Webpack Define 플러그인을 사용하여 설정되므로 LIFF 바이너리를 다시 빌드하지 않고 LIFF URL env 변수를 교체하면 400 잘못된 요청이 발생합니다.
우리는 ttag를 사용하여 챗봇의 빌드 타임 i18n을 지원합니다.
번역할 문자열에 주석을 추가하려면 ttag 문서를 참조하세요.
주석이 달린 문자열을 번역 파일로 추출하려면 다음을 사용하세요.
$ npm run i18n:extract
번역 파일은 Gettext PO 형식으로 i18n/
아래에 있습니다.
en_US.po
: 코드에 사용된 언어가 이미 영어이기 때문에 설정을 단순화하기 위해 이 빈 번역 파일이 존재합니다.zh_TW.po
: 중국어 번체 번역.ja.po
: 일본어 번역. Gettext msginit
명령을 활용하여 이를 지원하려는 언어로 바꿀 수 있습니다.
로캘 변경 사항을 반영하려면 package.json
에서 i18n:extract
및 i18n:validate
스크립트를 변경해야 합니다.
기본적으로 챗봇은 en_US
로케일로 구축됩니다.
Heroku에서는 LOCALE
en_US
, zh_TW
또는 i18n/
디렉터리에 있는 다른 언어 코드 중 하나로 설정하세요.
대신 docker를 사용하여 빌드하려면 원하는 LOCALE
포함하도록 Dockerfile을 수정해야 할 수도 있습니다.
전제 조건:
푸시 메시지를 사용하려면 : .env
파일에 NOTIFY_METHOD=PUSH_MESSAGE
설정합니다.
LINE 알림을 사용하려면:
Callback Url
설정합니다: RUMORS_LINE_BOT_URL
/authcallback/line_notify.env
파일에서 설정 LINE_NOTIFY_CLIENT_ID=<paste LINE Notify Client ID here>
LINE_NOTIFY_CLIENT_SECRET=<paste LINE Notify Client Secret here>
NOTIFY_METHOD=LINE_NOTIFY
RUMORS_LINE_BOT_URL=<line bot server url>
LINE_FRIEND_URL=https://line.me/R/ti/p/<paste your chatbot ID here>
계정 관리자 -> 리치 메뉴에서 설정 페이지 진입점( LIFF_URL
?p=setting)을 설정할 수 있습니다.
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
rumors-line-bot은 Google Cloud 서비스 계정 및 애플리케이션 기본 자격 증명을 사용하여 인증 및 승인된 Google 클라우드 서비스를 사용합니다.
프로젝트 아래에 서비스 계정을 만들고 해당 키를 다운로드한 후 GOOGLE_APPLICATION_CREDENTIALS
환경 변수를 사용하여 다운로드한 서비스 계정 키의 경로를 제공하세요. 자세한 내용은 설명서를 참조하세요.
우리는 Dialogflow를 사용하여 사용자가 잡담을 시도하는지 감지합니다. 사용자 입력이 Dialogflow 인텐트와 일치하면 해당 인텐트에 사전 정의된 응답을 직접 반환할 수 있습니다.
Dialogflow를 사용하려면 다음 설정을 수행하세요.
dialogflow.sessions.detectIntent
권한이 있는지 확인하세요.DAILOGFLOW_LANGUAGE
: 에이전트의 기본 언어가 비어 있거나 언어를 지정할 수 있습니다.DAILOGFLOW_ENV
: 초안 에이전트가 기본값이거나 다른 버전을 생성할 수 있습니다. Message Source
에 대한 사용자 정의(사용자 범위) 차원과 Group Members Count
에 대한 사용자 정의(히트 범위) 측정항목을 만듭니다. 둘 다 기본 인덱스는 1입니다. 생성된 GA 인덱스가 1이 아닌 경우 코드에서 cd1
및 cm1
찾아 각각 cd$theIndexGACreated
및 cm$theIndexGACreated
로 변경합니다.
유형을 확인하려면 npm run typecheck
사용하세요. GraphQL 스키마에서 유형을 생성하려면 npm run typegen
사용하세요.
.env
파일(배포 환경과 동일해야 함)을 준비하고 docker build .
도커 이미지를 생성합니다.
.env
빌더 이미지에 복사되어 env와 함께 LIFF 정적 파일을 생성합니다. 이미지를 빌드할 때 .env
에 "빌드 시간 변수"( .env.sample
로 표시됨)를 포함하면 빌드된 클라이언트 코드에서 서버 자격 증명이 유출되지 않도록 할 수 있습니다.
빌드된 도커 이미지는 공개 URL을 정적으로 빌드된 파일로 인코딩하므로 이미지를 컨테이너로 실행할 때 이러한 빌드 시간 변수가 사용됩니다. 따라서 각각의 별도 배포 환경에는 별도의 이미지 빌드가 필요합니다.
docker-compose.yml
사용하여 빌드된 이미지를 로컬에서 테스트할 수 있습니다. 라인 봇 섹션의 주석 처리를 해제하고 빌드된 이미지 이름을 제공하기만 하면 됩니다.
제작을 위해서는 해당 이미지를 실행하는 샘플 docker-coompose.yml
에 대한 Rumors-deploy를 참조하세요.
사용자가 LIFF와 상호작용할 때 Google 태그 관리자의 dataLayer
에 변수와 이벤트를 푸시합니다.
.env
파일에서 다음 설정을 준비할 수 있습니다.
GTM_ID
: Google 태그 관리자 컨테이너 ID( GTM-XXXXXXX
) 애플리케이션은 GTM dataLayer
에서 다음과 같은 맞춤 이벤트를 실행합니다.
dataLoaded
- 기사, 댓글 또는 피드백 LIFF에 데이터가 로드될 때.routeChangeComplete
- LIFF가 로드되거나 경로가 변경될 때.feedbackVote
- 사용자가 피드백을 제출하는 경우.chooseArticle
- 사용자가 기사 LIFF에서 기사를 선택할 때. 또한 다음 맞춤 변수를 dataLayer
에 푸시합니다.
pagePath
- routeChangeComplete
이벤트가 실행될 때 설정됩니다. LIFF 라우터의 페이지 경로입니다.userId
- LIFF가 ID 토큰을 가져오고 내부의 LINE 사용자 ID를 디코딩한 후에 설정됩니다.articleId
및 replyId
: Article에 설정되고 Comment 및 Feedback onMount()
수명 주기가 호출됩니다. 또는 chooseArticle
이벤트가 시작될 때.doc
- dataLoaded
이벤트가 실행될 때 설정됩니다. 개체에 로드된 콘텐츠 자체(Article LIFF의 기사, Comment LIFF의 댓글, Feedback LIFF의 피드백)입니다. 전송되는 이벤트 형식: Event category
/ Event action
/ Event label
Message Source
차원(Custom Dimemsion1)을 사용하여 다양한 이벤트 소스를 분류합니다.
user
room
| 그룹 메시지용 group
UserInput
/ MessageType
/ <text | image | video | ...>
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
UserInput
/ ArticleSearch
/ ArticleNotFound
UserInput
/ ArticleSearch
/ ArticleFoundButNoHit
UserInput
/ IsForwarded
/ Yes
| No
UserInput
/ IsCooccurrence
/ Yes
| No
UserInput
/ ChatWithBot
/ <intent name>
Article
/ Selected
/ <selected article id>
Reply
/ Search
/ <reply id>
Article
/ NoReply
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
Reply
/ Type
/ <selected reply's type>
UserInput
/ Feedback-Vote
/ <articleId>/<replyId>
/feedback/yes
또는 /feedback/no
페이지에 대한 페이지 보기도 전송됩니다.Article
/ Create
/ Yes
Article
/ Create
/ No
Article
/ ProvidingReason
/ <articleId>
/reason
에 대한 페이지뷰도 전송됩니다./articles
에 대한 페이지 조회가 전송됩니다.utm_source=rumors-line-bot&utm_medium=richmenu
utm_source=rumors-line-bot&utm_medium=push
LIFF
/ ChooseArticle
/ <articleId>
utm_source
, utm_medium
과 같은 URL 매개변수도 적용됩니다./setting
에 대한 페이지뷰가 전송됩니다.utm_source=rumors-line-bot&utm_medium=reply-request
&utm_source=rumors-line-bot&utm_medium=tutorial
Tutorial
/ Step
/ ON_BOARDING
Tutorial
/ Step
/ RICH_MENU
Tutorial
/ Step
/ <TUTORIAL_STEPS>
Group
/ Join
/ 1
( Event category
/ Event action
/ Event value
)Group Members Count
(사용자 정의 측정항목1)입니다.Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)메모:
- ga 이벤트 값 1을 Join으로, -1을 Leave로 설정했습니다. 현재 참여 중인 챗봇의 총 그룹 수를 확인하려면 총 이벤트 값을 직접 확인할 수 있습니다(자세한 내용은 암시적 수 참조).
- 그룹이 현재 가입 또는 탈퇴되었는지 확인하려면
Client Id
의 마지막Join
또는Leave
조치를 찾아야 합니다.- 또한 보다 정확한
Group Members Count
얻으려면Client Id
의 마지막Join
작업을 찾아야 합니다.Group Members Count
챗봇이 그룹에 가입한 경우에만 기록됩니다. 정확한 수를 알고 싶다면 line message-api에서 직접 가져와야 합니다.
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
Article
/ Selected
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
UserInput
/ Intro
/ContentProxy
/ Forward
/ <content type>
/ <content length>
(값) LICENSE
이 저장소의 소스 코드에 대한 라이센스 계약을 정의합니다.
LEGAL.md
는 Cofacts 웹사이트 사용자를 위한 사용자 계약입니다.