Zeilenbot, der überprüft, ob eine Nachricht Internet -Gerüchte enthält.
Dies ist eine des Unterprojekts von 真的假的。
Dieses staatliche Diagramm beschreibt, wie der Linienbot mit Benutzern spricht:
Um Gerüchte zu entwickeln, müssen Sie die folgenden Einstellungen beenden.
Installieren Sie nach dem Klonen dieses Repository & CD in das Projektverzeichnis 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 Tutorial in der Linie.
Erstellen Sie .env
-Datei aus .env.sample
-Vorlage, mindestens ausfüllen:
API_URL=https://dev-api.cofacts.tw/graphql
LINE_CHANNEL_SECRET=
LINE_CHANNEL_TOKEN=
LINE_LOGIN_CHANNEL_ID=
LIFF_URL=
Andere anpassbare Env -Vars sind:
REDIS_URL
: Wenn nicht angegeben, wird redis://127.0.0.1:6379
verwendet.PORT
: Auf welchem Port der Line Bot Server hört sich an.GTM_ID
: Google Tag Manager -ID. Für die Ereignisse und Variablen, die wir auf dataLayer
drängen, siehe Abschnitt "Google Tag Manager" unten.DEBUG_LIFF
: Deaktiviert den externen Browser -Check in Liff. Nützlich beim Debuggen von Liff im externen Browser. Aktivieren Sie dies nicht in der Produktion.RUMORS_LINE_BOT_URL
: Server Public URL, mit der Tutorial -Image -URLs und Auth Callback -URL der Zeilenmeldung generiert werden. Sie benötigen Node.JS
16+, um fortzufahren.
$ npm i
Peripheriegeräte wie Redis und MongoDB mit:
$ docker-compose up -d
Drehen Sie dann die Anwendung, einschließlich Chatbot-Server und Webpack-dev-Server für LIFF, unter Verwendung:
$ npm run dev
Der Server wird auf localhost:5001
(oder der PORT
den Sie in Ihrer .env
-Datei angegeben) gestartet.
Wenn Sie die Peripheriegeräte stoppen möchten, führen Sie docker-compose stop
aus.
Führen Sie einfach npm test
aus. Es wird automatisch den oben genannten Docker aufdrehen und Unit -Tests durchführen.
Wir empfehlen, ngrok
zu verwenden, um eine öffentliche Adresse zu erstellen, die den Datenverkehr vom Linienserver auf Ihre lokale Maschine leitet. Mit ngrok
auf deinem Weg, nur
$ ngrok http 5001
ngrok
gibt Ihnen eine öffentliche URL. Verwenden Sie dies, um die Webhook -URL Ihres Kanals festzulegen (siehe Abschnitt "Kanalkonsole" im offiziellen Tutorial für Linien).
Wir empfehlen, die NGROK -Konfigurationsdatei zu verwenden, um einen Tunnel mit einer festen subdomain
einzurichten. Auf diese Weise kann die öffentliche URL festgelegt werden (bedeutet, dass keine wiederholten Kopierkopie für die Leitungskanaleinstellungen!), Solange die subdomain
nicht von anderen besetzt ist.
In Inside Line Developers Console In Ihrem Nachrichten -API -Kanal setzen Sie unter Messaging -API> Webhook -Einstellungen die Webhook -URL auf ${ngrok_url}/callback
und aktivieren Sie die Verwendung von Webhook . Klicken Sie auf Verifizieren, um zu bestätigen, dass es erfolgreich mit Ihrer lokalen Maschine verbunden ist.
Wir verwenden LIFF, um den Grund des Benutzers bei der Übermittlung von Artikeln und negativen Feedbacks zu sammeln.
Wenn Sie keinen LIFF entwickeln müssen, können Sie LIFF_URL
direkt verwenden, das in .env.sample
bereitgestellt wird, das mit der Staging -Liff -Site verknüpft wird.
Wenn Sie LIFF ändern möchten, müssen Sie möglicherweise die folgenden Schritte befolgen:
Um LIFF -Apps zu erstellen, befolgen Sie bitte Anweisungen im offiziellen Dokument, mit dem sich dies handelt
chat_message.write
in Scope (für LIFF zum Senden von Nachrichten) nach dem Erwerb von Liff -URL in .env
als LIFF_URL
.Endpoint URL
fest, um mit Ihrem Chabbot -Endpunkt zu beginnen, und fügen Sie /liff/index.html
als Postfix hinzu. Um LIFF zu entwickeln, ist nach npm run dev
unter /liff/index.html
von Dev Server (http: // localhost: 5001) oder im Produktions -Chatbot -Server zugänglich.
Im Entwicklungsmodus dreht es einen Webpack-Dev-Server auf localhost:
(Standard zu 8080
) und /liff
von Chatbot Server-Proxies Alle Anforderungen an den Webpack-Dev-Server.
Ein Tipp zur Entwicklung von Liff im Browser ist:
https:///liff/index.html?p=&...
im Desktop-Browser.liff.logout()
manuell in JS-Konsole eingeben, um ein Re-Login auszulösen. liff.init()
würde weiterhin im Desktop -Browser arbeiten, damit die App die Anwendung ermöglicht und uns ermöglicht, Weblayouts auf Desktop zu debuggen. liff.sendMessages()
würde jedoch nicht funktionieren. liff.closeWindow()
funktioniert auch nicht, wenn Ihr Browserfenster Anmeldemerkanal durchlaufen hat.
Der Linien -Bot -Server startet einen GraphQL -Server, der COFACT -GraphQL -API und API -spezifisch für den Zeilen -Chatbot spezifisch ist.
Wenn COFACT -API -Updates, verwenden Sie npm run cofactsapi
um das neueste Cofakt -API -Schema zu erhalten.
Verwenden Sie während der Entwicklung den folgenden Befehl, um ein Storybook auf Ihrer lokalen Maschine zu starten:
npm run storybook # Then visit http://localhost:6006
Sie können auch https://cofacts.github.io/rumors-line-bot für vorgebautes Storybook in master
Branch besuchen.
Bei der Produktion werden LIFF -Dateien in /liff
-Verzeichnis zusammengestellt und vom Chatbot -Server als statische Dateien dienen.
Wenn Sie 400 bad request
in Liff erhalten, suchen Sie bitte nach liff.init
-Funktion in kompilierten JS -Binary und prüfen Sie, ob die LIFF -ID mit Ihrer LIFF -URL übereinstimmt. Dies sollte der Weg sein, ohne https://liff.line.me/
zu führen .
Die LIFF -ID wird mit Webpack Define -Plugin während des Builds festgelegt, wodurch die Liff -URL -Variable ohne Wiederaufbau der Liff -Binärdateien 400 schlechte Anfragen verursacht.
Wir verwenden TTAG, um die Build-Time I18N für den Chatbot zu unterstützen.
Weitere Informationen zur Übersetzung finden Sie in TTAG -Dokumentation, um Zeichenfolgen zu übersetzen.
Verwenden Sie, um annotierte Zeichenfolgen an Übersetzungsdateien zu extrahieren:
$ npm run i18n:extract
Die Übersetzungsdateien befinden sich unter i18n/
im GetText PO -Format.
en_US.po
: Da die in Code verwendete Sprache bereits Englisch ist, gibt es 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 i18n:extract
und i18n:validate
script in package.json
um den Gebietswechsel widerzuspiegeln.
Standardmäßig wird der Chatbot unter en_US
Gebietsschema erstellt.
LOCALE
Sie auf Heroku bitte einen von en_US
, zh_TW
oder einem anderen Sprachcode, der unter i18n/
verzeichnis besteht.
Wenn Sie stattdessen mit Docker erstellen möchten, müssen Sie möglicherweise Dockerfile ändern, um das gewünschte LOCALE
zu enthalten.
Voraussetzungen:
Um Push -Nachricht zu verwenden: In .env
-Datei setzt setzt NOTIFY_METHOD=PUSH_MESSAGE
fest
Zur Verwendung von Zeilen benachrichtigen:
Callback Url
: RUMORS_LINE_BOT_URL
/authcallback /line_notify.env
-Datei, Sets 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/
Sie können einen Einstiegspunkt der Einstellungsseite ( LIFF_URL
? P = Einstellung) im Account Manager -> Rich -Menü einrichten
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
Gerüchte-Line-Bot verwendet Google Cloud-Dienste, die mithilfe von Google Cloud-Service-Konten und Anwendungsausfall-Anmeldeinformationen authentifiziert und autorisiert werden.
Bitte erstellen Sie ein Servicekonto unter dem Projekt, laden Sie seinen Schlüssel herunter und verwenden Sie GOOGLE_APPLICATION_CREDENTIALS
Env Var, um den Pfad zu Ihrem heruntergeladenen Service -Konto -Schlüssel zu geben. Weitere Details finden Sie in der Dokumentation.
Wir verwenden den Dialogflow, um festzustellen, ob der Benutzer versucht, Chat-Chat zu erzielen. Wenn die Benutzereingabe einen der Dialogflow -Absätze entspricht, können wir in dieser Absicht die vordefinierten Antworten direkt zurückgeben.
Um den Dialogflow zu verwenden, machen Sie bitte das folgende Setup:
dialogflow.sessions.detectIntent
ARBEITUNG hat.DAILOGFLOW_LANGUAGE
: leer zur Standardsprache des Agenten, oder Sie können eine Sprache angeben.DAILOGFLOW_ENV
: Standard für den Entwurf von Agenten oder Sie können verschiedene Versionen erstellen. Erstellen Sie ein benutzerdefiniertes (Benutzerumfang) Dimemsion für Message Source
und eine benutzerdefinierte (Hit Scope) Metrix für Group Members Count
. Beide Standard -Index beträgt 1. Wenn die erstellten Indizes GA nicht 1 sind, finden Sie cd1
und cm1
im Code und ändern Sie sie in cd$theIndexGACreated
bzw. cm$theIndexGACreated
.
Verwenden Sie npm run typecheck
aus, um die Typen zu überprüfen. Verwenden Sie npm run typegen
, um Typen aus dem GraphQL -Schema zu generieren.
Bereiten Sie .env
Datei (die mit Ihrer Bereitstellungsumgebung identisch sein sollten) und führen Sie docker build .
Docker -Bild zu generieren.
.env
wird auf das Builder -Bild kopiert, um mit der Env LIFF -statische Datei zu generieren. Wenn Sie das Bild erstellen, können Sie nur die "Build-Time-Variablen" (bezeichnet in .env.sample
) in .env
einbeziehen, um sicherzustellen, dass im erstellten Client-Code keine Serveranmeldeinformationen durchgesickert sind.
Da erstellte Docker-Bilder öffentliche URLs in staatlich erstellte Dateien codieren, werden diese Erstellzeitvariablen, wenn wir das Bild als Container ausführen. Daher erfordert jede separate Bereitstellungsumgebung einen separaten Aufbau des Bildes.
Sie können das erstellte Bild lokal mit der docker-compose.yml
testen. Überzeugen Sie einfach den Abschnitt "Linienbot" und geben Sie den erstellten Bildnamen an.
Für die Produktion finden Sie in Gerüchten für Probe docker-coompose.yml
das ein solches Bild ausführt.
Wir schieben Variablen und Ereignisse im 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 füllt die folgenden benutzerdefinierten Ereignisse in GTM dataLayer
:
dataLoaded
- Wenn Daten in Artikel-, Kommentar- oder Feedback -Liff geladen werden.routeChangeComplete
- Wenn LIFF geladen ist oder sich verändert.feedbackVote
- Wenn der Benutzer ein Feedback einreicht.chooseArticle
- Wenn der Benutzer einen Artikel in Articles Liff auswählt. Außerdem wird die folgende benutzerdefinierte Variable in dataLayer
weitergegeben.
pagePath
- Setzen Sie, wenn routeChangeComplete
Event feuert. Der Seitenweg vom Router von Liff.userId
- Set nach dem Erhalt von ID -Token und decodiert die Zeilenbenutzer -ID innen.articleId
und replyId
: Setzen Sie sich auf Artikel, Kommentar und Feedback onMount()
Lebenszyklus werden aufgerufen. Oder wenn chooseArticle
-Ereignis abgefeuert wird.doc
- Setzen Sie, wenn dataLoaded
Ereignis feuert. Der geladene Inhalt selbst im Objekt (Artikel in Artikelliff, Kommentar in Kommentarliff und Feedback in Feedback Liff). Event -Format gesendet: Event category
/ Event action
/ Event label
Wir verwenden Dimension Message Source
(benutzerdefinierte Dimemsion1), um verschiedene Ereignisquellen zu klassifizieren
user
für 1 auf 1 Nachrichtenroom
| group
für GruppennachrichtenUserInput
/ MessageType
/
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/
Für jeden gefundenen ArtikelUserInput
/ ArticleSearch
/ ArticleNotFound
UserInput
/ ArticleSearch
/ ArticleFoundButNoHit
UserInput
/ IsForwarded
/ Yes
| No
UserInput
/ IsCooccurrence
/ Yes
| No
UserInput
/ ChatWithBot
/
Article
/ Selected
/
Reply
/ Search
/
für jede AntwortenArticle
/ NoReply
/
Reply
/ Selected
/
Reply
/ Type
/
UserInput
/ Feedback-Vote
/ /
/feedback/yes
oder /feedback/no
gesendet.Article
/ Create
/ Yes
Article
/ Create
/ No
Article
/ ProvidingReason
/
/reason
gesendet./articles
wird gesendetutm_source=rumors-line-bot&utm_medium=richmenu
utm_source=rumors-line-bot&utm_medium=push
LIFF
/ ChooseArticle
/
utm_source
, utm_medium
./setting
wird gesendetutm_source=rumors-line-bot&utm_medium=reply-request
&utm_source=rumors-line-bot&utm_medium=tutorial
in Tutorial eröffnet wird:Tutorial
/ Step
/ ON_BOARDING
Tutorial
/ Step
/ RICH_MENU
Tutorial
/ Step
/
Group
/ Join
/ 1
( Event category
/ Event action
/ Event value
)Group Members Count
(benutzerdefinierte Metrik1), um Gruppenmitglieder zu zählen, als Chatbot beigetreten ist.Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)Notiz:
- Wir setzen GA Event Value 1 als Join, -1 als Urlaub. Um zu wissen, dass die gesamten Gruppen zählen, werden Chatbot derzeit angeschlossen, Sie können den Gesamtereigniswert direkt sehen (Details siehe implizite Anzahl).
- Um zu wissen, dass eine Gruppe derzeit verbunden ist oder angelegt ist, sollten Sie die letzte
Join
oderLeave
Aktion derClient Id
finden.- Außerdem sollten Sie die letzte
Join
-Aktion derClient Id
finden, um eine genauereGroup Members Count
zu erhalten.Group Members Count
wird nur aufgezeichnet, wenn Chatbot zu einer Gruppe kam, um die genaue Zählung zu kennen.
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/
Für jeden gefundenen ArtikelArticle
/ Selected
/
Reply
/ Selected
/
UserInput
/ Intro
/ContentProxy
/ Forward
/
/
(Wert) LICENSE
definiert die Lizenzvereinbarung für den Quellcode in diesem Repository.
LEGAL.md
ist die Benutzervereinbarung für Cofacts -Website -Benutzer.