Line-Bot, der prüft, ob eine Nachricht Internetgerüchte enthält.
Dies ist eines der Teilprojekte von 真的假的.
Dieses Zustandsdiagramm beschreibt, wie der LINE-Bot mit Benutzern kommuniziert:
Um den Gerüchte-Line-Bot zu entwickeln, müssen Sie die folgenden Einstellungen vornehmen.
Nachdem Sie dieses Repository und die CD in das Projektverzeichnis geklont haben, installieren Sie die Abhängigkeiten.
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
Bitte befolgen Sie alle Schritte im offiziellen LINE-Tutorial.
Erstellen Sie .env
Datei aus .env.sample
-Vorlage und füllen Sie mindestens Folgendes aus:
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>
Weitere anpassbare Umgebungsvariablen sind:
REDIS_URL
: Wenn nicht angegeben, wird redis://127.0.0.1:6379
verwendet.PORT
: An welchem Port der Line-Bot-Server lauscht.GTM_ID
: Google Tag Manager-ID. Informationen zu den Ereignissen und Variablen, die wir an dataLayer
übertragen, finden Sie im Abschnitt „Google Tag Manager“ weiter unten.DEBUG_LIFF
: Deaktiviert die externe Browserprüfung in LIFF. Nützlich beim Debuggen von LIFF in einem externen Browser. Aktivieren Sie dies nicht in der Produktion.RUMORS_LINE_BOT_URL
: Öffentliche Server-URL, die zum Generieren von Tutorial-Bild-URLs und der Authentifizierungs-Rückruf-URL von LINE Notify verwendet wird. Sie benötigen Node.JS
16+, um fortzufahren.
$ npm i
Starten Sie Peripheriegeräte wie Redis und MongoDB mit:
$ docker-compose up -d
Starten Sie dann die Anwendung, einschließlich Chatbot-Server und Webpack-Dev-Server für LIFF, mit:
$ npm run dev
Der Server wird auf localhost:5001
(oder dem PORT
den Sie in Ihrer .env
Datei angegeben haben) gestartet.
Wenn Sie die Peripheriegeräte stoppen möchten, führen Sie docker-compose stop
aus.
Führen Sie einfach npm test
aus. Es startet automatisch den oben genannten Docker und führt Unit-Tests durch.
Wir empfehlen die Verwendung ngrok
zum Erstellen einer öffentlichen Adresse, die den Datenverkehr vom LINE-Server zu Ihrem lokalen Computer leitet. Mit ngrok
auf deinem Weg, einfach
$ ngrok http 5001
ngrok
gibt Ihnen eine öffentliche URL. Verwenden Sie dies, um die Webhook-URL Ihres Kanals festzulegen (siehe Abschnitt „Kanalkonsole“ im offiziellen LINE-Tutorial).
Wir empfehlen die Verwendung der ngrok-Konfigurationsdatei, um einen Tunnel mit einer festen subdomain
einzurichten. Auf diese Weise kann die öffentliche URL festgelegt werden (d. h. kein wiederholtes Kopieren und Einfügen in die LINE-Kanaleinstellungen!), solange die subdomain
nicht von anderen belegt ist.
Legen Sie in der LINE Developers-Konsole in Ihrem Message-API-Kanal unter Messaging API > Webhook-Einstellungen die Webhook-URL auf ${ngrok_url}/callback
fest und aktivieren Sie „Webhook verwenden“ . Klicken Sie auf „Bestätigen“, um zu bestätigen, dass die Verbindung zu Ihrem lokalen Computer erfolgreich hergestellt wurde.
Wir verwenden LIFF, um den Grund des Benutzers beim Einreichen von Artikeln und negativen Rückmeldungen zu erfassen.
Wenn Sie kein LIFF entwickeln müssen, können Sie direkt die in .env.sample
bereitgestellte LIFF_URL
verwenden, die auf die Staging-LIFF-Site verweist.
Wenn Sie LIFF ändern möchten, müssen Sie möglicherweise die folgenden Schritte ausführen:
Um LIFF-Apps zu erstellen, befolgen Sie bitte die Anweisungen im offiziellen Dokument
chat_message.write
im Gültigkeitsbereich aus (damit LIFF Nachrichten senden kann). Nachdem Sie die LIFF-URL erhalten haben, platzieren Sie sie in .env
als LIFF_URL
.Endpoint URL
so fest, dass sie mit Ihrem Chabbot-Endpunkt beginnt, und fügen Sie /liff/index.html
als Postfix hinzu. Um LIFF zu entwickeln, ist es nach npm run dev
unter /liff/index.html
des Entwicklungsservers (http://localhost:5001) oder des Produktions-Chatbot-Servers zugänglich.
Im Entwicklungsmodus dreht es einen Webpack-Dev-Server auf localhost:<LIFF_DEV_PORT>
(Standard 8080
) und /liff
des Chatbot-Servers leitet alle Anfragen an den Webpack-Dev-Server weiter.
Ein Tipp zum Entwickeln von LIFF im Browser ist:
https://<your-dev-chatbot.ngrok.io>/liff/index.html?p=<page>&...
im Desktop-Browser.liff.logout()
manuell in der JS-Konsole eingeben, um eine erneute Anmeldung auszulösen. liff.init()
funktioniert weiterhin im Desktop-Browser, sodass die App gerendert wird und wir Weblayouts auf dem Desktop debuggen können. liff.sendMessages()
würde jedoch nicht funktionieren. liff.closeWindow()
funktioniert auch nicht, wenn Ihr Browserfenster Anmeldeumleitungen durchlaufen hat.
Der LINE-Bot-Server startet einen GraphQL-Server, der die Cofacts GraphQL-API und die für den LINE-Chatbot spezifische API zusammenfügt.
Wenn die Cofacts-API aktualisiert wird, verwenden Sie npm run cofactsapi
um das neueste Cofacts-API-Schema abzurufen.
Verwenden Sie während der Entwicklung den folgenden Befehl, um ein Storybook auf Ihrem lokalen Computer zu starten:
npm run storybook # Then visit http://localhost:6006
Sie können auch https://cofacts.github.io/rumors-line-bot besuchen, um ein vorgefertigtes Storybook für master
-Zweig zu erhalten.
Bei der Produktion werden LIFF-Dateien im Verzeichnis /liff
kompiliert und vom Chatbot-Server als statische Dateien bereitgestellt.
Wenn Sie 400 bad request
in LIFF erhalten, suchen Sie bitte nach dem Funktionsaufruf liff.init
in der kompilierten JS-Binärdatei und prüfen Sie, ob die LIFF-ID mit Ihrer LIFF-URL übereinstimmt. Dabei sollte es sich um den Pfad ohne führenden https://liff.line.me/
handeln. .
Die LIFF-ID wird während der Erstellung mit dem Webpack Define-Plugin festgelegt. Daher führt der Austausch der LIFF-URL-Umgebungsvariablen ohne Neuerstellung der LIFF-Binärdateien zu einer fehlerhaften Anfrage von 400.
Wir verwenden ttag, um Build-Time-i18n für den Chatbot zu unterstützen.
Informationen zum Kommentieren von zu übersetzenden Zeichenfolgen finden Sie in der ttag-Dokumentation.
Um annotierte Zeichenfolgen in Übersetzungsdateien zu extrahieren, verwenden Sie:
$ npm run i18n:extract
Die Übersetzungsdateien befinden sich unter i18n/
im Gettext PO-Format.
en_US.po
: Da die im Code verwendete Sprache bereits Englisch ist, existiert diese leere Übersetzungsdatei, um die Einstellungen zu vereinfachen.zh_TW.po
: Traditionelle chinesische Übersetzung.ja.po
: Japanische Übersetzung. Sie können dies durch jede Sprache ersetzen, die Sie unterstützen möchten, indem Sie den Befehl Gettext msginit
nutzen.
Sie müssen die Skripte i18n:extract
und i18n:validate
in package.json
ändern, um die Änderung des Gebietsschemas widerzuspiegeln.
Standardmäßig wird der Chatbot unter dem Gebietsschema en_US
erstellt.
Stellen Sie auf Heroku bitte LOCALE
auf einen von en_US
, zh_TW
oder einen anderen Sprachcode ein, der im i18n/
-Verzeichnis vorhanden ist.
Wenn Sie stattdessen mit Docker erstellen möchten, müssen Sie möglicherweise Dockerfile so ändern, dass es das gewünschte LOCALE
enthält.
Voraussetzungen:
So verwenden Sie eine Push-Nachricht: Legen Sie in .env
-Datei NOTIFY_METHOD=PUSH_MESSAGE
fest
So verwenden Sie LINE Notify:
Callback Url
ein: RUMORS_LINE_BOT_URL
/authcallback/line_notify.env
Datei, setzt 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>
Sie können einen Einstiegspunkt für die Einstellungsseite ( LIFF_URL
?p=setting) im Kontomanager -> Rich-Menü einrichten
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
Der Gerüchte-Line-Bot nutzt Google Cloud-Dienste, die mithilfe von Google Cloud-Dienstkonten und Standardanmeldeinformationen für Anwendungen authentifiziert und autorisiert werden.
Bitte erstellen Sie ein Dienstkonto unter dem Projekt, laden Sie dessen Schlüssel herunter und verwenden Sie die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS
, um den Pfad zu Ihrem heruntergeladenen Dienstkontoschlüssel anzugeben. Weitere Informationen finden Sie in der Dokumentation.
Wir verwenden Dialogflow, um zu erkennen, ob der Benutzer versucht, sich zu unterhalten. Wenn die Benutzereingabe mit einer der Dialogflow-Absichten übereinstimmt, können wir vordefinierte Antworten in dieser Absicht direkt zurückgeben.
Um Dialogflow zu verwenden, führen Sie bitte die folgende Einrichtung durch:
dialogflow.sessions.detectIntent
verfügt.DAILOGFLOW_LANGUAGE
: Leer auf die Standardsprache des Agenten, oder Sie können eine Sprache angeben.DAILOGFLOW_ENV
: Standardmäßig der Agentenentwurf, oder Sie können verschiedene Versionen erstellen. Erstellen Sie eine benutzerdefinierte Dimension (Benutzerbereich) für Message Source
und eine benutzerdefinierte Metrix (Trefferbereich) für Group Members Count
. Der Standardindex für beide ist 1. Wenn die von GA erstellten Indizes nicht 1 sind, suchen Sie im Code nach cd1
und cm1
und ändern Sie sie in cd$theIndexGACreated
bzw. cm$theIndexGACreated
.
Verwenden Sie npm run typecheck
um Typen zu überprüfen. Verwenden Sie npm run typegen
um einen Typ aus dem GraphQL-Schema zu generieren.
Bereiten Sie .env
Datei vor (die mit Ihrer Bereitstellungsumgebung identisch sein sollte) und führen Sie docker build .
um ein Docker-Image zu generieren.
.env
wird in das Builder-Image kopiert, um eine statische LIFF-Datei mit der Umgebung zu generieren. Beim Erstellen eines Images können Sie einfach die „Build-Time-Variablen“ (bezeichnet in .env.sample
) in .env
einschließen, um sicherzustellen, dass keine Server-Anmeldeinformationen im erstellten Client-Code verloren gehen.
Da erstellte Docker-Images öffentliche URLs in statisch erstellte Dateien codieren, sind diese Build-Zeitvariablen, wenn wir das Image als Container ausführen. Daher erfordert jede einzelne Bereitstellungsumgebung einen separaten Build des Images.
Sie können das erstellte Image lokal mit docker-compose.yml
testen. Kommentieren Sie einfach den Zeilenbot-Abschnitt aus und geben Sie den Namen des erstellten Bildes an.
Für die Produktion finden Sie unter „rumums-deploy“ ein Beispiel für docker-coompose.yml
das ein solches Image ausführt.
Wir übertragen Variablen und Ereignisse in dataLayer
von Google Tag Manager, wenn der Benutzer mit LIFF interagiert.
Sie können das folgende Setup in .env
Datei vorbereiten:
GTM_ID
: Google Tag Manager-Container-ID ( GTM-XXXXXXX
) Die Anwendung löst die folgenden benutzerdefinierten Ereignisse in GTM dataLayer
aus:
dataLoaded
– wenn Daten in Artikel-, Kommentar- oder Feedback-LIFF geladen werden.routeChangeComplete
– wenn LIFF geladen wird oder den Pfad ändert.feedbackVote
– wenn der Benutzer ein Feedback abgibt.chooseArticle
– wenn der Benutzer einen Artikel in Articles LIFF auswählt. Außerdem wird die folgende benutzerdefinierte Variable an dataLayer
gepusht;
pagePath
– Wird festgelegt, wenn routeChangeComplete
Ereignis ausgelöst wird. Der Seitenpfad vom LIFF-Router.userId
– Wird gesetzt, nachdem LIFF das ID-Token abgerufen und die darin enthaltene LINE-Benutzer-ID dekodiert hat.articleId
und replyId
: Wird für Artikel, Kommentar und Feedback festgelegt. onMount()
Lebenszyklus wird aufgerufen. Oder wenn das Ereignis chooseArticle
ausgelöst wird.doc
– Wird festgelegt, wenn dataLoaded
Ereignis ausgelöst wird. Der geladene Inhalt selbst im Objekt (Artikel in Artikel-LIFF, Kommentar in Kommentar-LIFF und Feedback in Feedback-LIFF). Gesendetes Ereignisformat: Event category
/ Event action
/ Event label
Wir verwenden die Dimension Message Source
(Benutzerdefinierte Dimension1), um verschiedene Ereignisquellen zu klassifizieren
user
für 1-zu-1-Nachrichtenroom
| group
für GruppennachrichtenUserInput
/ MessageType
/ <text | image | video | ...>
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
für jeden gefundenen ArtikelUserInput
/ 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>
für jede AntwortArticle
/ NoReply
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
Reply
/ Type
/ <selected reply's type>
UserInput
/ Feedback-Vote
/ <articleId>/<replyId>
/feedback/yes
oder /feedback/no
gesendet.Article
/ Create
/ Yes
Article
/ Create
/ No
Article
/ ProvidingReason
/ <articleId>
/reason
gesendet./articles
wird gesendetutm_source=rumors-line-bot&utm_medium=richmenu
utm_source=rumors-line-bot&utm_medium=push
LIFF
/ ChooseArticle
/ <articleId>
utm_source
und utm_medium
./setting
wird gesendetutm_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
(benutzerdefinierte Metrik1), um die Anzahl der Gruppenmitglieder beim Beitritt zum Chatbot aufzuzeichnen.Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)Notiz:
- Wir setzen den GA-Ereigniswert 1 als Join und -1 als Leave. Um die Gesamtzahl der Gruppen zu erfahren, bei denen der Chatbot aktuell beigetreten ist, können Sie direkt den Gesamtereigniswert sehen (Details siehe Implizite Anzahl).
- Um zu wissen, ob einer Gruppe gerade beigetreten ist oder sie verlassen wurde, sollten Sie die letzte
Join
oderLeave
-Aktion derClient Id
finden.- Außerdem sollten Sie die letzte
Join
derClient Id
finden, um eine genauereGroup Members Count
zu erhalten.Group Members Count
wird nur aufgezeichnet, wenn der Chatbot der Gruppe beigetreten ist. Um die genaue Anzahl zu erfahren, sollten Sie sie direkt von der Line Messaging-API abrufen.
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
für jeden gefundenen ArtikelArticle
/ Selected
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
UserInput
/ Intro
/ContentProxy
/ Forward
/ <content type>
/ <content length>
(Wert) LICENSE
definiert die Lizenzvereinbarung für den Quellcode in diesem Repository.
LEGAL.md
ist die Nutzungsvereinbarung für Benutzer der Cofacts-Website.