[BETA]Cookie Editor EX

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

  1. // ==UserScript==
  2. // @name [BETA]Cookie Editor EX
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description サイト内のCookieを編集できるようになるスクリプトです。
  6. // @author You
  7. // @match *.x-feeder.info/*/
  8. // @match *.x-feeder.info/*/sp/
  9. // @exclude *.x-feeder.info/*/settings/**
  10. // @match http://drrrkari.com/room/
  11. // @match http://www.3751chat.com/ChatRoom*
  12. // @match https://pictsense.com/*
  13. // @match http://www.himachat.com/
  14. // @match https://discord.com/*
  15. // @match https://*.open2ch.net/*
  16. // @require https://greasyfork.org/scripts/396472-yaju1919/code/yaju1919.js?version=798050
  17. // @require https://greasyfork.org/scripts/388005-managed-extensions/code/Managed_Extensions.js?version=720959
  18. // @grant GM.setValue
  19. // @grant GM.getValue
  20. // @grant GM.cookie
  21. // ==/UserScript==
  22.  
  23. (function() {
  24. 'use strict';
  25. const addBtn = (h, title, func) => { // ボタンを作成する関数
  26. return $("<button>").text(title).click(func).appendTo(h);
  27. }
  28. const addCheckbox = (h, title) => { // チェックボックスを作成する関数
  29. h.append('<input type="checkbox">').append(`${title}<br>`);
  30. return h.find("input").last();
  31. }
  32. const toBool = (data) => { // Boolean型に変換する関数
  33. return data.toLowerCase() === "true";
  34. }
  35. const setVal = (h, valArr, boolArr) => { // input要素の値をセットする関数
  36. valArr.forEach((v, i) => h.eq(i).val(decodeURIComponent(v)));
  37. boolArr.forEach((v, i) => h.eq(i + 6).prop("checked", toBool(v))); // チェックボックスは6番目からなのでiに6を足す
  38. }
  39. const setCookie = (dataObj) => {
  40. if (dataObj.name === "") return;
  41. GM.cookie.set({
  42. expirationDate: new Date().getTime() + (60 * 60 * 24 * 1000 * dataObj.expirationDate),
  43. domain: dataObj.domain,
  44. httpOnly: dataObj.httpOnly,
  45. secure: dataObj.secure,
  46. name: dataObj.name,
  47. path: dataObj.path,
  48. sameSite: dataObj.sameSite,
  49. value: dataObj.value,
  50. hostOnly: dataObj.hostOnly,
  51. });
  52. }
  53. const getAllCookie = h => { // 引数に渡した要素にサイト内のCookieを表示する関数
  54. GM.cookie.list({}).then(d => {
  55. h.empty();
  56. h.append(`Cookieの数 : ${d.length}個`);
  57. if (d.length === 0) {
  58. h.append("<br>Cookieが見つかりませんでした");
  59. return;
  60. }
  61. d.forEach(v => {
  62. let arr = [];
  63. for (let k in v) arr.push(`${k} : ${v[k]}`);
  64. let cookieText = arr.join("\n");
  65. yaju1919.addInputText(h, {
  66. readonly: true,
  67. textarea: true,
  68. value: cookieText,
  69. width: "100%",
  70. });
  71. // Cookieが表示されたtextareaがフォーカスされたらCookieの情報を各input要素に入力
  72. let elm = h.find("textarea").last();
  73. elm.focus(() => {
  74. let obj = {};
  75. elm.val().split("\n").forEach(v => obj[v.split(" : ")[0]] = v.split(" : ")[1]);
  76. setVal(h.parent().find("input"), [obj.name, obj.value, obj.domain, obj.path, 0, obj.sameSite], [obj.hostOnly, obj.secure, obj.httpOnly]);
  77. });
  78. //------------------------------------------------------------------------------
  79. });
  80. h.append("<br>");
  81. });
  82. }
  83. const setConfig = () => {
  84. const h = $("<div>");
  85. const h2 = $("<div>").appendTo(h);
  86. addBtn(h, "Cookie取得", () => getAllCookie(h2));
  87. addBtn(h, "Cookie全削除", () => {
  88. GM.cookie.list({}).then(d => d.forEach(v => GM.cookie.delete({
  89. name: v.name,
  90. })));
  91. if (h.find("textarea").length !== 0) setTimeout(() => getAllCookie(h2), 100); // Cookie情報の更新
  92. });
  93. addBtn(h, "表示クリア", () => h2.empty());
  94. h.append("<br><br>");
  95. addBtn(h, "編集", () => {
  96. let inputElm = h.find("input");
  97. let keys = ["name", "value", "domain", "path", "expirationDate", "sameSite", "hostOnly", "secure", "httpOnly"];
  98. let inputValObj = {};
  99. inputElm.each((i, e) => {
  100. if (keys[i] === "name" || keys[i] === "value") inputValObj[keys[i]] = encodeURIComponent(e.value);
  101. else if (i < 6) inputValObj[keys[i]] = e.value;
  102. else inputValObj[keys[i]] = e.checked;
  103. });
  104. setCookie(inputValObj);
  105. if (h.find("textarea").length !== 0) getAllCookie(h2); // Cookie情報の更新
  106. });
  107. addBtn(h, "削除", () => {
  108. GM.cookie.delete({
  109. name: h.find("input").eq(0).val(),
  110. });
  111. if (h.find("textarea").length !== 0) getAllCookie(h2); // Cookie情報の更新
  112. });
  113. addBtn(h, "クリア", () => setVal(h.find("input"), ["", "", "", "", 0, "unspecified"], ["false", "false", "false"]));
  114. // 入力欄やチェックボックスなどの追加 //////////////////////////////
  115. yaju1919.addInputText(h, {
  116. title: "名前",
  117. placeholder: "Cookieの名前を入力",
  118. save: "AM_cookieName",
  119. width: "100%",
  120. });
  121. yaju1919.addInputText(h, {
  122. title: "値",
  123. placeholder: "Cookieの値を入力",
  124. save: "AM_cookieValue",
  125. width: "100%",
  126. hankaku: false,
  127. });
  128. yaju1919.addInputText(h, {
  129. title: "ドメイン",
  130. placeholder: "ドメインを入力",
  131. save: "AM_cookieDomain",
  132. width: "100%",
  133. });
  134. yaju1919.addInputText(h, {
  135. title: "パス",
  136. placeholder: "パスを入力",
  137. save: "AM_cookiePath",
  138. width: "100%",
  139. });
  140. yaju1919.addInputNumber(h, {
  141. title: "有効期限",
  142. placeholder: "Cookieの有効期限を入力",
  143. save: "AM_cookieExpireDays",
  144. width: "100%",
  145. value: 0,
  146. min: Number.NEGATIVE_INFINITY,
  147. max: Infinity,
  148. });
  149. yaju1919.addInputText(h, {
  150. title: "SameSite",
  151. placeholder: "SameSiteを入力",
  152. save: "AM_cookieSameSite",
  153. width: "100%",
  154. change: () => { // SameSiteの入力欄が空なら既定値に戻す
  155. if (h.find("input").eq(5).val() === "") setTimeout(() => h.find("input").eq(5).val("unspecified"));
  156. }
  157. });
  158. h.append("<br>");
  159. addCheckbox(h, "ホストのみ");
  160. addCheckbox(h, "安全");
  161. addCheckbox(h, "HTTPのみ");
  162. ////////////////////////////////////////////////////////////////////
  163. return h;
  164. }
  165. win.Managed_Extensions["Cookie Editor EX"] = {
  166. config: setConfig,
  167. tag: "実用的",
  168. }
  169. })();