cytube_user_check

複数のアカウントを利用して動画登録しているユーザーを定期的に検知する

  1. // ==UserScript==
  2. // @name cytube_user_check
  3. // @namespace https://cytube.mm428.net/
  4. // @version 1.00
  5. // @description 複数のアカウントを利用して動画登録しているユーザーを定期的に検知する
  6. // @author fetcH
  7. // @grant none
  8. // @match https://cytube.mm428.net/r/*
  9. // ==/UserScript==
  10.  
  11.  
  12. (function() {
  13. // チェック対象のユーザー権限
  14. /*----------------------
  15. * var Rank = {
  16. * Guest: 0,
  17. * Member: 1,
  18. * Leader: 1.5,
  19. * Moderator: 2,
  20. * Admin: 3,
  21. * Owner: 10,
  22. * Siteadmin: 255
  23. * };
  24. */
  25. const TARGET_USER_RANK = Rank.Owner;
  26.  
  27. // チェック間隔(秒)
  28. const CHECK_INTERVAL_SEC = 180;
  29.  
  30. // 自動動画削除機能
  31. const AUTO_MOVIE_DELETE = true;
  32.  
  33. // 表示場所作成
  34. const view_div = $('<div>').attr({
  35. id: 'vidchk',
  36. class: 'linewrap'
  37. });
  38. $('#chatwrap').append(view_div);
  39.  
  40. //
  41.  
  42. // リストを定期的にチェック
  43. setInterval(function(){
  44.  
  45. // プレイリストの登録数上限を取得する
  46. // 無制限なら0
  47. // 日本語前提の処理
  48. const queue_limit = (() => {
  49. let limit = $("#plcount").text().split(':')[1];
  50. if (limit == '無し') {
  51. return 0;
  52. }
  53. limit = parseInt(limit.split('項目')[0], 10);
  54. return limit;
  55. })();
  56. //console.log(queue_limit);
  57.  
  58. if (queue_limit == 0) {
  59. return;
  60. }
  61.  
  62. // ユーザーの動画登録情報取得
  63. const user_list = {}; // ユーザー名別の情報
  64. const ip_list = {}; // ip別の情報
  65. // 参加ユーザー情報をまとめる
  66. Array.from(document.getElementById("userlist").children).forEach((child) => {
  67. const userlist_item = $(child);
  68. const name = userlist_item.children()[1].innerText;
  69. const data = userlist_item.data();
  70. const ip = data.meta.ip ?? name; // 権限が足りないとipが取得できないので名前をip代わりとする
  71. user_list[name] = {
  72. name: name,
  73. ip: ip,
  74. rank: data.rank,
  75. movies: []
  76. };
  77. if (!ip_list.hasOwnProperty(ip)) {
  78. ip_list[ip] = {
  79. ip: ip,
  80. aliases: []
  81. };
  82. }
  83. ip_list[ip].aliases.push(name);
  84. });
  85. //console.log(ip_list);
  86.  
  87. // ユーザーの動画登録情報をまとめる
  88. Array.from(document.getElementById("queue").children).forEach((child) => {
  89. const playlist_item = $(child);
  90. const name = playlist_item.data().queueby;
  91. const title = playlist_item.data().media.title;
  92. const uid = playlist_item.data().uid;
  93. //console.log(playlist_item.data());
  94. if (user_list.hasOwnProperty(name)) {
  95. user_list[name].movies.push({queueby: name, title: title, uid: uid});
  96. }
  97. });
  98. //console.log(user_list);
  99.  
  100. // 複数アカウントで登録しているIPに対する処理
  101. const limit_over_ip_list = [];
  102. for (const ip in ip_list) {
  103. // 複数アカウントで動画登録しているか判定する
  104. const ip_info = ip_list[ip];
  105. const aliases = [];
  106. let movies = [];
  107. for (const name of ip_info.aliases) {
  108. // 指定権限のユーザー以下を対象とする
  109. if (user_list[name].rank <= TARGET_USER_RANK) {
  110. if (1 <= user_list[name].movies.length) {
  111. aliases.push(name);
  112. movies = movies.concat(user_list[name].movies);
  113. }
  114. }
  115. }
  116.  
  117. // 複数アカウントでの動画登録者を表示
  118. if (2 <= aliases.length) {
  119. if (queue_limit < movies.length) {
  120. const movie_cnt = `動画登録数=${movies.length}`;
  121. const ip = `IP=${ip_info.ip}`;
  122. const user_names = `ユーザー名=${aliases.join(', ')}`;
  123. const movie_names = movies.map((movie) => { return movie.title; }).join("\n");
  124. limit_over_ip_list.push(`<div>${movie_cnt}:${ip}:${user_names}</div>`);
  125. // 動画名はコンソールに表示
  126. console.log(`${movie_cnt}\n${ip}\n${user_names}\n${movie_names}\n\n\n`);
  127.  
  128. // 動画自動削除
  129. if (AUTO_MOVIE_DELETE) {
  130. const keep_name = aliases[0];
  131. const delete_movies = movies.filter((movie) => { return movie.queueby != keep_name; });
  132. const delete_movie_names = delete_movies.map((movie) => { return `${movie.title}(${movie.queueby})`; }).join("\n");
  133. socket.emit("chatMsg", {
  134. msg: "【複垢動画登録検知】以下をプレイリストから削除しました",
  135. meta: {}
  136. });
  137. for (const del of delete_movies) {
  138. socket.emit("delete", del.uid);
  139. socket.emit("chatMsg", {
  140. msg: `【User${del.queueby}】${del.title}`,
  141. meta: {}
  142. });
  143. }
  144. console.log(`DELETE MOVIES\n${ip}\n${user_names}\n${delete_movie_names}`);
  145. }
  146. }
  147. }
  148. }
  149.  
  150. // 垢BAN対象者を表示
  151. view_div.html(limit_over_ip_list.join(""));
  152. }, CHECK_INTERVAL_SEC * 1000);
  153. })();