Bot de línea que comprueba si un mensaje contiene rumores de Internet.
Este es uno de los subproyectos de 真的假的.
Este diagrama de estado describe cómo el bot LINE habla con los usuarios:
El desarrollo de rumors-line-bot requiere que completes las siguientes configuraciones.
Después de clonar este repositorio y CD en el directorio del proyecto, 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 del tutorial oficial de LINE.
Cree un archivo .env
a partir de la plantilla .env.sample
, al menos complete:
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>
Otras variables de entorno personalizables son:
REDIS_URL
: si no se proporciona, se utiliza redis://127.0.0.1:6379
.PORT
: En qué puerto escuchará el servidor del bot de línea.GTM_ID
: ID del Administrador de etiquetas de Google. Para conocer los eventos y variables que enviamos a dataLayer
, consulte la sección "Administrador de etiquetas de Google" a continuación.DEBUG_LIFF
: Desactiva la verificación del navegador externo en LIFF. Útil al depurar LIFF en un navegador externo. No habilite esto en producción.RUMORS_LINE_BOT_URL
: URL pública del servidor que se utiliza para generar URL de imágenes de tutoriales y URL de devolución de llamada de autenticación de LINE Notify. Necesitará Node.JS
16+ para continuar.
$ npm i
Haga funcionar periféricos como Redis y MongoDB usando:
$ docker-compose up -d
Luego, inicie la aplicación, incluido el servidor chatbot y el servidor 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
. Automáticamente activará la ventana acoplable antes mencionada y ejecutará pruebas unitarias.
Recomendamos usar ngrok
para crear una dirección pública que dirija el tráfico desde el servidor LINE a su máquina local. Con ngrok
en tu camino, solo
$ ngrok http 5001
ngrok
le dará una URL pública. Utilízalo para configurar la URL del webhook de tu canal (consulta la sección "Consola de canales" en el tutorial oficial de LINE).
Recomendamos utilizar el archivo de configuración ngrok para configurar un túnel con un subdomain
fijo. De esta manera, la URL pública se puede arreglar (¡lo que significa que no se debe copiar y pegar repetidamente en la configuración del canal LINE!) siempre que el subdomain
no esté ocupado por otros.
Dentro de la consola de LINE Developers en su canal Message API, en Messaging API > Webhook settings establezca la URL del Webhook en ${ngrok_url}/callback
y active Usar webhook . Haga clic en verificar para confirmar que está conectado correctamente a su máquina local.
Estamos utilizando LIFF para recopilar los motivos del usuario al enviar artículos y comentarios negativos.
Si no necesita desarrollar LIFF, puede usar directamente LIFF_URL
proporcionada en .env.sample
, que enlaza con el sitio de preparación de LIFF.
Si desea modificar LIFF, es posible que deba seguir estos pasos:
Para crear aplicaciones LIFF, siga las instrucciones del documento oficial, que implica
chat_message.write
en el alcance (para que LIFF envíe mensajes). Después de adquirir la URL de LIFF, colóquela en .env
como LIFF_URL
.Endpoint URL
para que comience con el punto final de su chabbot y agregue /liff/index.html
como postfix. Para desarrollar LIFF, después de npm run dev
, se puede acceder a él en /liff/index.html
del servidor de desarrollo (http://localhost:5001) o en el servidor de chatbot de producción.
En el modo de desarrollo, activa un servidor webpack-dev-server en localhost:<LIFF_DEV_PORT>
(predeterminado en 8080
), y /liff
del servidor chatbot envía todas las solicitudes al servidor webpack-dev.
Un consejo para desarrollar LIFF en el navegador es:
https://<your-dev-chatbot.ngrok.io>/liff/index.html?p=<page>&...
en el navegador de escritorio.liff.logout()
manualmente en la consola JS para activar un nuevo inicio de sesión. liff.init()
seguiría funcionando en el navegador de escritorio, de modo que la aplicación se renderice, lo que nos permitirá depurar 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 redirecciones de inicio de sesión.
El servidor del bot de LINE inicia un servidor GraphQL que une la API GraphQL de Cofacts y la API específica del chatbot de LINE.
Siempre que se actualice la API de Cofacts, utilice npm run cofactsapi
para obtener el esquema de API de Cofacts más reciente.
Durante el desarrollo, utilice 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 obtener un libro de cuentos prediseñado en la rama master
.
En producción, los archivos LIFF se compilan en el directorio /liff
y el servidor del chatbot los sirve como archivos estáticos.
Si recibe 400 bad request
en LIFF, busque la llamada a la función liff.init
en el binario JS compilado y vea si el ID de LIFF es consistente con su URL de LIFF, que debería ser la ruta sin https://liff.line.me/
inicial. .
El ID de LIFF se configura mediante el complemento Webpack Define durante la compilación, por lo que intercambiar la variable de entorno de URL de LIFF sin reconstruir los archivos binarios de LIFF provocará 400 solicitudes incorrectas.
Usamos ttag para admitir i18n en tiempo de compilación para el chatbot.
Consulte la documentación de ttag para anotar cadenas para traducir.
Para extraer cadenas anotadas a archivos de traducción, utilice:
$ 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 el inglés, existe este archivo de traducción vacío para simplificar la configuración.zh_TW.po
: Traducción al chino tradicional.ja.po
: traducción japonesa. Puede reemplazar esto con cualquier idioma que desee admitir aprovechando el comando Gettext msginit
.
Deberá cambiar el script i18n:extract
e i18n:validate
en package.json
para reflejar el cambio de configuración regional.
De forma predeterminada, el chatbot se creará en la configuración regional en_US
.
En Heroku, configure LOCALE
en uno de en_US
, zh_TW
o cualquier otro código de idioma que exista en el directorio i18n/
.
Si desea compilar utilizando Docker, es posible que deba modificar Dockerfile para incluir el LOCALE
deseado.
Requisitos previos:
Para usar mensajes push: en el archivo .env
, establezca NOTIFY_METHOD=PUSH_MESSAGE
Para utilizar LINE Notify:
Callback Url
: RUMORS_LINE_BOT_URL
/authcallback/line_notify.env
, establece 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>
Puede configurar un punto de entrada a la página de configuración ( LIFF_URL
? P=configuración) en el administrador de cuentas -> menú enriquecido
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
rumors-line-bot utiliza los servicios en la nube de Google que están autenticados y autorizados mediante cuentas de servicio de Google Cloud y credenciales predeterminadas de la aplicación.
Cree una cuenta de servicio en el proyecto, descargue su clave y use GOOGLE_APPLICATION_CREDENTIALS
env var para proporcionar la ruta a la clave de su cuenta de servicio descargada. Consulte la documentación para obtener más detalles.
Usamos Dialogflow para detectar si el usuario está intentando charlar. Si la entrada del usuario coincide con cualquiera de las intenciones de Dialogflow, podemos devolver directamente respuestas predefinidas en esa intención.
Para utilizar Dialogflow, realice la siguiente configuración:
dialogflow.sessions.detectIntent
.DAILOGFLOW_LANGUAGE
: Vacío para el idioma predeterminado del agente, o puede especificar un idioma.DAILOGFLOW_ENV
: El valor predeterminado es el borrador del agente, o puede crear diferentes versiones. Cree una dimensión personalizada (alcance del usuario) para Message Source
y una métrica personalizada (alcance de visitas) para Group Members Count
. El índice predeterminado de ambos es 1. Si los índices creados por GA no son 1, busque cd1
y cm1
en el código y cámbielos a cd$theIndexGACreated
y cm$theIndexGACreated
respectivamente.
Utilice npm run typecheck
para comprobar los tipos; use npm run typegen
para generar tipos a partir del esquema GraphQL.
Prepare el archivo .env
(que debe ser idéntico a su entorno de implementación) y ejecute docker build .
para generar la imagen de la ventana acoplable.
.env
se copiará a la imagen del generador para generar un archivo estático LIFF con el entorno. Al crear una imagen, puede simplemente incluir las "variables de tiempo de compilación" (indicadas en .env.sample
) en .env
para garantizar que no se filtren credenciales del servidor en el código del cliente creado.
Dado que las imágenes de Docker creadas codificarán las URL públicas en archivos creados estáticamente, estas variables de tiempo de compilación cuando ejecutamos la imagen como contenedor. Por lo tanto, cada entorno de implementación independiente requerirá una compilación independiente de la imagen.
Puede probar la imagen creada localmente usando docker-compose.yml
; simplemente descomente la sección del bot de línea y proporcione el nombre de la imagen creada.
Para producción, consulte rumors-deploy para ver un ejemplo docker-coompose.yml
que ejecuta dicha imagen.
Insertamos 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 del contenedor del Administrador de etiquetas de Google ( GTM-XXXXXXX
) La aplicación activará los siguientes eventos personalizados en GTM dataLayer
:
dataLoaded
: cuando los datos se cargan en un artículo, comentario o retroalimentación LIFF.routeChangeComplete
: cuando se carga LIFF o cambia la ruta.feedbackVote
: cuando el usuario envía un comentario.chooseArticle
: cuando el usuario elige un artículo en Articles LIFF. Además, enviará la siguiente variable personalizada a dataLayer
;
pagePath
: se establece cuando se activa el evento routeChangeComplete
. La ruta de la página desde el enrutador de LIFF.userId
: se establece después de que LIFF obtenga el token de ID y decodifique el ID de usuario de LINE en su interior.articleId
y replyId
: configurados en el ciclo de vida del artículo, comentario y retroalimentación onMount()
se llama. O cuando se activa el evento chooseArticle
.doc
: establece cuándo se activa el evento dataLoaded
. El contenido cargado en sí en el objeto (artículo en Artículo LIFF, comentario en Comentario LIFF y comentarios en comentarios LIFF). Formato de evento enviado: Event category
/ Event action
/ Event label
Usamos la dimensión Message Source
(Dimemsion1 personalizada) para clasificar diferentes fuentes de eventos
user
para mensajes 1 a 1room
| group
para mensajes grupalesUserInput
/ MessageType
/ <text | image | video | ...>
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
para cada artículo encontradoUserInput
/ 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>
para cada respuestaArticle
/ NoReply
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
Reply
/ Type
/ <selected reply's type>
UserInput
/ Feedback-Vote
/ <articleId>/<replyId>
/feedback/yes
o /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
y 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
(métrica personalizada 1) para registrar el recuento de miembros del grupo cuando se unieron al chatbot.Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)Nota:
- Establecemos el valor de evento ga 1 como unión, -1 como salida. Para conocer el recuento total de grupos de chatbot a los que se une actualmente, puede ver directamente el valor total del evento (para más detalles, consulte Recuento implícito).
- Para saber si un grupo está actualmente unido o abandonado, debe encontrar la última acción
Join
oLeave
delClient Id
.- Además, debe encontrar la última acción
Join
delClient Id
para obtener unGroup Members Count
más preciso.Group Members Count
solo se registra cuando el chatbot se une al grupo; para conocer el recuento exacto, debe obtenerlo directamente de la línea de mensajería-api.
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
para cada artículo encontradoArticle
/ Selected
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
UserInput
/ Intro
/ContentProxy
/ Forward
/ <content type>
/ <content length>
(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.