DEV Community

Cover image for BizOps Workspaceで会話を監視し、モデレートする方法

BizOps Workspaceで会話を監視し、モデレートする方法

このハウツー記事は、BizOps Workspaceと総称されるPubNubのデータ管理機能について説明する一連の記事の一部です:

BizOps Workspaceは、アプリケーションの管理に役立つツールのセットです。 この記事では、管理者がリアルタイムで発生している会話のライブ・プレビューを見たり、その会話を手動でモデレートするためのアクションを取ることができる'Channel Monitor'機能について見ていきます。

チャンネルモニターの前提条件

PubNubが推奨するチャットアプリケーションの開発方法は、TypescriptとJavaScriptをサポートする専用のチャットSDKを使用することです。 チャットSDKはPubNubのインフラストラクチャの上に構築されているため、「会話」、「タイピングインジケータ」、「スレッディング」などのチャットのユースケース用に設計されたAPIを使用して、PubNubのスケーラビリティと堅牢性を得ることができます。

チャネルモニタはAppコンテキストを使用するすべてのPubNubアプリケーションで使用できますが、チャットSDKを使用して開発されたものは、スレッドの表示と返信、ユーザーの監視、ミュート、禁止などの追加機能を利用できます。

チャネルモニタの設定

PubNubの専用チャットSDKを使用している場合、メッセージ構造は事前に定義されているため、チャネルモニタの追加設定を心配する必要はありません。

チャットSDKを使用していない開発者は、アプリケーションがどのようにメッセージを構造化し、アプリケーションがどのようにメッセージの編集と削除を処理するかを定義する必要があります。 これは、チャネルモニタを構成することによって行われます。

チャネルモニタのキーセット要件

チャネルモニタを使用するには、PubNub管理ポータルのキーセットで以下を有効にする必要もあります:

  • アプリコンテキスト:これはあなたのチャンネルとユーザーに関するメタデータを保存します。 アプリコンテキストについては「ユーザーとチャンネルの管理」についての以前の記事で詳しく説明しています。 App Contextのデータが変更されたときにアプリが更新を受け取るには、以下を有効にする必要があります:User Metadata Events(ユーザー・メタデータ・イベント)、Channel Metadata Events(チャンネル・メタデータ・イベント)、Membership Events(メンバーシップ・イベント)。

  • メッセージの永続化:これはPubNubにメッセージの履歴を保存し、管理者が会話を確認、編集できるようにします。

PubNubプランに基づく可用性など、その他の要件についてはチャンネルモニターのドキュメントを参照してください。

その他のキーセットプロパティは必須ではありませんが、チャットアプリケーションから最大の利益を得るために強く推奨されます:

  • Access Manager:データへの不正アクセスを防止し、この記事で後述する安全なモデレーションソリューションを作成するために必要です。

  • チャット SDK を使用していると仮定すると、設定ドキュメントには、ユーザーがオンラインかオフラインかを追跡するためのプレゼンスも記載されています。

チャネルモニタとは何ですか?

チャンネル モニターは、チャット モデレーターが複数のチャンネルでリアルタイムに起こっている会話のライブ プレビューを見ることを可能にします。 モデレーターが何か不穏なもの、例えば、行儀の悪いユーザーや不快なメッセージを発見した場合、モデレーターは即座に行動し、問題を軽減するためのアクションを取ることができます。

モデレーターは、どのようなアクションを取るかについて、多くの柔軟性を持っています:

  • アクセス権を制限せずにユーザーを観察する(監視する)

  • 問題のあるメッセージを編集する

  • 問題のあるメッセージを削除する

  • そのユーザーのメッセージ公開を制限する(ミュート)

  • メッセージの読み取りまたは公開を制限する(禁止する)

Monitor "機能はすべて手動です:手動でメッセージを確認する、手動でユーザーをミュートする、などです。自動モデレーションについてはこの記事では説明しません。

チャンネルの監視

チャンネルを監視する" ドキュメントでは、チャンネルのアクティビティを表示するためのステップバイステップの手順を説明します。

要約すると

  1. 管理者ポータルにログインし、左のナビゲーション・パネルのBizOpsワークスペース・セクションに移動し、チャネル・モニタを選択します。BizOps Workspaceセクションが表示されない場合は、PubNubプランをアップグレードする必要があります。

  2. キーセットのAppコンテキストが現在無効になっている場合は有効にするよう促されます。

  3. チャンネルを選択してモデレーションを開始します。チャンネルが1つも表示されないか、チャンネルの一部しか表示されない場合は、チャンネルコンテキストが関連付けられたチャンネルだけが表示されるためです。 チャットSDKが自動的にコンテキストを作成するか、すべてのSDKで利用可能なsetChannelMetadata() APIを使用して手動で作成できます。

  4. 同時にモデレーションを行うチャンネルは5つまで選択できます。

チャンネルメッセージはリアルタイムで表示され、キーセットでパーシステンスを有効にしている場合は過去のメッセージも表示されます。

モニタービューの機能の概要については、'Channel monitor' ドキュメントを参照してください。 この記事の残りの部分では、サンプル実装を参照しながら、メッセージとユーザーのモデレーションについてより詳しく説明します。

チャット SDK サンプルアプリ

チャネルモニタとチャットSDKの開発を担当する同じ多忙なエンジニアリングチームは、チャットSDKを使用するReact Nativeで書かれたサンプルアプリケーションも作成しました。

このサンプルは、SDKの機能だけでなく、PubNubを使用して現実的で完全な機能を備えたチャットアプリを開発するためのベストプラクティスを示しています。このサンプルはオープンソースであり、Githubの/samples/react-native-group-chatにあるChat SDKと同じリポジトリの一部です。

このアプリは権威あるものなので、この記事ではそれを使用して、Channel Monitorを「実際の」アプリでどのように使用できるかを示します。 また、このアプリは私たちのChat SDK for Mobileデモの一部としてホストされているので、依存関係(Expo、React Native、デバイスエミュレータ)をインストールすることなくアプリを使用することができます。このハウツーにあるいくつかの例に従ってインストールしたい場合は、サンプルのREADMEにあるインストール手順に従ってください(執筆時の最新コミットは0c12f3f)。

チャットサンプルアプリのアバター

依存関係を避けるため、チャットアプリで使用されるアバターはアプリ内に埋め込まれ、ユーザーのアプリコンテキストには保存されません。これはアプリケーションの制限であり、PubNubの制限ではありません。

チャンネルモニターでサンプルアプリを使用する

以下の手順でサンプル・アプリとチャンネル・モニターを使用できるようになります:

  1. アプリケーションのReadmeに記載されている手順に従って、サンプルアプリケーションをクローンしてビルドします。

  2. アプリケーションを2つのデバイスで実行し、2人の会話を表示できるようにする。 この記事のスクリーンショットでは、AndroidとiOSのエミュレータを使用しています。

  3. 左のデバイスにログインし右のデバイスにログインします。 右のデバイスで、フローティングアクションボタンを使って会話を開始します。 右のデバイスからメッセージを送信すると、左のデバイスに未読メッセージとして表示されます。

  4. 適切なチャンネルを選択し、チャンネル名を'1:1 with XXX'とします。

  5. 下のスクリーンショットのようなものが表示されたら、「モデレーションを開始」できます。

メッセージのモデレート

チャンネルモニターはAppコンテキストを使用してメッセージを編集または削除するすべてのPubNubアプリケーションで使用できますが、チャットSDKを使用して開発されたアプリケーションは、ユーザーを監視、ミュート、禁止する機能などの追加機能を利用できます。

モデレータとしてメッセージを編集する

モデレーターとして任意のメッセージを編集することができます。 そうすることで、クライアントに表示されるメッセージだけでなく、管理 UI も更新されます。 下のスクリーンショットは、"Hello" というメッセージを "Hello - edited by moderator" に編集したものです。

モニタービューは、Chat SDKmessage edit()メソッドを呼び出しています。 クライアントは、streamUpdatesOn()API を使用して、自動的に更新を受信します。 サンプルアプリでは、Chat.tsx で見ることができます。

元のメッセージは削除されませんが、編集は元のメッセージへの追加(アクション)として保存されることに注意してください。 詳細は、edit()メッセージのドキュメントを参照してください。

モデレータとしてメッセージを送信する。

モデレーターとして、指定したチャンネルにメッセージを送信することができます。 次のスクリーンショットは、"That's right, I am a moderator" というメッセージがすべてのクライアントに受信されていることを示しています。 モデレーターとしてメッセージを編集したり削除したりすることはできますが、(当然ながら) ミュートしたり禁止したりすることはできないことに注意してください。

会話に参加するために、チャンネルモニターはIDを'PUBNUB_INTERNAL_MODERATOR'に設定した新しいユーザーを作成しました。

サンプルアプリケーションでは'PUBNUB_INTERNAL_MODERATOR'ユーザーを特に扱っていないため、デフォルトのアバターが付いた標準的なメッセージとして会話に表示されます。 このモデレーターメッセージを、背景を別の色にするなど、特別な意味を持たせてアプリで扱いたいと思うかもしれません。

非常に基本的な例として、メッセージテキストを表示するロジックを変更し、モデレーターからのメッセージであることを前置することができます:

{messageProps.currentMessage?.originalPnMessage.userId == 
  "PUBNUB_INTERNAL_MODERATOR" ? "MOD: " : ""}
Enter fullscreen mode Exit fullscreen mode

そうすると、UIは次のようになります:

モデレーターとしてメッセージを削除する

メッセージの横にある'Delete'ボタンを押すと、そのメッセージは'Monitor'ビューで削除さ れたとマークされ、クライアントに更新が通知されます。

メッセージの削除はチャットSDKの'delete()'メソッドを呼び出すのと同じで、これはソフト削除であり、メッセージはストレージに残り、'delete'フラグが付けられるだけであることに注意してください。

クライアントアプリの該当箇所を以下に示します。

<Text variant="body">
          {messageProps.currentMessage?.originalPnMessage.deleted
            ? "(Message softly deleted)"
            : messageElements.map((msgPart, index) =>
                renderMessagePart(
                  msgPart,
                  index,
                  messageProps.currentMessage?.originalPnMessage.userId || ""
                )
              )}
        </Text>
Enter fullscreen mode Exit fullscreen mode

非永続的なソフト削除を使用することで、モデレーターやその他の権限を持つユーザーが必要に応じてメッセージを復元することができます。

モデレーターとしてメッセージを復元する。

メッセージの復元は、メッセージの削除とは正反対で、チャット SDK の'restore()' メソッドを呼び出すのと同じです。

削除されたメッセージテキストは 'Monitor' ビューに復活し、メッセージオブジェクトの 'deleted' フラグが解除されます。 サンプルアプリで 'deleted' フラグを処理し、元のテキストを復元した上記のコードを参照してください。

ユーザをモデレートする

モデレーション・ソリューションの構成要素

チャンネルモニターでどのようにモデレーションが機能するかを説明する前に、堅牢で成熟したモデレーションソリューションの様々なコンポーネントと、それらがチャット SDK で利用可能なものとどのように対応しているかを見てみましょう。

ユーザが実行できるアクションを制限する:

ユーザが悪さをした場合、そのユーザの投稿を制限したり(ミュート)、他のユーザとのやり取りを制限したり(禁止)することができます。

サーバー側では、モデレーターがユーザーをミュートまたはBANする方法と、そのユーザーがミュートまたはBANを解除する方法が必要です。 また、メッセージを受信すべきではないユーザーにメッセージを送受信できないようにルールを設定する必要があります。サーバー上でこれを行うことは、悪質なユーザーがバイパスできるクライアント側のモデレーションに頼るよりもはるかに安全です。

チャット SDK はsetRestrictions()メソッドを公開しており、特定のチャンネルでユーザーを 'ミュート' または '禁止' します。setRestrictions()API自体は、クライアントができることに何の制限も適用しません。 チャットSDKのlistenForEvents()メソッドを通して'モデレーション'イベントをリッスンするのは、クライアントとサーバーの両方次第です。

ユーザー制限の変更をリッスンします:

ユーザーのパーミッションが変更された場合、これらの変更が即座に適用され、ソリューション全体に反映されることが重要です。 ユーザーが禁止された場合 (例えば、Web インターフェイスを使用してモデレータによって)、ユーザーのクライアントアプリは、禁止されたことを伝えるメッセージを表示します。 例えば、クライアント側のチェックをバイパスするためにクライアントアプリを "ハッキング" するなど、ユーザーによる禁止を回避しようとする試みは、サーバー側の追加チェックによって即座に失敗する必要があります。

チャットSDKのlistenForEvents()メソッドは、指定されたチャネルのユーザーのパーミッションが更新されたことを関係者に通知します。 クライアントは、ユーザーエクスペリエンスを更新し、サーバーから新しいアクセストークンを要求するために、これらの変更をリッスンする必要があります。 サーバー上で、以前のアクセストークンはrevokeToken()を使用して取り消され、grantToken()を使用して更新されたアクセスルールで新しいトークンが生成される必要があります。

どのような制限が有効になっているかを問い合わせる:

サーバ上で動作するモデレーションダッシュボードを作成する場合、ユーザがすでに有人かミュートされているかをクエリし、モデレータにその状態を表示できるようにする必要があります。

クライアント側では、メッセージの受信者がミュートされているか禁止されているかを問い合わせる機能が必要です。

チャット SDK は、現在の制限を取得するための API ファミリを公開しています: ユーザに対して動作するgetChannelRestrictions()getUserRestrictions() と、チャンネルに対して動作するgetUsersRestrictions() です。

不適切な内容のメッセージやユーザの報告

全てのユーザに安全で楽しいチャット体験を提供するために、ユーザは問題のあるユーザやメッセージをモデレータに報告し、レビューと対処を受ける権限を感じるべきです。

クライアント側では、チャットアプリケーションは、ユーザーが問題のあるメッセージを強調表示し、オプションの追加フィードバックを提供するための方法が必要です。 チャット SDK は、この目的のためにmessage.report()user.report()メソッドを提供し、クライアントはこれを呼び出す必要があります。

サーバー側では、これらのメッセージ報告を聞き、管理者に表示し、管理者がアクションを起こせるようにする必要があります。 管理者は、メッセージ自体を編集/削除したり、問題が解決しない場合は、ミュートや禁止など、ユーザーに対して何らかのアクションを実行することを選択するかもしれません。 チャット SDK は、通常サーバーによって処理される、報告されたメッセージを受信するためにlistenForEvents()メソッドを提供します。

チャネルモニタはこのモデレーションアーキテクチャのどこに位置するのでしょうか?

チャネルモニタは、ユーザが送信しているメッセージの手動レビューに基づいてユーザをミュートまたは禁止するためのダッシュボードを提供します。 ダッシュボードは、あなたのためにsetRestrictions()を呼び出すことを引き受け、各チャネル内で禁止されているユーザの最新情報を常に提示します。

開発者であるあなたに残されているのは、これらの禁止とミュート要求をより広いアプリケーションアーキテクチャに統合することです。 具体的には、本番アプリケーションをデプロイしているPubNubの顧客として、あなたはすでにPubNub Access Managerを使用してデータへのアクセスを制御し、ユーザーが各チャネルで必要なRWアクセスのみを許可されるようにしています。listenForEvents()から受信した'ミュート'と'禁止'の更新に基づいて、既存のAccess Managerサーバーコンポーネントを呼び出して、影響を受けるユーザーのために新しいAccessトークンを取り消したり付与したりします。

また、クライアントアプリケーションがlistenForEvents()またはgetXRestrictions()ファミリーのAPIから受信した更新に基づいて適切な手順を踏んでいることを確認する必要があります。 禁止されたユーザへのメッセージは受信されないように設定されているため、ユーザが送信できるようにしないでください。

ユーザのミュートと禁止:サンプル・アプリケーションを使ったデモ

前のセクションで説明したように、チャンネル・モニタは強固なモデレーション・ソリューションの一部です。

この記事では、ユーザがダッシュボードからミュートまたは禁止されたときにクライアント上でどのようにアクションを実行するかを示しますが、本番アプリケーションではPubNubアクセスマネージャと統合するサーバロジックも構成されます。

デフォルトのサンプルアプリケーションはAPIのlistenForEvents()を実装していないので、少し変更する必要があります。

HomeScreen.tsxで、図のようにTimetokenUtilsとAlertのインポートを追加します:

import { Channel, Membership, TimetokenUtils } from "@pubnub/chat"
import { StyleSheet, ScrollView, TouchableHighlight, TouchableOpacity, Alert } from "react-native"
Enter fullscreen mode Exit fullscreen mode

次に、"invite "リスナーが定義されている同じuseEffectで、以下のように、"moderation "イベントをアラートとして表示する2つ目のリスナーを定義します:

const removeModerationListener = chat.listenForEvents({
  channel: chat.currentUser.id,
  type: "moderation",
  callback: async (event: Event<"moderation">) => {
    Alert.alert(
      "Restriction: " + event.payload.restriction,
      `Reason (bans only): ${
        event.payload.reason == null ? "" : event.payload.reason
      }\nChannel Id: ${event.channelId}\nBy: ${
        event.userId
      }\nTime: ${TimetokenUtils.timetokenToDate(event.timetoken).toLocaleString([], {
        weekday: "short",
        month: "short",
        day: "numeric",
        hour: "numeric",
        minute: "numeric",
      })}`,
      [{ text: "OK" }]
    )
  },
})
Enter fullscreen mode Exit fullscreen mode

本番のコードには程遠いですが、これは少なくともモデレーションイベントが受信されたことを表示します。

チャンネル内のユーザーをミュートする

両方のデバイスで実行されているコードを修正した後、test-user-607をミュートすると、以下のように "moderation "イベントがトリガーされます:

具体的には、ModerationEventPayloadは"muted "となります。

特に、ModerationEventPayloadは "muted "となります。このフィールドはBANにのみ適用されるため、ユーザーをミュートする理由は与えられないことに注意してください。

ユーザーをチャンネルから追放する

チャンネルからユーザーをBANすることは、ミュートすることとよく似ています。 ダッシュボードは管理者にBANの理由を求めるプロンプトを表示し、上のスクリーンショットは test-user-935 が 'testing ban feature' という理由でBANされたことを示しています。

ミュートと同様、モデレーションイベントのフォーマットはtypes.ts で与えられ、ModerationEventPayloadは "banned" となる。

ユーザーのミュートまたは禁止を解除する

上記のスクリーンショットは、test-user-607とtest-user-935の両方がそれぞれの制限を解除された結果を示しています。 前述の通り、モデレーションイベントのフォーマットはtypes.tsで指定されています。

まとめ

BizOps Workspaceは、チャットアプリケーションのあらゆる側面を管理するために設計されたツールのセットであり、ローンチ後の課題を簡素化します。

本記事では、Channel Monitorに焦点を当てましたが、BizOps Workspaceの機能拡張を続けています。 また、本記事では、Chat SDKのみに焦点を当てましたが、執筆時点では、このSDKはChannel Monitorの全機能セットをサポートしていますが、SDKの追加サポートに関する将来のアナウンスにご期待ください。

ヘルプやサポートが必要な場合は、お気軽に専任のサポートチームにご連絡いただくか、開発者リレーションズチーム(devrel@pubnub.com)までメールでお問い合わせください。

PubNubはどのようにお役に立ちますか?

この記事はPubNub.comに掲載されたものです。

私たちのプラットフォームは、開発者がWebアプリ、モバイルアプリ、およびIoTデバイスのためのリアルタイムのインタラクティブ性を構築、配信、管理するのに役立ちます。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験

ライブツアーをチェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ

PubNubアカウントにサインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める

PubNubのドキュメントは、ユースケースやSDKに関係なく、あなたを立ち上げ、実行することができます。

Top comments (0)