检查消息是否包含互联网谣言的线路机器人。
这是真的假的的子项目之一。
此状态图描述了 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_APPLICATION_CREDENTIALS
env var 提供下载的服务帐户密钥的路径。详细信息请参阅文档。
我们使用 Dialogflow 来检测用户是否正在尝试聊天。如果用户输入与任何 Dialogflow 意图匹配,我们可以直接返回该意图中的预定义响应。
要使用 Dialogflow,请执行以下设置:
dialogflow.sessions.detectIntent
权限。DAILOGFLOW_LANGUAGE
:为空,为代理的默认语言,或者您可以指定一种语言。DAILOGFLOW_ENV
:默认为草稿代理,或者您可以创建不同的版本。为Message Source
创建自定义(用户范围)维度,并为Group Members Count
创建自定义(命中范围)矩阵。两者默认索引都是1。如果GA创建的索引不为1,则在代码中找到cd1
和cm1
,分别修改为cd$theIndexGACreated
和cm$theIndexGACreated
。
使用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 网站用户的用户协议。