檢查訊息是否包含網路謠言的線路機器人。
這是真的假的子項目之一。
此狀態圖描述了 LINE 機器人如何與使用者對話:
開發Rules-line-bot需要您完成以下設定。
將此儲存庫複製到專案目錄後,然後安裝相依性。
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
請按照LINE官方教程中的所有步驟進行操作。
從.env.sample
模板建立.env
文件,至少填寫:
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>
其他可自訂的環境變數有:
REDIS_URL
:如果未給出,則使用redis://127.0.0.1:6379
。PORT
:線路機器人伺服器將偵聽哪個連接埠。GTM_ID
:Google 追蹤代碼管理員 ID。對於我們推送到dataLayer
事件和變量,請參閱下面的「Google 追蹤程式碼管理器」部分。DEBUG_LIFF
:停用 LIFF 中的外部瀏覽器檢查。在外部瀏覽器中調試 LIFF 時很有用。不要在生產中啟用此功能。RUMORS_LINE_BOT_URL
:伺服器公用 url,用於產生 LINE Notify 的教學圖片 url 和驗證回呼 url。您需要Node.JS
16+ 才能繼續。
$ npm i
使用以下方法啟動 Redis 和 MongoDB 等週邊設備:
$ docker-compose up -d
然後啟動應用程序,包括聊天機器人伺服器和 LIFF 的 webpack-dev-server,使用:
$ npm run dev
伺服器將在localhost:5001
(或您在.env
檔案中指定的PORT
)上啟動。
如果您想停止週邊設備,請執行docker-compose stop
。
只需運行npm test
。它將自動啟動上述 docker 並執行單元測試。
我們建議使用ngrok
建立一個公共位址,將流量從 LINE 伺服器引導到您的本機電腦。當ngrok
在你的路上時,只需
$ ngrok http 5001
ngrok
將為您提供一個公共 URL。使用它來設定頻道的 webhook URL(請參閱 LINE 官方教學中的「頻道控制台」部分)。
我們建議使用 ngrok 設定檔來設定具有固定subdomain
隧道。這樣,只要subdomain
不被其他人佔用,公共 URL 就可以固定(意味著無需重複複製並貼上到 LINE 頻道設定!)。
在 Message API 頻道的 LINE Developers 控制台內,在 Messaging API > Webhook 設定下,將Webhook URL設為${ngrok_url}/callback
並啟用Use webhook 。按一下「驗證」以確認已成功連線至本機。
我們使用 LIFF 來收集用戶提交文章和負面回饋的原因。
如果您不需要開發 LIFF,可以直接使用.env.sample
中提供的LIFF_URL
,該 URL 連結到暫存 LIFF 網站。
如果您想修改LIFF,您可能需要按照以下步驟操作:
要建立 LIFF 應用程序,請按照官方文件中的說明進行操作,其中涉及
chat_message.write
(供LIFF傳送訊息)取得LIFF URL後,將其放置在.env
中作為LIFF_URL
。Endpoint URL
設定為以 chabbot 端點開頭,並加上/liff/index.html
作為後綴。 要開發 LIFF,在npm run dev
後,可以在開發伺服器(http://localhost:5001)或生產聊天機器人伺服器的/liff/index.html
下存取它。
在開發模式下,它在localhost:<LIFF_DEV_PORT>
(預設為8080
)上旋轉 webpack-dev-server,聊天機器人伺服器的/liff
將所有請求代理到 webpack-dev-server。
在瀏覽器中開發 LIFF 的技巧是:
https://<your-dev-chatbot.ngrok.io>/liff/index.html?p=<page>&...
liff.logout()
來觸發重新登入。 liff.init()
仍然可以在桌面瀏覽器中工作,以便應用程式呈現,使我們能夠在桌面上調試 Web 佈局。不過, liff.sendMessages()
不起作用。如果您的瀏覽器視窗已經歷登入重新導向, liff.closeWindow()
也將無法運作。
LINE 機器人伺服器啟動一個 GraphQL 伺服器,該伺服器縫合 Cofacts GraphQL API 和 LINE 聊天機器人特定的 API。
每當 Cofacts API 更新時,請使用npm run cofactsapi
來取得最新的 Cofacts API 架構。
在開發過程中,使用以下命令在本機電腦上啟動故事書:
npm run storybook # Then visit http://localhost:6006
您也可以造訪 https://cofacts.github.io/rumors-line-bot 在master
分支上預先建立故事書。
在生產中,LIFF 檔案被編譯到/liff
目錄並由聊天機器人伺服器用作靜態檔案。
如果您在 LIFF 中收到400 bad request
,請在編譯的 JS 二進位檔案中搜尋liff.init
函數調用,看看 LIFF ID 是否與您的 LIFF URL 一致,該 URL 應該是不帶前導的路徑https://liff.line.me/
。
LIFF ID 是在建置期間使用 Webpack Define 外掛程式設定的,因此在不重建 LIFF 二進位檔案的情況下交換 LIFF URL 環境變數將導致 400 錯誤請求。
我們使用 ttag 來支援聊天機器人的建置時 i18n。
請參閱 ttag 文件以註解要翻譯的字串。
若要將註釋的字串提取到翻譯文件,請使用:
$ npm run i18n:extract
翻譯檔案位於i18n/
下,採用 Gettext PO 格式。
en_US.po
:由於程式碼中使用的語言已經是英語,因此存在這個空翻譯檔案以簡化設定。zh_TW.po
:繁體中文翻譯。ja.po
:日文翻譯。 您可以利用 Gettext msginit
命令將其替換為您想要支援的任何語言。
您需要更改package.json
中的i18n:extract
和i18n:validate
腳本以反映區域設定變更。
預設情況下,聊天機器人將在en_US
語言環境下建置。
在 Heroku 上,請將LOCALE
設定為en_US
、 zh_TW
或i18n/
目錄下存在的任何其他語言代碼之一。
如果您想使用 docker 進行構建,則可能需要修改 Dockerfile 以包含所需的LOCALE
。
先決條件:
若要使用推播訊息:在.env
檔案中,設定NOTIFY_METHOD=PUSH_MESSAGE
若要使用 LINE 通知:
Callback Url
: RUMORS_LINE_BOT_URL
/authcallback/line_notify.env
檔中,設定 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>
您可以在帳戶管理員 -> 豐富選單中設定設定頁面入口點( LIFF_URL
?p=setting)
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
傳聞線機器人使用Google雲端服務,該服務使用Google雲端服務帳戶和應用程式預設憑證進行身份驗證和授權。
請在專案下建立服務帳戶,下載其金鑰並使用GOOGLE_APPLICATION_CREDENTIALS
env var 提供下載的服務帳戶金鑰的路徑。詳細資訊請參閱文件。
我們使用 Dialogflow 來偵測使用者是否正在嘗試聊天。如果使用者輸入與任何 Dialogflow 意圖匹配,我們可以直接傳回該意圖中的預定義回應。
若要使用 Dialogflow,請執行下列設定:
dialogflow.sessions.detectIntent
權限。DAILOGFLOW_LANGUAGE
:為空,為代理程式的預設語言,或您可以指定一種語言。DAILOGFLOW_ENV
:預設為草稿代理,或者您可以建立不同的版本。為Message Source
建立自訂(使用者範圍)維度,並為Group Members Count
建立自訂(命中範圍)矩陣。兩者cd1
cm$theIndexGACreated
cd$theIndexGACreated
cm1
。
使用npm run typecheck
檢查類型;使用npm run typegen
從 GraphQL 模式產生類型。
準備.env
檔案(應與您的部署環境相同)並執行docker build .
產生docker映像。
.env
將被複製到建構器映像,以使用 env 產生 LIFF 靜態檔案。建立鏡像時,您可以在.env
中包含「建置時變數」(在.env.sample
中表示),以確保建置的用戶端程式碼中不會洩漏伺服器憑證。
由於建置的 docker 映像會將公用 URL 編碼到靜態建置的檔案中,因此當我們將映像作為容器執行時,這些建置時變數。因此,每個單獨的部署環境都需要單獨建置映像。
您可以使用docker-compose.yml
在本機測試建置的映像;只需取消註釋 line bot 部分並提供已建置的映像名稱即可。
對於生產,請參閱謠言部署以取得運行此類映像的範例docker-coompose.yml
。
當使用者與 LIFF 互動時,我們將變數和事件推送到 Google 追蹤程式碼管理器的dataLayer
。
您可以在.env
檔案中準備以下設定:
GTM_ID
:Google 追蹤代碼管理器容器 ID ( GTM-XXXXXXX
)應用程式將在 GTM dataLayer
中觸發以下自訂事件:
dataLoaded
- 當資料載入到文章、評論或回饋 LIFF 中。routeChangeComplete
- 當 LIFF 載入或更改路徑。feedbackVote
- 當使用者提交回饋時。chooseArticle
- 當使用者在文章 LIFF 中選擇一篇文章。此外,它會將以下自訂變數推送到dataLayer
;
pagePath
- 當routeChangeComplete
事件觸發時設定。來自 LIFF 路由器的頁面路徑。userId
- 在 LIFF 取得 ID 令牌並解碼內部的 LINE 使用者 ID 後設定。articleId
和replyId
:在文章、評論和回饋上設定onMount()
生命週期被呼叫。或當chooseArticle
事件被觸發時。doc
- 當dataLoaded
事件觸發時設定。物件中載入的內容本身(Article LIFF 中的文章、Comment LIFF 中的評論和feedback LIFF 中的回饋)。 傳送事件格式: Event category
/ Event action
/ Event label
我們使用維度Message Source
(Custom Dimemsion1)來對不同的事件來源進行分類
user
room
| group
用於群組訊息UserInput
/ MessageType
/ <text | image | video | ...>
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
找到的每篇文章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>
Article
/ NoReply
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
Reply
/ Type
/ <selected reply's type>
UserInput
/ Feedback-Vote
/ <articleId>/<replyId>
/feedback/yes
或/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
、 utm_medium
等 URL 參數也適用。/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
(自訂指標1)用於記錄聊天機器人加入時的群組成員數。Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)筆記:
- 我們將 ga 事件值 1 設定為加入,-1 設定為離開。若要了解目前加入的聊天機器人的總群組數,您可以直接查看總事件值(詳細資訊請參閱隱式計數)。
- 若要了解目前群組是加入還是離開,您應該會找到
Client Id
的最後一次Join
或Leave
操作。- 此外,您還應該找到
Client Id
的最後一個Join
操作,以獲得更準確的Group Members Count
。Group Members Count
僅在聊天機器人加入群組時記錄,要知道確切的計數,您應該直接從 line messages-api 獲取。
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/ <article id>
找到的每篇文章Article
/ Selected
/ <selected article id>
Reply
/ Selected
/ <selected reply id>
UserInput
/ Intro
/ContentProxy
/ Forward
/ <content type>
/ <content length>
(值) LICENSE
定義此儲存庫中原始程式碼的授權協議。
LEGAL.md
是 Cofacts 網站使用者的使用者協議。