Bot de linha que verifica se uma mensagem contém boatos na Internet.
Este é um dos subprojetos de 真的假的。
Este diagrama de estado descreve como o bot da linha fala com os usuários:
O desenvolvimento de rumores-line-bot exige que você termine as seguintes configurações.
Depois de clonar este repositório e CD no diretório do projeto, instale as dependências.
$ git clone --recursive [email protected]:cofacts/rumors-line-bot.git # --recursive for the submodules
$ cd rumors-line-bot
Por favor, siga todas as etapas na fila do tutorial oficial.
Crie o arquivo .env
do modelo .env.sample
, pelo menos preencha:
API_URL=https://dev-api.cofacts.tw/graphql
LINE_CHANNEL_SECRET=
LINE_CHANNEL_TOKEN=
LINE_LOGIN_CHANNEL_ID=
LIFF_URL=
Outros vars de env personalizáveis são:
REDIS_URL
: se não for dado, redis://127.0.0.1:6379
é usado.PORT
: em qual porta o servidor de bot de linha ouvirá.GTM_ID
: ID do gerenciador de tags do Google. Para os eventos e variáveis que pressionamos ao dataLayer
, consulte a seção "Google Tag Manager" abaixo.DEBUG_LIFF
: desativa o navegador externo Check in liff. Útil ao depurar Liff em navegador externo. Não habilite isso na produção.RUMORS_LINE_BOT_URL
: URL público do servidor, que é usado para gerar URLs de imagem tutorial e URL de retorno de chamada de autenticação da linha Notificar. Você precisará de Node.JS
16+ para prosseguir.
$ npm i
Spin periféricos como Redis e MongoDB usando:
$ docker-compose up -d
Em seguida, gire o aplicativo, incluindo o Chatbot Server e o Webpack-dev-server para LIFF, usando:
$ npm run dev
O servidor será iniciado no localhost:5001
(ou a PORT
que você especificou no seu arquivo .env
.)
Se você deseja interromper os periféricos, execute docker-compose stop
.
Basta executar npm test
. Ele aumentará automaticamente o docker acima mencionado e executará testes de unidade.
Recomendamos o uso ngrok
para criar um endereço público que direciona o tráfego do servidor de linha para a máquina local. Com ngrok
em seu caminho, apenas
$ ngrok http 5001
ngrok
lhe dará um URL público. Use isso para definir o URL da webhook do seu canal (consulte a seção "Console do canal" no tutorial oficial da linha).
Recomendamos o uso do arquivo de configuração do NGROK para configurar um túnel com um subdomain
fixo. Dessa maneira, o URL público pode ser corrigido (significa que não há repetição de cópia para as configurações de canal de linha!), Desde que o subdomain
não esteja ocupado por outros.
Desenvolvedores de linha interna console em seu canal de API de mensagem, em API de mensagens> Configurações do WebHook Defina o URL do WebHook como ${ngrok_url}/callback
e ligue o use webhook . Clique em Verificar para confirmar que está conectado com sucesso à sua máquina local.
Estamos usando o LIFF para coletar a razão do usuário ao enviar artigo e feedbacks negativos.
Se você não precisar desenvolver o LIFF, poderá usar diretamente LIFF_URL
fornecido em .env.sample
, que se vincula ao site da LIFF.
Se você deseja modificar o LIFF, pode ser necessário seguir estas etapas:
Para criar aplicativos LIFF, siga as instruções no documento oficial, que envolve
chat_message.write
in Scope (para LIFF enviar mensagens) Após a aquisição de URL do LIFF, coloque -o em .env
como LIFF_URL
.Endpoint URL
para começar com o seu fim de extremidade chabbot e adicione /liff/index.html
como postfix. Para desenvolver o LIFF, após npm run dev
, ele é acessível em /liff/index.html
do servidor dev (http: // localhost: 5001) ou servidor de chatbot de produção.
No modo de desenvolvimento, ele gira um webpack-dev-server no localhost:
(padrão para 8080
) e /liff
of chatbot server proxies todas as solicitações para o webpack-dev-server.
Uma dica para desenvolver Liff no navegador é:
https:///liff/index.html?p=&...
no navegador da área de trabalho.liff.logout()
manualmente no console JS para acionar um re-login. liff.init()
ainda funcionaria no navegador de desktop, para que o aplicativo renderize, permitindo -nos depurar layouts da Web na área de trabalho. liff.sendMessages()
não funcionaria. liff.closeWindow()
também não funcionará se a janela do navegador tiver passado por redirecionamentos de login.
O servidor de bots da linha inicia um servidor grafql que enrola a API do cofact GraphQL e a API específica para o chatbot de linha.
Sempre que o Cofacts API Atualizações, use npm run cofactsapi
para buscar o esquema mais recente da API do Cofacts.
Durante o desenvolvimento, use o seguinte comando para iniciar um livro de histórias em sua máquina local:
npm run storybook # Then visit http://localhost:6006
Você também pode visitar https://cofacts.github.io/rumors-line-bot para o livro de histórias pré-construído no master
Branch.
Na produção, os arquivos LIFF são compilados para /liff
Directory e servidos como arquivos estáticos pelo servidor Chatbot.
Se você receber 400 bad request
no LIFF, procure por liff.init
Função Chamada no Binário JS compilado e veja se o ID do LIFF é consistente com o seu URL do LIFF, que deve ser o caminho sem liderar https://liff.line.me/
.
O ID do LIFF está definido usando o plug -in do WebPack Definir durante a compilação, trocando a variável LIFF URL ENV sem reconstruir os binários do LIFF, causará 400 pedidos ruins.
Usamos o TTAG para suportar o I18N no tempo de construção para o chatbot.
Consulte a documentação da TTAG para anotar strings para traduzir.
Para extrair strings anotados para arquivos de tradução, use:
$ npm run i18n:extract
Os arquivos de tradução estão localizados em i18n/
, no formato GetText PO.
en_US.po
: Como o idioma usado no código já é inglês, esse arquivo de tradução vazio existe para simplificar as configurações.zh_TW.po
: Tradução tradicional chinesa.ja.po
: Tradução japonesa. Você pode substituir isso por qualquer idioma que desejar suportar, aproveitando o comando getText msginit
.
Você precisará alterar i18n:extract
e i18n:validate
script no package.json
para refletir a alteração do local.
Por padrão, o chatbot será construído no Locale en_US
.
No Heroku, defina LOCALE
como um de en_US
, zh_TW
ou qualquer outro código de idioma que exista no i18n/
diretório.
Se você deseja construir usando o Docker, pode ser necessário modificar o DockerFile para incluir o LOCALE
desejado.
Pré -requisitos:
Para usar a mensagem push: no arquivo .env
, define NOTIFY_METHOD=PUSH_MESSAGE
Para usar a linha notificar:
Callback Url
: RUMORS_LINE_BOT_URL
/authcallback /line_notify.env
, define 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/
Você pode configurar um ponto de entrada da página de configuração ( LIFF_URL
? P = Configuração) no Gerenciador de Contas -> Menu Rich
$ npm run notify
$ node build/scripts/scanRepliesAndNotify.js
Os rumores-line-bot usam serviços do Google Cloud autenticados e autorizados usando as contas do Google Cloud Service e as credenciais padrão do aplicativo.
Crie uma conta de serviço no projeto, faça o download de sua chave e use GOOGLE_APPLICATION_CREDENTIALS
Env var para fornecer o caminho para a chave da conta de serviço baixada. Consulte a documentação para obter detalhes.
Utilizamos o diálogo para detectar se o usuário está tentando fazer chat. Se a entrada do usuário corresponder a qualquer uma das intenções de fluxo de diálogo, podemos retornar diretamente as respostas predefinidas nessa intenção.
Para usar o DialogFlow, faça a seguinte configuração:
dialogflow.sessions.detectIntent
permissão.DAILOGFLOW_LANGUAGE
: vazio para o idioma padrão do agente ou você pode especificar um idioma.DAILOGFLOW_ENV
: padrão para redigir agente ou você pode criar versões diferentes. Crie uma dimensão personalizada (escopo do usuário) para Message Source
e uma metrice personalizada (Hit Scope) para Group Members Count
. Ambos os índices padrão são 1. Se os índices GA criados não forem 1, encontre cd1
e cm1
no código e altere -os para cd$theIndexGACreated
e cm$theIndexGACreated
respectivamente.
Use npm run typecheck
para verificar os tipos; Use npm run typegen
para gerar tipo de esquema grafql.
Prepare o arquivo .env
(que deve ser idêntico ao seu ambiente de implantação) e execute docker build .
Para gerar imagem do Docker.
.env
será copiado para a imagem do construtor para gerar arquivo estático liff com o Env. Ao criar a imagem, você pode incluir apenas as "variáveis de tempo de construção" (indicadas em .env.sample
) no .env
para garantir que nenhuma credenciais do servidor seja vazada no código do cliente construído.
Como as imagens do Docker construídas codificarão URLs públicos em arquivos estaticamente construídos, essas variáveis de tempo de construção quando executamos a imagem como um contêiner. Portanto, cada ambiente de implantação separado exigirá uma construção separada da imagem.
Você pode testar a imagem construída localmente usando o docker-compose.yml
; Apenas descomemente a seção do bot da linha e forneça o nome da imagem construída.
Para produção, consulte Rumores-de-implantação para amostra docker-coompose.yml
que executa essa imagem.
Emputamos variáveis e eventos no dataLayer
do Google Tag Manager quando o usuário interage com o LIFF.
Você pode preparar a seguinte configuração no arquivo .env
:
GTM_ID
: ID do contêiner do Google Tag Manager ( GTM-XXXXXXX
) O aplicativo demitirá os seguintes eventos personalizados no GTM dataLayer
:
dataLoaded
- Quando os dados são carregados em artigo, comentário ou feedback LIFF.routeChangeComplete
- quando o LIFF é carregado ou muda de caminho.feedbackVote
- quando o usuário enviar um feedback.chooseArticle
- Quando o usuário escolhe um artigo em artigos LIFF. Além disso, ele pressionará a seguinte variável personalizada para dataLayer
;
pagePath
- Defina quando o evento routeChangeComplete
Ofimpes incêndios. O caminho da página do roteador de Liff.userId
- Defina depois que o LIFF recebe token ID e decodifica o ID do usuário da linha dentro.articleId
e replyId
: Situado no artigo, comentário e feedback onMount()
Lifecycle é chamado. Ou quando o evento chooseArticle
é demitido.doc
- Defina quando o evento dataLoaded
Fires. O próprio conteúdo carregado no objeto (artigo no artigo Liff, Comentário no comentário Liff e feedback no feedback Liff). Formato de evento enviado: Event category
/ Event action
/ Event label
Utilizamos Message Source
de dimensão (Dimemsion Custom1) para classificar diferentes fontes de eventos
user
para 1 em 1 mensagensroom
| group
para mensagens de grupoUserInput
/ MessageType
/
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/
Para cada artigo encontradoUserInput
/ ArticleSearch
/ ArticleNotFound
UserInput
/ ArticleSearch
/ ArticleFoundButNoHit
UserInput
/ IsForwarded
/ Yes
| No
UserInput
/ IsCooccurrence
/ Yes
| No
UserInput
/ ChatWithBot
/
Article
/ ID do artigo Selected
/
Reply
/ Search
/
Para cada respostaArticle
/ NoReply
/
Reply
/ Selected
/
Reply
/ Type
/
UserInput
/ Feedback-Vote
/ /
/feedback/yes
ou /feedback/no
também é enviada.Article
/ Create
/ Yes
Article
/ Create
/ No
Article
/ ProvidingReason
/
/reason
também é enviada./articles
é enviadautm_source=rumors-line-bot&utm_medium=richmenu
utm_source=rumors-line-bot&utm_medium=push
LIFF
/ ChooseArticle
/
utm_source
, utm_medium
também se aplica./setting
é enviadautm_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
/
Group
/ Join
/ 1
( Event category
/ Event action
/ Event value
)Group Members Count
(Metric1 personalizado) para registrar membros do grupo contam quando o Chatbot ingressou.Group
/ Leave
/ -1
( Event category
/ Event action
/ Event value
)Observação:
- Definimos o valor do evento GA 1 como ingresso, -1 como licença. Para saber o total de grupos, a contagem de chatbot atualmente ingressou, você pode ver diretamente o valor total do evento (detalhes, consulte a contagem implícita).
- Para saber que um grupo está atualmente unido ou com folhas, você deve encontrar a última
Join
ouLeave
ação doClient Id
.- Além disso, você deve encontrar a última ação
Join
doClient Id
para obter umaGroup Members Count
.Group Members Count
apenas são gravados quando o Chatbot ingressou no grupo, para saber a contagem exata, você deve obtê-lo diretamente do Line Messaging-Api.
UserInput
/ ArticleSearch
/ ArticleFound
Article
/ Search
/
Para cada artigo encontradoArticle
/ ID do artigo Selected
/
Reply
/ Selected
/
UserInput
/ Intro
/ContentProxy
/ Forward
/
/
(Valor) LICENSE
define o contrato de licença para o código fonte deste repositório.
LEGAL.md
é o contrato de usuário para usuários do site do Cofacts.