Cookie Editor

サイト内のCookieを編集できるようになるスクリプトです。

// ==UserScript==
// @name         Cookie Editor
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  サイト内のCookieを編集できるようになるスクリプトです。
// @author       You
// @match        *.x-feeder.info/*/
// @match        *.x-feeder.info/*/sp/
// @exclude      *.x-feeder.info/*/settings/**
// @match        http://drrrkari.com/room/
// @match        http://www.3751chat.com/ChatRoom*
// @match        https://pictsense.com/*
// @match        http://www.himachat.com/
// @match        https://discord.com/*
// @match        https://*.open2ch.net/*
// @require      https://greasyfork.org/scripts/396472-yaju1919/code/yaju1919.js?version=798050
// @require      https://greasyfork.org/scripts/388005-managed-extensions/code/Managed_Extensions.js?version=720959
// @grant        GM.setValue
// @grant        GM.getValue
// ==/UserScript==

(function() {
    'use strict';
    // カスタマイズ領域
    const cookieInfoColor = "lightyellow"; // Cookie情報の色
    //-----------------
    // Cookieをセットする関数。「feederチャット - sidを変える」(https://greasyfork.org/ja/scripts/402949)というスクリプトからお借りしました。
    function setCookie(c_name, value, expiredays) {
        // pathの指定
        var path = location.pathname;
        // pathをフォルダ毎に指定する場合のIE対策
        var paths = new Array();
        paths = path.split("/");
        if (paths[paths.length - 1] != "") {
            paths[paths.length - 1] = "";
            path = paths.join("/");
        }
        // 有効期限の日付
        var extime = new Date().getTime();
        var cltime = new Date(extime + (60 * 60 * 24 * 1000 * expiredays));
        var exdate = cltime.toUTCString();
        // クッキーに保存する文字列を生成
        var s = "";
        s += c_name + "=" + encodeURIComponent(value); // 値はエンコードしておく
        s += "; path=" + path;
        if (expiredays) {
            s += "; expires=" + exdate + "; ";
        } else {
            s += "; ";
        }
        // クッキーに保存
        document.cookie = s;
    }
    //---------------------------------------------------------------------------------------------------------------------------------------
    const addBtn = (h, title, func) => { // ボタンを追加する関数
        return $("<button>").text(title).click(func).appendTo(h);
    };
    let inputCookieName, inputCookieValue, inputCookieExpireDays, si; // siはsetIntervalのidを格納する変数
    const setConfig = () => {
        const h = $("<div>");
        let oldCookies;
        let cookieInfo = $("<div>").css("color", cookieInfoColor).appendTo(h); // サイト内のCookieを表示する要素
        inputCookieName = yaju1919.addInputText(h, {
            title: "Cookieの名前",
            placeholder: "Cookieの名前を入力",
            save: "AM_inputCookieName",
            width: "90%",
        });
        inputCookieValue = yaju1919.addInputText(h, {
            title: "Cookieの値",
            placeholder: "Cookieの値を入力",
            save: "AM_inputCookieValue",
            width: "90%",
        });
        inputCookieExpireDays = yaju1919.addInputNumber(h, {
            title: "Cookieの有効期限",
            placeholder: "Cookieの有効期限を入力",
            save: "AM_inputCookieExpireDays",
            width: "90%",
            value: 0,
            min: Number.NEGATIVE_INFINITY,
            max: Infinity,
        });
        const cookieInfoLoad = () => { // Cookieを取得
            if (oldCookies === document.cookie) return;
            cookieInfo.empty().text(`Cookie : ${document.cookie.split(";").length}個`);
            let activeElm = document.activeElement;
            let cookies = document.cookie;
            let cookieInfoElm;
            oldCookies = cookies;
            cookies.split(";").forEach(v => {
                cookieInfoElm = yaju1919.addInputText(cookieInfo, {
                    readonly: true,
                    textarea: true,
                    value: v === "" ? "Cookieが見つかりませんでした。" : v,
                    width: "100%",
                });
                let elm = h.find("textarea").last();
                elm.focus(() => { // フォーカスされた要素に表示されているCookieの名前と値を入力欄に入力
                    if (elm.val() === "Cookieが見つかりませんでした。") return;
                    elm.val().split("=").forEach((v, i) => {
                        h.find("input").eq(i).val(decodeURIComponent(v));
                    });
                });
            });
            activeElm.focus();
        }
        addBtn(h, "編集", () => {
            const cookieName = inputCookieName();
            const cookieValue = inputCookieValue();
            const cookieExpireDays = inputCookieExpireDays();
            setCookie(cookieName, cookieValue, cookieExpireDays);
            cookieInfoLoad();
        });
        addBtn(h, "Cookie全削除", () => {
            let cookies = document.cookie;
            cookies.split("; ").forEach(v => {
                setCookie(v.replace(/=.*/, ""), "", -1);
                cookieInfoLoad();
            });
        });
        addBtn(h, "ページリロード", () => {
            location.reload();
        });
        // Cookieを1秒間隔で取得
        clearInterval(si);
        si = setInterval(() => {
            cookieInfoLoad();
        }, 1000);
        //----------------------
        cookieInfoLoad(); // 起動時にCookieを取得
        return h;
    }
    win.Managed_Extensions["Cookie Editor"] = {
        config: setConfig,
        tag: "実用的",
    }
})();