Bot de línea que verifica si un mensaje contiene rumores de Internet.
Este es uno de los subyectores de 真的假的。
Este diagrama de estado describe cómo el bot de línea habla con los usuarios:
El desarrollo de rumores-bots de línea requiere que termine la siguiente configuración.
Después de clonar este repositorio y CD en el directorio de proyectos, luego instale las dependencias.
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
Siga todos los pasos en línea Tutorial oficial.
Crear archivo .env
desde la plantilla .env.sample
, al menos complete:
API_URL=https://dev-api.cofacts.tw/graphql
LINE_CHANNEL_SECRET=
LINE_CHANNEL_TOKEN=
LINE_LOGIN_CHANNEL_ID=
LIFF_URL=
Otros Vars ENV personalizables son:
REDIS_URL
: si no se da, se usa redis://127.0.0.1:6379
.PORT
: en qué puerto escuchará el servidor de botes de línea.GTM_ID
: ID de Google Tag Manager. Para los eventos y variables que empujamos a dataLayer
, consulte la sección "Google Tag Manager" a continuación.DEBUG_LIFF
: deshabilita la verificación del navegador externo en LIFF. Útil al depurar LIFF en el navegador externo. No habilite esto en la producción.RUMORS_LINE_BOT_URL
: URL pública del servidor que se utiliza para generar URL de imagen tutoriales y una URL de devolución de llamada de autenticación de Line Notify. Necesitará Node.JS
16+ para proceder.
$ npm i
Gire periféricos como Redis y MongoDB usando:
$ docker-compose up -d
Luego gire la aplicación, incluido el servidor de chatbot y webpack-dev-server para LIFF, usando:
$ npm run dev
El servidor se iniciará en localhost:5001
(o el PORT
que especificó en su archivo .env
).
Si desea detener los periféricos, ejecute docker-compose stop
.
Simplemente ejecute npm test
. Girará automáticamente el Docker mencionado anteriormente y ejecutará pruebas unitarias.
Recomendamos usar ngrok
para crear una dirección pública que dirige el tráfico desde el servidor de línea a su máquina local. Con ngrok
en tu camino, solo
$ ngrok http 5001
ngrok
le dará una URL pública. Use esto para establecer la URL webhook de su canal (consulte la sección "Consola del canal" Tutorial oficial en línea).
Recomendamos usar el archivo de configuración NGROK para configurar un túnel con un subdomain
fijo. De esta manera, la URL pública se puede solucionar (¡no significa que no se ajuste la configuración del canal de línea repetitivo!) Mientras el subdomain
no esté ocupado por otros.
Consola de desarrolladores de línea interna en el canal API de su mensaje, en la configuración de la API de mensajería> Webhook Establecer la URL de Webhook en ${ngrok_url}/callback
y activar el uso de Webhook . Haga clic en Verificar para confirmar que está conectado correctamente a su máquina local.
Estamos utilizando LIFF para recopilar la razón del usuario al enviar artículos y comentarios negativos.
Si no necesita desarrollar LIFF, puede usar directamente LIFF_URL
proporcionado en .env.sample
, que vincula al sitio LIFF.
Si desea modificar LIFF, es posible que deba seguir estos pasos:
Para crear aplicaciones LIFF, siga las instrucciones en el documento oficial, que involucra
chat_message.write
in en alcance (para que LIFF envíe mensajes) Después de adquirir URL de LIFF, colóquelo en .env
como LIFF_URL
.Endpoint URL
para comenzar con su punto final Chabbot y agregar /liff/index.html
como Postfix. Para desarrollar LIFF, después de npm run dev
, se puede acceder en /liff/index.html
del servidor Dev (http: // localhost: 5001) o el servidor de chatbot de producción.
En el modo de desarrollo, gira un servidor webpack-devero en localhost:
(predeterminado al 8080
) y /liff
de los proxies del servidor ChatBot todas las solicitudes para el webpack-dev-server.
Un consejo para desarrollar LIFF en el navegador es:
https:///liff/index.html?p=&...
en el navegador de escritorio.liff.logout()
manualmente en la consola JS para activar un re-login. liff.init()
todavía funcionaría en el navegador de escritorio, de modo que la aplicación se presenta, lo que nos permite depurar los diseños web en el escritorio. Sin embargo, liff.sendMessages()
no funcionaría. liff.closeWindow()
tampoco funcionará si la ventana de su navegador ha pasado por redireccionamientos de inicio de sesión.
El servidor de bots de línea inicia un servidor GraphQL que estimula la API GraphQL de cofacts y la API específica de la línea de chatbot.
Cada vez que COFACTS API se actualiza, use npm run cofactsapi
para obtener el último esquema API de CoFacts.
Durante el desarrollo, use el siguiente comando para iniciar un libro de cuentos en su máquina local:
npm run storybook # Then visit http://localhost:6006
También puede visitar https://cofacts.github.io/rumors-line-bot para el libro de cuentos preconstruido en master
Branch.
En la producción, los archivos LIFF se compilan en /liff
Directory y sirven como archivos estáticos por el servidor ChatBot.
Si recibe 400 bad request
en LIFF, busque liff.init
Función Llame en Binary compilado y vea si LIFF ID es consistente con su URL LIFF, que debería ser la ruta sin liderar https://liff.line.me/
.
La ID de LIFF se establece utilizando el complemento WebPack Definir durante la compilación, por lo tanto, intercambiar la variable de URL LIFF sin reconstruir los binarios de LIFF causará 400 malas solicitudes.
Usamos TTAG para admitir el tiempo de compilación I18N para el chatbot.
Consulte la documentación de TTAG para la anotación de cadenas para traducir.
Para extraer cadenas anotadas a archivos de traducción, use:
$ npm run i18n:extract
Los archivos de traducción se encuentran en i18n/
, en formato GetText PO.
en_US.po
: Dado que el idioma utilizado en el código ya es inglés, este archivo de traducción vacío existe para simplificar la configuración.zh_TW.po
: traducción tradicional de chino.ja.po
: traducción japonesa. Puede reemplazar esto con cualquier idioma que desee admitir, aprovechando el comando getText msginit
.
Tendrá que cambiar i18n:extract
e i18n:validate
script en package.json
para reflejar el cambio local.
Por defecto, el chatbot se construirá en en_US
locale.
En Heroku, configure LOCALE
en uno de en_US
, zh_TW
o cualquier otro código de idioma que exista en i18n/
Directorio.
Si desea construir usando Docker en su lugar, es posible que deba modificar DockerFile para incluir la LOCALE
deseada.
Prerrequisitos:
Para usar el mensaje PUSH: en el archivo .env
, establece NOTIFY_METHOD=PUSH_MESSAGE
Para usar la línea de notificación:
Callback Url
: RUMORS_LINE_BOT_URL
/authcallback /line_notify.env
, se establece LINE_NOTIFY_CLIENT_ID=
LINE_NOTIFY_CLIENT_SECRET=
NOTIFY_METHOD=LINE_NOTIFY
RUMORS_LINE_BOT_URL=
LINE_FRIEND_URL=https://line.me/R/ti/p/
Puede configurar un punto de entrada de página de configuración ( LIFF_URL
? P = configuración) en el administrador de la cuenta -> menú enriquecido
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
Bot de línea de rumores utiliza servicios de Google Cloud que se autenticó y autoriza utilizando cuentas de servicio en la nube de Google y credenciales predeterminadas de aplicaciones.
Cree una cuenta de servicio en el proyecto, descargue su clave y use GOOGLE_APPLICATION_CREDENTIALS
Env VAR para proporcionar la ruta a su clave de cuenta de servicio descargada. Vea la documentación para obtener detalles.
Usamos Dialogflow para detectar si el usuario está intentando chatear. Si la entrada del usuario coincide con cualquiera de las intenciones de Dialogflow, podemos devolver directamente las respuestas predefinidas en ese intento.
Para usar DialogFlow, haga la siguiente configuración:
dialogflow.sessions.detectIntent
permiso.DAILOGFLOW_LANGUAGE
: vacío al idioma predeterminado del agente, o puede especificar un idioma.DAILOGFLOW_ENV
: predeterminado a Draft Agent, o puede crear diferentes versiones. Cree una dimición personalizada (alcance del usuario) para Message Source
y un Metrix personalizado (alcance de éxito) para Group Members Count
. Ambos el índice predeterminado es 1. Si los índices GA creados no son 1, encuentran cd1
y cm1
en el código y los cambian a cd$theIndexGACreated
y cm$theIndexGACreated
respectivamente.
Use npm run typecheck
para verificar los tipos; Use npm run typegen
para generar el tipo de esquema GraphQL.
Prepare el archivo .env
(que debe ser idéntico a su entorno de implementación) y ejecute docker build .
para generar imagen Docker.
.env
se copiará en la imagen del constructor para generar un archivo estático LIFF con el env. Al construir imagen, puede incluir las "variables de tiempo de compilación" (denotadas en .env.sample
) en .env
para garantizar que no se filtre las credenciales del servidor en el código de cliente construido.
Dado que las imágenes de Docker construidas codificarán las URL públicas en archivos construidos estáticamente, estas variables de tiempo de compilación cuando ejecutamos la imagen como contenedor. Por lo tanto, cada entorno de implementación separado requerirá una compilación separada de la imagen.
Puede probar la imagen construida localmente utilizando docker-compose.yml
; Simplemente desenchufado la sección Bot de línea y proporcione el nombre de la imagen construido.
Para la producción, consulte Rumores-Deploy para la muestra docker-coompose.yml
que ejecuta dicha imagen.
Empujamos variables y eventos en dataLayer
de Google Tag Manager cuando el usuario interactúa con LIFF.
Puede preparar la siguiente configuración en el archivo .env
:
GTM_ID
: ID de contenedor de Google Tag Manager ( GTM-XXXXXXX
) La aplicación disparará los siguientes eventos personalizados en GTM dataLayer
:
dataLoaded
: cuando los datos se cargan en el artículo, comentarios o comentarios LIFF.routeChangeComplete
: cuando LIFF se carga o cambia la ruta.feedbackVote
: cuando el usuario envía un comentario.chooseArticle
: cuando el usuario elige un artículo en artículos liff. Además, presionará la siguiente variable personalizada a dataLayer
;
pagePath
- Establezca cuando el evento routeChangeComplete
se dispara. La ruta de la página del enrutador de Liff.userId
: establecido después de que LIFF obtiene ID de Token de ID y decodifica la ID de usuario de la línea.articleId
y replyId
: se establece en el artículo, comentarios y comentarios onMount()
se llama a la vida. O cuando se dispara el evento chooseArticle
.doc
- Establecido cuando el evento dataLoaded
dispara. El contenido cargado en sí mismo en el objeto (artículo en el artículo LIFF, comentario en comentarios LIFF y comentarios en la retroalimentación LIFF). Formato de evento enviado: Event category
/ Event action
/ Event label
Utilizamos Message Source
de dimensión (Dimemsion1 personalizado1) para clasificar diferentes fuentes de eventos
user
para mensajes 1 en 1room
| group
para mensajes grupalesUserInput
/ MessageType
/
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/
para cada artículo encontradoUserInput
/ ArticleSearch
/ ArticleNotFound
UserInput
/ ArticleSearch
/ ArticleFoundButNoHit
UserInput
/ IsForwarded
/ Yes
| No
UserInput
/ IsCooccurrence
/ Yes
| No
UserInput
/ ChatWithBot
/
Article
/ Selected
/
Reply
/ Search
/
para cada respuestaArticle
/ NoReply
/
Reply
/ Selected
/
Reply
/ Type
/
UserInput
/ Feedback-Vote
/ /
/feedback/yes
o /feedback/no
también se envía.Article
/ Create
/ Yes
Article
/ Create
/ No
Article
/ ProvidingReason
/
/reason
./articles
utm_source=rumors-line-bot&utm_medium=richmenu
utm_source=rumors-line-bot&utm_medium=push
LIFF
/ ChooseArticle
/
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
/
Group
/ Join
/ 1
( Event category
/ Event action
/ Event value
)Group Members Count
(Metric1 personalizado) para registrar que los miembros del grupo cuenten cuando ChatBot se unió.Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)Nota:
- Establecimos el valor del evento GA 1 como unión, -1 como licencia. Para saber que el recuento total de grupos se unió actualmente, puede ver directamente el valor total del evento (detalles ver recuento implícito).
- Para saber que un grupo está actualmente unido o ligado, debe encontrar la última acción de
Join
oLeave
laClient Id
.- Además, debe encontrar la última acción
Join
de laClient Id
para obtener unGroup Members Count
más preciso.Group Members Count
solo se registra cuando ChatBot se unió al grupo, para conocer el recuento exacto, debe obtenerlo directamente de Line Messaging-API.
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/
para cada artículo encontradoArticle
/ Selected
/
Reply
/ Selected
/
UserInput
/ Intro
/ContentProxy
/ Forward
/
/
(valor) LICENSE
define el acuerdo de licencia para el código fuente en este repositorio.
LEGAL.md
es el acuerdo de usuario para los usuarios del sitio web de CoFacts.