GreasyFork: One Click Report Spam

To report spam comments in Greasy Fork with one click

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name        GreasyFork: One Click Report Spam
// @name:zh-TW  GreasyFork 一鍵回報垃圾評論
// @name:zh-CN  GreasyFork 一键回报垃圾评论
// @namespace   UserScripts
// @match       https://greatest.deepsurf.us/*
// @grant       none
// @version     1.9
// @author      CY Fung
// @license     MIT
// @description To report spam comments in Greasy Fork with one click
// @description:zh-TW 在 Greasy Fork 一鍵回報垃圾評論
// @description:zh-CN 在 Greasy Fork 一键回报垃圾评论
// ==/UserScript==

(() => {

  const TEST_MODE = 0;
  let skipMode = false;

  const onIframeLoad = async (evt) => {
    const iframe = evt.target;
    if (!(iframe instanceof HTMLIFrameElement)) return;

    if (skipMode) return;


    const onNewUrl = async () => {
      skipMode = true;

      alert('reported');
      await new Promise(requestAnimationFrame);
      iframe.remove();
      skipMode = false;

    }
    const onAbort = async () => {
      skipMode = true;

      await new Promise(requestAnimationFrame);
      iframe.remove();
      skipMode = false;
    }

    iframe.removeEventListener('load', onIframeLoad, false);

    if (!iframe.contentDocument) {
      alert('Iframe Access Error. Action aborted.');
      onAbort();
      return;
    }


    const reportReasonRadio = iframe.contentDocument.querySelector('input[name="report[reason]"]');
    if (reportReasonRadio) {
      for(const s of iframe.contentDocument.querySelectorAll('html, body, main')){
        s.style.scrollBehavior = 'auto';
      }
      reportReasonRadio.scrollIntoView();
      await new Promise(requestAnimationFrame);
      reportReasonRadio.click();
      const form = reportReasonRadio.closest('form');
      let currentUrl = iframe.contentWindow.location.pathname;
      skipMode = true;
      if (TEST_MODE) {

        iframe.contentWindow.location.href = 'https://greatest.deepsurf.us/'
      } else {
        form.submit();
      }
      let cid = setInterval(() => {
        if (!cid) return;
        let nextUrl = iframe.contentWindow.location.pathname;
        if (nextUrl !== currentUrl) {
          clearInterval(cid)
          cid = 0;
          setTimeout(onNewUrl, 300);
        }
      }, 100)

    } else if (iframe.contentDocument.querySelector('#open-report-:not(:empty)')) {
      alert("The spam report is already submitted for moderator's review. Action aborted.");
      onAbort();

    } else {
      alert('Cannot find the report[reason] radio button. Action aborted.');
      onAbort();
    }

  };
  const clickHandler = (evt) => {
    evt.preventDefault();
    if (!(evt.target instanceof HTMLElement)) return;
    let url = evt.target.getAttribute('ohref');
    if (!url) return;
    let discussionId = /id=(\d+)\b/.exec(url);
    if (discussionId) discussionId = discussionId[1];
    let r = window.confirm(`Confirm to report discussion#${discussionId || "------"} ?`);
    if (!r) return;
    const iframe = document.createElement('iframe');
    skipMode = false;
    iframe.addEventListener('load', onIframeLoad, false);
    iframe.name = "u423323";
    iframe.src = url;
    Object.assign(iframe.style, {
      display: 'block',
      position: 'fixed',
      top: '0px',
      left: '0px',
      width: '300px',
      height: '300px',
      'contain': 'strict',
    });
    document.body.appendChild(iframe);
  }


  for (const anchor of document.querySelectorAll('a[href*="/reports/new?item_class=comment&item_id="],a[href*="/reports/new?item_class=discussion&item_id="]')) {

    let anchorNode = anchor;
    if (anchor.parentNode.firstElementChild === anchor.parentNode.lastElementChild) {
      anchorNode = anchorNode.parentNode;
    }
    let newAnchorNode = anchorNode.cloneNode(true);
    let newAnchor = newAnchorNode.querySelector('a[href]') || newAnchorNode;
    newAnchor.classList.add('report-spam-btn');
    newAnchor.setAttribute('ohref', newAnchor.getAttribute('href'));
    newAnchor.setAttribute('href', '#');
    newAnchor.addEventListener('click', clickHandler, false)
    newAnchor.textContent = 'Report Spam';
    anchorNode.parentNode.insertBefore(newAnchorNode, anchorNode.nextSibling);


  }

  document.head.appendChild(document.createElement('style')).textContent=`
  .discussion-list-container{
  display:flex;
  flex-direction: row;
  flex-wrap: nowrap;
  }
  .discussion-list-container > .discussion-list-item {
      flex-grow:1;
      width:0;
  }
  .discussion-list-container > .discussion-list-item ~ .report-spam-btn {
      align-self: center;
  }
  `

  setTimeout(()=>{

    if(document.querySelector('ul#user-control-panel')) return;

    for(const li of document.querySelectorAll('.discussion-list-item')){

      let a = li.querySelector('a[href*="/discussions/"].discussion-title');
      if(!a) continue;
      let href = a.getAttribute('href');
      let idx = href.lastIndexOf('/discussions/');
      let discussionId = parseInt(href.substring(idx+'/discussions/'.length)||0);
      if(isNaN(discussionId) || discussionId < 0)continue;

      let btn = document.createElement('a');
      btn.classList.add('report-spam-btn');
      btn.setAttribute('ohref', 'https://greatest.deepsurf.us/en/reports/new?item_class=discussion&item_id='+discussionId)
      btn.setAttribute('href','#')
      btn.textContent='Report Spam';
      btn.addEventListener('click', clickHandler, false)
      li.parentNode.insertBefore(btn, li.nextSibling);


    }

  }, 270);

})();