メッセージにネット上の噂が含まれているかどうかをチェックするラインボット。
これは真的假的のサブプロジェクトの 1 つです。
この状態図は、LINE ボットがユーザーとどのように会話するかを示しています。
噂-line-botを開発するには、以下の設定を完了する必要があります。
このリポジトリのクローンを作成し、プロジェクト ディレクトリに cd した後、依存関係をインストールします。
$ 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
: LINE Notifyのチュートリアル画像URLと認証コールバック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サイトにリンクするLIFF_URL
直接使用できます。
LIFF を変更する場合は、次の手順に従う必要がある場合があります。
LIFFアプリを作成するには、公式ドキュメントの指示に従ってください。
chat_message.write
を選択(LIFFがメッセージを送信するため) LIFF URLを取得したら、 .env
にLIFF_URL
として配置します。Endpoint URL
設定し、接尾辞として/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 ボットサーバーは、Cofacts GraphQL API と LINE チャットボット固有の API を結合する GraphQL サーバーを起動します。
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と一致しているかどうかを確認してください。LIFF URLは、 https://liff.line.me/
先頭のないパスである必要があります。 。
LIFF IDは、ビルド中にWebpack Defineプラグインを使用して設定されるため、LIFFバイナリを再構築せずにLIFF URL環境変数を交換すると、400不正なリクエストが発生します。
チャットボットのビルドタイム i18n をサポートするために ttag を使用します。
翻訳する文字列の注釈については、ttag のドキュメントを参照してください。
注釈付き文字列を翻訳ファイルに抽出するには、次を使用します。
$ npm run i18n:extract
翻訳ファイルは、Gettext PO 形式でi18n/
の下にあります。
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 を使用してビルドする場合は、必要なLOCALE
含めるように Dockerfile を変更する必要がある場合があります。
前提条件:
プッシュ メッセージを使用するには: .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
噂-line-bot は、Google Cloud サービス アカウントとアプリケーションのデフォルト認証情報を使用して認証および承認される Google クラウド サービスを使用します。
プロジェクトの下にサービス アカウントを作成し、そのキーをダウンロードし、 GOOGLE_APPLICATION_CREDENTIALS
環境変数を使用して、ダウンロードしたサービス アカウント キーへのパスを指定してください。詳細についてはドキュメントを参照してください。
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
ビルダー イメージにコピーされ、その環境を含む LIFF 静的ファイルが生成されます。イメージをビルドするときに、「ビルド時変数」( .env.sample
で示される) を.env
に含めるだけで、ビルドされたクライアント コードでサーバーの資格情報が漏洩しないようにすることができます。
ビルドされた Docker イメージはパブリック URL を静的にビルドされたファイルにエンコードするため、イメージをコンテナーとして実行するときにこれらのビルド時変数が使用されます。したがって、個別の展開環境ごとにイメージの個別のビルドが必要になります。
docker-compose.yml
使用して、ビルドされたイメージをローカルでテストできます。ラインボットセクションのコメントを解除し、ビルドされたイメージ名を指定するだけです。
実稼働環境については、このようなイメージを実行するサンプルdocker-coompose.yml
については、rumors-deploy を参照してください。
ユーザーがLIFFを操作するときに、GoogleタグマネージャーのdataLayer
に変数とイベントをプッシュします。
.env
ファイルで次のセットアップを準備できます。
GTM_ID
: Google タグ マネージャー コンテナ ID ( GTM-XXXXXXX
)アプリケーションは GTM dataLayer
で次のカスタム イベントを起動します。
dataLoaded
- データが記事、コメント、またはフィードバック LIFF にロードされるとき。routeChangeComplete
- LIFFがロードされたとき、またはパスが変更されたとき。feedbackVote
- ユーザーがフィードバックを送信したとき。chooseArticle
- ユーザーが Articles LIFF で記事を選択するとき。また、次のカスタム変数をdataLayer
にプッシュします。
pagePath
- routeChangeComplete
イベントが発生したときに設定されます。 LIFFのルーターからのページパス。userId
- LIFFがIDトークンを取得し、内部のLINEユーザーIDをデコードした後に設定されます。articleId
とreplyId
: 記事、コメント、フィードバックに設定されますonMount()
ライフサイクルが呼び出されます。または、 chooseArticle
イベントが発生したとき。doc
- dataLoaded
イベントが発生したときに設定されます。オブジェクトに読み込まれたコンテンツ自体 (記事 LIFF の記事、コメント LIFF のコメント、フィードバック LIFF のフィードバック)。 送信イベント形式: Event category
/ Event action
/ Event label
ディメンションMessage Source
(カスタム ディメンション 1) を使用して、さまざまなイベント ソースを分類します。
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
アクションを見つける必要があります。- また、より正確な
Group Members Count
を取得するには、Client Id
の最後のJoin
アクションを見つける必要があります。Group Members Count
、チャットボットがグループに参加したときにのみ記録されます。正確な数を知るには、line message-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 Web サイト ユーザー向けのユーザー契約です。