Tampermonkey を使用して、一致する特定の文字列を URL に常に追加するにはどうすればよいですか? または別の方法はありますか?

Tampermonkey を使用して、一致する特定の文字列を URL に常に追加するにはどうすればよいですか? または別の方法はありますか?

次の文字列を追加します:

&sp=CAASAhAB

YouTube 検索クエリが実行されるたびに、その愚かな「他のユーザーが視聴した動画」セクションが削除されます。

私は Tampermonkey スクリプトを作成しましたが、これは非常にうまく機能しますが、Web サイト独自の検索ボックスで検索を実行すると機能しません。

誰か助けてくれませんか? これを解決できれば後世のためにも素晴らしいと思います。

TamperMonkey スクリプトは次のとおりです。

// ==UserScript==
// @name         Youtube - Remove "People Also Watched" section from search results.
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Add "&sp=CAASAhAB" to YouTube search results URL if not already present. Recommended to also use https://github.com/Vulpelo/hide-youtube-shorts
// @author       MattFor | @mattfor | https://github.com/MattFor
// @match        www.youtube.com/results?search_query=*
// @grant        none
// ==/UserScript==

(function () {
    "use strict";

    function containsString(mainString, subString) {
        return mainString.indexOf(subString) !== -1;
    }

    function updateURL() {
        var currentURL = window.location.href;
        var queryString = "&sp=CAASAhAB";

        if (!containsString(currentURL, queryString)) {
            window.location.href += queryString;
        }
    }

    updateURL();

    window.addEventListener("beforeunload", updateURL);
    window.addEventListener("DOMContentLoaded", updateURL);
})();

編集#1: 質問へのコメントに基づいてコードを更新しましたが、大きなアップグレードはありません。YouTubeのPOSTリクエストのみが送信されるようです。一度ネットワークタブから判断すると。

// ==UserScript==
// @name         Youtube - Modify search request
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Add "&sp=CAASAhAB" to YouTube search results URL if not already present.
// @author       MattFor | @mattfor | https://github.com/MattFor
// @match        www.youtube.com/results?search_query=*
// @grant        none
// ==/UserScript==

(function () {
    "use strict";

    function containsString(mainString, subString) {
        return mainString.indexOf(subString) !== -1;
    }

    function updateURL() {
        var currentURL = window.location.href;
        var queryString = "&sp=CAASAhAB";

        if (!containsString(currentURL, queryString)) {
            window.location.href += queryString;
        }
    }

    function modifySearchForm() {
        var searchForm = document.getElementById("search-form");

        if (searchForm) {
            searchForm.addEventListener("submit", function (event) {
                event.preventDefault();
                var formAction = searchForm.action;
                var modifiedAction = formAction + "&sp=CAASAhAB";
                searchForm.action = modifiedAction;
                searchForm.submit();
            });
        }
    }

    updateURL();
    modifySearchForm();

    window.addEventListener("beforeunload", updateURL);
    window.addEventListener("DOMContentLoaded", function () {
        updateURL();
        modifySearchForm();
    });
})();

答え1

これまで Tampermonkey を使用したことはありませんでしたが、これを処理するためにスクリプトを変更してみたいと思います。

問題は、検索機能が<form action=""></form>タグによって制御されていることです。これを踏まえて、目標はactionURL 内のそのパラメータを変更してsp=CAASAhABURL パラメータを追加することです。

これすべきやれ:

// ==UserScript==
// @name         Youtube - Remove "People Also Watched" section from search results.
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Add "&sp=CAASAhAB" to YouTube search results URL if not already present. Recommended to also use https://github.com/Vulpelo/hide-youtube-shorts
// @author       MattFor | @mattfor | https://github.com/MattFor
// @match        www.youtube.com/results?search_query=*
// @grant        none
// ==/UserScript==

(function () {
    "use strict";

    function containsString(mainString, subString) {
        return mainString.indexOf(subString) !== -1;
    }

    function updateURL() {

        ////////////////////////////////////////////////
        // Append the URL parameter to the URL.
        var currentURL = window.location.href;
        var queryString = "&sp=CAASAhAB";

        if (!containsString(currentURL, queryString)) {
            window.location.href += queryString;
        }

        ////////////////////////////////////////////////
        // Append the URL parameter to the form action.
        var formAction = document.getElementById("search-form").action;
        var queryParam = "?sp=CAASAhAB";

        if (!containsString(formAction, queryParam)) {
            document.getElementById("search-form").action += queryParam;
        }

    }

    updateURL();

    window.addEventListener("beforeunload", updateURL);
    window.addEventListener("DOMContentLoaded", updateURL);
})();

うまくいかない場合は、次のようにフォームの送信をインターセプトする必要があるかもしれません。これに基づいた疑似コードスタックオーバーフローの回答:

document.querySelector("#search-form").addEventListener("submit", function(e) {
  e.preventDefault()
  e.submitter.formAction += "&sp=CAASAhAB";
  this.submit();
})

あるいは、これをベースにした若干のバリエーションスタックオーバーフローの回答

document.querySelector("#search-form").addEventListener("submit", function(e) {
  e.preventDefault();
  button.setAttribute("action", this.getAttribute("action") += "&sp=CAASAhAB");
  // Or try this instead of the above.
  // this.action += "&sp=CAASAhAB";
  this.submit();
});

関連情報