1
2

More than 3 years have passed since last update.

アツマールでコメントの個人特定をする方法

Last updated at Posted at 2020-11-15

筆者メモ

この記事は、もともとNoteで公開していた内容と完全に同じ内容です。
元の記事:https://note.com/hadhad/n/nad8548c4943d

もともと100円で売ってたんですが、誰も買わなかったので無料にしたところ、
twitterでプチバズったのにNoteのフォロワーがまったく増えなかったので、
もうQiitaに自己転載して、もっといろんな人が見れるようにしました。

記事に記載したプラグインやソースコードはWTFPLライセンスで配布します。勝手にして、どうぞ。

はじめに

RPGアツマールのコメント機能は、ニコニコ動画と違って投稿したIDが公開されていない。
そのため、コメントした人全員が184コメントをしているような扱いになっている。
また、ゲーム側でコメントのNG機能も用意されてはいるが、ID指定ではなく「キーワード」での指定となっている。

その為に、RPGアツマールでは、ゲームをコメントで荒らされた場合、
ユーザー単位でNGしたいのに、できないという仕様になっている。

Twitter等で「アツマール コメント NG」とかで検索してみると、
ユーザーID特定機能が欲しいという人もチラホラ存在する。

だが僕は思う。
運営を頼る以前に、自分で作れるハズだ
と。

かくゆう自分も、この問題に直面していた。
気に入らないコメントは削除すればよいのだが、
コメントの削除は運営の人力で申請制のため時間がかかるし、
消せたとしても粘着質なユーザーは
すぐに同じようなコメントを書き込むからだ。

そこで僕は思った。
「コメントした人のIDを特定して、
 指定IDの人をBANできるプラグインを作ったら面白そうだ」

と。

結果、僕はこのプラグインの開発に成功した。

どうやったのかを次に記す。

コメントを個人特定する仕組み

予め断っておくが、この方法では、
既に書き込まれている過去のコメントからIDを特定することはできない。

今回の方法はあくまで、
「仕組みを取り入れた瞬間からのコメントが特定できる」
という話だ。

この仕組みを実現するために僕は、
「コメントを投稿する瞬間」に細工をすることにした。

用意するアツマールのAPIは次の通り。
コメントAPI
シグナルAPI

コメントAPIには、
「コメントを行った瞬間にコメント内容を取得できる」
関数が用意されている。

そしてシグナルAPIには
「100バイト以内の文章をユーザー情報付きで送信できる」
関数が用意されている。
またグローバルシグナルとして送信された情報は、
1000件までサーバーに記録される。

ここまで見て、察しが良い人はもう分かっただろう。

つまり、
1.コメントを行った瞬間に
2.ユーザー情報とコメントの内容をグローバルシグナルとして送信し
3.確認したいときにグローバルシグナルの中身を覗く

という順序を辿れば、コメントの個人特定が可能というわけだ。

さて、仕組みを理解できたところで、
さっそくこれをツクールMVプラグインにしてみよう!

コメントのユーザー情報を記録するプラグイン

このプラグインは、ツクールMVに適用するだけで効果を発揮する。
ソースコードは次の通り・・・

/*:
* @plugindesc 投稿されたコメントをグローバルシグナルに送信
* @author Had2Apps
* @help
* コメントが投稿されると同時に、グローバルシグナルに内容が送信されます。
* これにより、誰がどのコメントを行ったかを特定することができます。
*
* グローバルシグナルの一覧をコンソールに表示したい場合は、スクリプトで
* window.RPGAtsumaru.signal.getGlobalSignals().then(console.log)
* を呼び出してください。
*/
(function () {
 if (window.RPGAtsumaru === undefined) {
   console.warn("APIが読み込めません");
   return;
 }
 function shorten(text) {
   var chars = text.split("");
   var current = 0;
   var temp = "";
   for (i = 0; i < chars.length; i++) {
     var escapedChar = escape(chars[i]);
     current = escapedChar.length < 4 ? current + 1 : current + 2;
     if (current > 100) return temp;
     temp += text.charAt(i);
   }
   return text;
 }
 function sendCommentLog(res) {
   var comment = res.comment;
   var log = shorten(comment);
   window.RPGAtsumaru.experimental.signal.sendSignalToGlobal(log).then(() => {
     console.log("OK");
   });
 }
 window.RPGAtsumaru.comment.posted.subscribe(sendCommentLog);
})();

解説しよう。

ここで使用されているAPI関数は
RPGAtsumaru.comment.posted.subscribe
RPGAtsumaru.experimental.signal.sendSignalToGlobal
の2つだ。

※今は experimental. なしでも動くらしい。動かなかった場合は外してみたらいいんじゃないかな。

RPGAtsumaru.comment.posted.subscribe は、
引数にコールバック関数を渡してやることで、ユーザーがコメントを投稿した瞬間に、コメント内容を引数に渡した状態でコールバック関数が実行されるようになっている。
このプラグインでは、後者のAPI関数を使った処理をコールバック関数として指定した。

RPGAtsumaru.experimental.signal.sendSignalToGlobal は、
引数に100バイト以内の文字列を渡してやることで、その文字列とユーザー情報をRPGアツマールのサーバーに送信してくれる。
shorten 関数では、取得されたコメントが100バイトに収まるように調整している。

ちなみに、送信されたグローバルシグナルを確認したい場合は、
スクリプトで次の処理を書き込めばいい。

if (window.RPGAtsumaru !== undefined) {
  window.RPGAtsumaru.signal.getGlobalSignals().then(console.log)
}

この処理が実行されることで、
ブラウザのコンソール画面にグローバルシグナルの一覧が表示される。
これを見ればOKだ。

応用編:ユーザーIDのNG機能を実現する

ここまで読んだ人なら、ユーザーIDのNG機能を実装するのも、
そう難しくないはずだ。

ようは、上述のプラグインで取得したIDが一致するユーザーが
ゲームをプレイできないように
細工すればいいのだ。

本記事では、実際にどのようにコードを書けばいいかは掲載しないが、
実現するためのヒントを以下に載せておこうと思う。

まず、NG機能を実装するのに使えそうな追加のAPIは次の通りだ。
ユーザー情報取得API
コメントAPI:シーン切り替え

まずユーザー情報取得APIは、
今プレイしているユーザーのIDなどを取得できるAPIだ。
これを使用することで、グローバルシグナルをいちいち送信しなくても
ユーザーIDを取得することができる。
なので、プラグインで取得した荒らしのユーザーID
このAPIの情報を照らし合わせて、処理を変えるようにすればいいのだ。

次にコメントのシーン切り替えAPIは、
コメント投稿先のシーン名を強制的に変更できるAPIだ。
これを応用することで、荒らしユーザーだけ
荒らし専用のシーンに強制的に投稿させる
仕組みを作り、
他のユーザーからその荒らしのコメントを見れなくすることができる。

つまり処理の流れとしては、こうなればいいわけだ。
1.プラグインから荒らしのユーザーIDを予め指定しておく
2.ユーザー情報取得APIでプレイヤーのIDを調べ、荒らしのIDと照合
3.一致する場合、コメントのシーンを荒らし専用シーンに強制設定
4.ゲームをプレイ不能にする

先ほども書いた通り、
この記事ではそのプラグインをどのようにして
作るのかに関しては書かない。

もしプラグインを書いたことがない場合は、
勉強がてら作ってみることをおススメする。

これにて以上!

さいごに

(この部分はもともとのNote記事にはなかったことです)

この方法を使えば、荒らしコメントを書く輩のリストを作ることが可能なので、
荒らしユーザーリストを作者のみんなで共有すれば、
実質「NG共有機能」みたいなことができるはず。

特定のユーザーのプレイを禁止するようにできれば、荒らし撲滅できると思う。
わりと過激な考え方だけど。

この記事で書いた技術は、あくまで良いことに使ってほしいです。
悪用しようと思えばできちゃうと思うんだよね。
絶対に、人の迷惑になるようなことには使わないこと!

そして自分がターゲットになっても困らないように、身に振り方には気を付けよう!

実践例:
https://game.nicovideo.jp/atsumaru/games/gm14221?link_in=users

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2