Линейный бот, который проверяет, содержит ли сообщение интернет-слухи.
Это один из подпроектов 真的假的.
Эта диаграмма состояний описывает, как бот LINE общается с пользователями:
Для разработки бота-линии слухов вам необходимо выполнить следующие настройки.
После клонирования этого репозитория и перехода в каталог проекта установите зависимости.
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
Пожалуйста, следуйте всем шагам официального руководства LINE.
Создайте файл .env
из шаблона .env.sample
, как минимум заполните:
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
: идентификатор Диспетчера тегов Google. Информацию о событиях и переменных, которые мы передаем в dataLayer
, см. в разделе «Диспетчер тегов Google» ниже.DEBUG_LIFF
: отключает проверку внешнего браузера в LIFF. Полезно при отладке LIFF во внешнем браузере. Не включайте это в производстве.RUMORS_LINE_BOT_URL
: общедоступный URL-адрес сервера, который используется для создания URL-адресов обучающих изображений и URL-адреса обратного вызова для аутентификации LINE Notify. Для продолжения вам понадобится Node.JS
16+.
$ npm i
Разверните периферийные устройства, такие как Redis и MongoDB, используя:
$ docker-compose up -d
Затем запустите приложение, включая сервер чат-бота и сервер webpack-dev для LIFF, используя:
$ npm run dev
Сервер будет запущен на localhost:5001
(или PORT
указанном вами в файле .env
).
Если вы хотите остановить периферийные устройства, запустите docker-compose stop
.
Просто запустите npm test
. Он автоматически запустит вышеупомянутый докер и запустит модульные тесты.
Мы рекомендуем использовать ngrok
для создания общедоступного адреса, который направляет трафик с сервера LINE на ваш локальный компьютер. Когда ngrok
на твоем пути, просто
$ ngrok http 5001
ngrok
предоставит вам общедоступный URL-адрес. Используйте это, чтобы установить URL-адрес веб-перехватчика вашего канала (см. раздел «Консоль канала» в официальном руководстве LINE).
Мы рекомендуем использовать файл конфигурации ngrok для настройки туннеля с фиксированным subdomain
. Таким образом, общедоступный URL-адрес можно зафиксировать (что означает отсутствие повторного копирования в настройки канала LINE!), пока subdomain
не занят другими.
В консоли разработчиков LINE на канале Message API в разделе Messaging API > Настройки веб-перехватчика установите для URL-адреса веб-перехватчика значение ${ngrok_url}/callback
и включите параметр Использовать веб-перехватчик . Нажмите «Подтвердить», чтобы подтвердить, что он успешно подключен к вашему локальному компьютеру.
Мы используем LIFF для сбора причин, по которым пользователь отправляет статью и отрицательные отзывы.
Если вам не нужно разрабатывать LIFF, вы можете напрямую использовать LIFF_URL
указанный в .env.sample
, который ссылается на промежуточный сайт LIFF.
Если вы хотите изменить LIFF, вам может потребоваться выполнить следующие действия:
Чтобы создать приложения LIFF, следуйте инструкциям в официальном документе, который включает в себя
chat_message.write
(чтобы LIFF мог отправлять сообщения). После получения URL-адреса LIFF поместите его в .env
как LIFF_URL
.Endpoint URL
, чтобы он начинался с конечной точки вашего бота, и добавьте /liff/index.html
в качестве постфикса. Для разработки LIFF после npm run dev
он доступен в /liff/index.html
сервера разработки (http://localhost:5001) или производственного сервера чат-бота.
В режиме разработки он запускает сервер webpack-dev-server на localhost:<LIFF_DEV_PORT>
(по умолчанию 8080
), а /liff
сервера чат-бота передает все запросы на сервер webpack-dev-server.
Совет по разработке LIFF в браузере:
https://<your-dev-chatbot.ngrok.io>/liff/index.html?p=<page>&...
в браузере настольного компьютера.liff.logout()
вручную в консоли JS, чтобы вызвать повторный вход. liff.init()
по-прежнему будет работать в браузере настольного компьютера, поэтому приложение будет отображаться, что позволит нам отлаживать веб-макеты на настольном компьютере. Однако liff.sendMessages()
не сработает. liff.closeWindow()
также не будет работать, если окно вашего браузера прошло через перенаправление входа в систему.
Сервер бота LINE запускает сервер GraphQL, который объединяет API Cofacts GraphQL и API, специфичные для чат-бота LINE.
При каждом обновлении API Cofacts используйте npm run cofactsapi
чтобы получить последнюю версию схемы API Cofacts.
Во время разработки используйте следующую команду, чтобы запустить сборник рассказов на локальном компьютере:
npm run storybook # Then visit http://localhost:6006
Вы также можете посетить https://cofacts.github.io/rumors-line-bot, чтобы получить готовый сборник рассказов в master
ветке.
При производстве файлы LIFF компилируются в каталог /liff
и обслуживаются сервером чат-бота как статические файлы.
Если вы получили 400 bad request
в LIFF, найдите вызов функции liff.init
в скомпилированном двоичном файле JS и посмотрите, соответствует ли идентификатор LIFF вашему URL-адресу LIFF, который должен быть путем без начала https://liff.line.me/
.
Идентификатор LIFF задается с помощью плагина Webpack Define во время сборки, поэтому замена переменной env URL-адреса LIFF без пересборки двоичных файлов LIFF приведет к 400 неверным запросам.
Мы используем ttag для поддержки i18n во время сборки чат-бота.
Пожалуйста, обратитесь к документации ttag для аннотирования строк для перевода.
Чтобы извлечь аннотированные строки в файлы перевода, используйте:
$ npm run i18n:extract
Файлы перевода расположены в папке i18n/
в формате Gettext PO.
en_US.po
: поскольку язык, используемый в коде, уже английский, этот пустой файл перевода существует для упрощения настроек.zh_TW.po
: Традиционный китайский перевод.ja.po
: японский перевод. Вы можете заменить его любым языком, который хотите поддерживать, используя команду Gettext msginit
.
Вам нужно будет изменить скрипты i18n:extract
и i18n:validate
в package.json
чтобы отразить изменение локали.
По умолчанию чат-бот будет создан с локалью en_US
.
В Heroku установите для LOCALE
один из en_US
, zh_TW
или любой другой код языка, который существует в каталоге i18n/
.
Если вместо этого вы хотите выполнить сборку с использованием Docker, вам может потребоваться изменить Dockerfile, включив в него нужный LOCALE
.
Предпосылки:
Чтобы использовать push-сообщение: в файле .env
установите NOTIFY_METHOD=PUSH_MESSAGE
Чтобы использовать LINE Notify:
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
слухи-лайн-бот использует облачные службы Google, которые аутентифицируются и авторизуются с использованием учетных записей служб Google Cloud и учетных данных приложения по умолчанию.
Создайте учетную запись службы в проекте, загрузите ее ключ и используйте переменную среды 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
для проверки типов; используйте npm run typegen
для генерации типа из схемы GraphQL.
Подготовьте файл .env
(который должен быть идентичен вашей среде развертывания) и запустите docker build .
для создания образа докера.
.env
будет скопирован в образ компоновщика для создания статического файла LIFF с env. При создании образа вы можете просто включить «переменные времени сборки» (обозначенные в .env.sample
) в .env
, чтобы гарантировать, что никакие учетные данные сервера не будут утечек в построенном клиентском коде.
Поскольку встроенные образы Docker кодируют общедоступные URL-адреса в статически созданные файлы, эти переменные времени сборки используются при запуске образа в качестве контейнера. Таким образом, для каждой отдельной среды развертывания потребуется отдельная сборка образа.
Вы можете протестировать построенный образ локально, используя docker-compose.yml
; просто раскомментируйте раздел линейного бота и укажите имя построенного изображения.
Для производства см. раздел слухи-развертывание образца docker-coompose.yml
который запускает такой образ.
Мы помещаем переменные и события в dataLayer
Диспетчера тегов Google, когда пользователь взаимодействует с LIFF.
Вы можете подготовить следующую настройку в файле .env
:
GTM_ID
: идентификатор контейнера Диспетчера тегов Google ( GTM-XXXXXXX
). Приложение будет запускать следующие пользовательские события в dataLayer
GTM:
dataLoaded
— когда данные загружаются в статью, комментарий или отзыв LIFF.routeChangeComplete
— когда LIFF загружается или меняет путь.feedbackVote
— когда пользователь отправляет отзыв.chooseArticle
— когда пользователь выбирает статью в Статьях LIFF. Кроме того, в dataLayer
будет отправлена следующая пользовательская переменная;
pagePath
— устанавливается при возникновении события routeChangeComplete
. Путь к странице от маршрутизатора LIFF.userId
— устанавливается после того, как LIFF получает токен идентификатора и декодирует идентификатор пользователя LINE внутри.articleId
и replyId
: устанавливаются в жизненном цикле статьи, комментария и отзыва onMount()
. Или когда запускается событие chooseArticle
.doc
— устанавливается при возникновении события dataLoaded
. Сам загруженный контент в объекте (статья в Article LIFF, комментарий в Comment LIFF и отзыв в Feedback LIFF). Формат отправленного события: Event category
/ Event action
/ Event label
Мы используем Message Source
измерения (Custom Dimemsion1) для классификации различных источников событий.
user
для сообщений 1 на 1room
| 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
также применяются./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 как присоединение, -1 как выход. Чтобы узнать общее количество групп, к которым в данный момент присоединился чат-бот, вы можете напрямую увидеть общее значение события (подробнее см. Неявное количество).
- Чтобы узнать, присоединился к группе или вышел из нее, вы должны найти последнее действие
Join
илиLeave
вClient Id
.- Кроме того, вам следует найти последнее действие
Join
дляClient Id
, чтобы получить более точноеGroup Members Count
.Group Members Count
записывается только тогда, когда чат-бот присоединился к группе. Чтобы узнать точное количество, вам следует получить его непосредственно из строки 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.