Bot de ligne qui vérifie si un message contient des rumeurs sur Internet.
C'est l'un des sous-projets de 真的假的。
Ce diagramme d'état décrit comment le bot LINE communique avec les utilisateurs :
Développer des rumeurs-line-bot vous oblige à terminer les paramètres suivants.
Après avoir cloné ce référentiel et ce cd dans le répertoire du projet, installez les dépendances.
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
Veuillez suivre toutes les étapes du didacticiel officiel LINE.
Créez un fichier .env
à partir du modèle .env.sample
, remplissez au moins :
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>
Les autres variables d'environnement personnalisables sont :
REDIS_URL
: S'il n'est pas indiqué, redis://127.0.0.1:6379
est utilisé.PORT
: Sur quel port le serveur du bot de ligne écoutera.GTM_ID
: identifiant Google Tag Manager. Pour les événements et les variables que nous transmettons à dataLayer
, consultez la section « Google Tag Manager » ci-dessous.DEBUG_LIFF
: désactive la vérification du navigateur externe dans LIFF. Utile lors du débogage de LIFF dans un navigateur externe. N'activez pas cela en production.RUMORS_LINE_BOT_URL
: URL publique du serveur qui est utilisée pour générer les URL d'image du didacticiel et l'URL de rappel d'authentification de LINE Notify. Vous aurez besoin Node.JS
16+ pour continuer.
$ npm i
Faites tourner des périphériques comme Redis et MongoDB en utilisant :
$ docker-compose up -d
Ensuite, lancez l'application, y compris le serveur chatbot et le serveur webpack-dev-server pour LIFF, en utilisant :
$ npm run dev
Le serveur sera démarré sur localhost:5001
(ou sur le PORT
que vous avez spécifié dans votre fichier .env
.)
Si vous souhaitez arrêter les périphériques, exécutez docker-compose stop
.
Exécutez simplement npm test
. Il lancera automatiquement le docker susmentionné et exécutera des tests unitaires.
Nous vous recommandons d'utiliser ngrok
pour créer une adresse publique qui dirige le trafic du serveur LINE vers votre machine locale. Avec ngrok
sur ton chemin, juste
$ ngrok http 5001
ngrok
vous donnera une URL publique. Utilisez-le pour définir l'URL du webhook de votre chaîne (voir la section "Console de chaîne" dans le didacticiel officiel de LINE).
Nous vous recommandons d'utiliser le fichier de configuration ngrok pour configurer un tunnel avec un subdomain
fixe. De cette façon, l'URL publique peut être corrigée (ce qui signifie pas de copier-coller répétitif dans les paramètres de LINE Channel !) tant que le subdomain
n'est pas occupé par d'autres.
Dans la console LINE Developers de votre canal API de message, sous API de messagerie > Paramètres du Webhook, définissez l' URL du Webhook sur ${ngrok_url}/callback
et activez Utiliser le webhook . Cliquez sur Vérifier pour confirmer qu'il est connecté avec succès à votre ordinateur local.
Nous utilisons LIFF pour recueillir la raison de l'utilisateur lors de la soumission d'un article et de commentaires négatifs.
Si vous n'avez pas besoin de développer LIFF, vous pouvez utiliser directement LIFF_URL
fourni dans .env.sample
, qui renvoie au site de test LIFF.
Si vous souhaitez modifier LIFF, vous devrez peut-être suivre ces étapes :
Pour créer des applications LIFF, veuillez suivre les instructions du document officiel, qui implique
chat_message.write
dans la portée (pour que LIFF envoie des messages). Après avoir acquis l'URL LIFF, placez-la dans .env
en tant que LIFF_URL
.Endpoint URL
pour qu'elle commence par votre point de terminaison chabbot et ajoutez /liff/index.html
comme suffixe. Pour développer LIFF, après npm run dev
, il est accessible sous /liff/index.html
du serveur de développement (http://localhost:5001) ou du serveur de chatbot de production.
En mode développement, il fait tourner un serveur webpack-dev sur localhost:<LIFF_DEV_PORT>
(par défaut 8080
), et /liff
du serveur chatbot transmet toutes les requêtes au serveur webpack-dev.
Une astuce pour développer LIFF dans un navigateur est la suivante :
https://<your-dev-chatbot.ngrok.io>/liff/index.html?p=<page>&...
dans le navigateur de bureau.liff.logout()
manuellement dans la console JS pour déclencher une reconnexion. liff.init()
fonctionnerait toujours dans le navigateur de bureau, de sorte que l'application s'affiche, nous permettant ainsi de déboguer les mises en page Web sur le bureau. liff.sendMessages()
ne fonctionnerait cependant pas. liff.closeWindow()
ne fonctionnera pas non plus si la fenêtre de votre navigateur a subi des redirections de connexion.
Le serveur de bot LINE démarre un serveur GraphQL qui relie l'API Cofacts GraphQL et l'API spécifique au chatbot LINE.
Chaque fois que l'API Cofacts est mise à jour, utilisez npm run cofactsapi
pour récupérer le dernier schéma de l'API Cofacts.
Pendant le développement, utilisez la commande suivante pour démarrer un livre d'histoires sur votre ordinateur local :
npm run storybook # Then visit http://localhost:6006
Vous pouvez également visiter https://cofacts.github.io/rumors-line-bot pour un livre d'histoires prédéfini sur la branche master
.
En production, les fichiers LIFF sont compilés dans le répertoire /liff
et servis comme fichiers statiques par le serveur chatbot.
Si vous obtenez 400 bad request
dans LIFF, veuillez rechercher l'appel de fonction liff.init
dans le binaire JS compilé et voir si l'ID LIFF est cohérent avec votre URL LIFF, qui devrait être le chemin sans commencer https://liff.line.me/
.
L'ID LIFF est défini à l'aide du plugin Webpack Define lors de la construction, donc l'échange de la variable d'environnement d'URL LIFF sans reconstruire les binaires LIFF entraînera 400 requêtes incorrectes.
Nous utilisons ttag pour prendre en charge i18n au moment de la construction du chatbot.
Veuillez vous référer à la documentation ttag pour annoter les chaînes à traduire.
Pour extraire des chaînes annotées vers des fichiers de traduction, utilisez :
$ npm run i18n:extract
Les fichiers de traduction se trouvent sous i18n/
, au format Gettext PO.
en_US.po
: La langue utilisée dans le code étant déjà l'anglais, ce fichier de traduction vide existe pour simplifier les paramètres.zh_TW.po
: Traduction en chinois traditionnel.ja.po
: traduction japonaise. Vous pouvez le remplacer par n'importe quelle langue que vous souhaitez prendre en charge, en utilisant la commande Gettext msginit
.
Vous devrez modifier les scripts i18n:extract
et i18n:validate
dans package.json
pour refléter le changement de paramètres régionaux.
Par défaut, le chatbot sera construit sous la locale en_US
.
Sur Heroku, veuillez définir LOCALE
sur l'un des en_US
, zh_TW
ou tout autre code de langue existant dans le répertoire i18n/
.
Si vous souhaitez plutôt construire à l'aide de docker, vous devrez peut-être modifier Dockerfile pour inclure le LOCALE
souhaité.
Pré-requis :
Pour utiliser le message push : dans le fichier .env
, définit NOTIFY_METHOD=PUSH_MESSAGE
Pour utiliser LINE Notify :
Callback Url
: RUMORS_LINE_BOT_URL
/authcallback/line_notify.env
, définit 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>
Vous pouvez configurer un point d'entrée de page de configuration ( LIFF_URL
?p=setting) dans le gestionnaire de compte -> menu riche
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
rumeurs-line-bot utilise les services cloud de Google qui sont authentifiés et autorisés à l'aide des comptes de service Google Cloud et des informations d'identification par défaut de l'application.
Veuillez créer un compte de service sous le projet, télécharger sa clé et utiliser la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS
pour fournir le chemin d'accès à votre clé de compte de service téléchargée. Voir la documentation pour plus de détails.
Nous utilisons Dialogflow pour détecter si l'utilisateur essaie de discuter. Si l'entrée de l'utilisateur correspond à l'une des intentions Dialogflow, nous pouvons renvoyer directement des réponses prédéfinies dans cette intention.
Pour utiliser Dialogflow, veuillez effectuer la configuration suivante :
dialogflow.sessions.detectIntent
.DAILOGFLOW_LANGUAGE
: vide dans la langue par défaut de l'agent, ou vous pouvez spécifier une langue.DAILOGFLOW_ENV
: par défaut, brouillon d'agent, ou vous pouvez créer différentes versions. Créez une dimension personnalisée (portée utilisateur) pour Message Source
et une mesure personnalisée (portée d'accès) pour Group Members Count
. Les deux index par défaut sont 1. Si les index créés par GA ne sont pas 1, recherchez cd1
et cm1
dans le code et remplacez-les respectivement par cd$theIndexGACreated
et cm$theIndexGACreated
.
Utilisez npm run typecheck
pour vérifier les types ; utilisez npm run typegen
pour générer du type à partir du schéma GraphQL.
Préparez le fichier .env
(qui doit être identique à votre environnement de déploiement) et exécutez docker build .
pour générer une image Docker.
.env
sera copié sur l'image du générateur pour générer un fichier statique LIFF avec l'env. Lors de la création d'une image, vous pouvez simplement inclure les « variables au moment de la construction » (notées dans .env.sample
) dans .env
pour garantir qu'aucune information d'identification du serveur n'est divulguée dans le code client généré.
Étant donné que les images Docker construites encoderont les URL publiques dans des fichiers construits de manière statique, ces variables au moment de la construction lorsque nous exécutons l'image en tant que conteneur. Par conséquent, chaque environnement de déploiement distinct nécessitera une génération distincte de l’image.
Vous pouvez tester l'image construite localement à l'aide de docker-compose.yml
; Décommentez simplement la section du bot de ligne et fournissez le nom de l'image construite.
Pour la production, veuillez consulter les rumeurs-deploy pour un exemple docker-coompose.yml
qui exécute une telle image.
Nous insérons des variables et des événements dans dataLayer
de Google Tag Manager lorsque l'utilisateur interagit avec LIFF.
Vous pouvez préparer la configuration suivante dans le fichier .env
:
GTM_ID
: ID de conteneur Google Tag Manager ( GTM-XXXXXXX
) L'application déclenchera les événements personnalisés suivants dans GTM dataLayer
:
dataLoaded
- lorsque les données sont chargées dans un article, un commentaire ou un feedback LIFF.routeChangeComplete
- lorsque LIFF est chargé ou change de chemin.feedbackVote
- lorsque l'utilisateur soumet un commentaire.chooseArticle
- lorsque l'utilisateur choisit un article dans Articles LIFF. En outre, il transmettra la variable personnalisée suivante à dataLayer
;
pagePath
- Défini lorsque l'événement routeChangeComplete
se déclenche. Le chemin de la page du routeur du LIFF.userId
- Défini après que LIFF ait obtenu le jeton d'identification et décode l'ID utilisateur LINE à l'intérieur.articleId
et replyId
: définis sur l'article, le commentaire et les commentaires, le cycle de vie onMount()
est appelé. Ou lorsque l'événement chooseArticle
est déclenché.doc
- Définir le moment où l'événement dataLoaded
se déclenche. Le contenu chargé lui-même dans l'objet (article dans Article LIFF, commentaire dans Comment LIFF et feedback dans feedback LIFF). Format de l'événement envoyé : Event category
/ Event action
/ Event label
Nous utilisons la dimension Message Source
(Custom Dimemsion1) pour classer différentes sources d'événements
user
pour les messages 1 contre 1room
| group
pour les messages de groupeUserInput
/ MessageType
/ <text | image | video | ...>
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
pour chaque article trouvé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>
pour chaque réponseArticle
/ NoReply
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
Reply
/ Type
/ <selected reply's type>
UserInput
/ Feedback-Vote
/ <articleId>/<replyId>
/feedback/yes
ou /feedback/no
est également envoyée.Article
/ Create
/ Yes
Article
/ Create
/ No
Article
/ ProvidingReason
/ <articleId>
/reason
est également envoyée./articles
est envoyéeutm_source=rumors-line-bot&utm_medium=richmenu
utm_source=rumors-line-bot&utm_medium=push
LIFF
/ ChooseArticle
/ <articleId>
utm_source
, utm_medium
s'appliquent également./setting
est envoyéeutm_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
(mesure personnalisée 1) pour enregistrer le nombre de membres du groupe lorsque le chatbot a rejoint.Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)Note:
- Nous définissons la valeur de l'événement ga 1 comme jointure, -1 comme congé. Pour connaître le nombre total de groupes de chatbots actuellement rejoints, vous pouvez voir directement la valeur totale de l'événement (pour plus de détails, voir Nombre implicite).
- Pour savoir qu'un groupe est actuellement rejoint ou quitté, vous devez trouver la dernière action
Join
ouLeave
de l'Client Id
.- En outre, vous devriez trouver la dernière action
Join
de l’Client Id
pour obtenir unGroup Members Count
plus précis.Group Members Count
n'est enregistré que lorsque le chatbot a rejoint le groupe. Pour connaître le nombre exact, vous devez l'obtenir directement à partir de l'API de messagerie en ligne.
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
pour chaque article trouvéArticle
/ Selected
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
UserInput
/ Intro
/ContentProxy
/ Forward
/ <content type>
/ <content length>
(valeur) LICENSE
définit le contrat de licence pour le code source de ce référentiel.
LEGAL.md
est le contrat d'utilisation pour les utilisateurs du site Web Cofacts.