Cryptokitty rare highlighter

A userscript that makes rare cryptokitty cattributes more noticeable

  1. // ==UserScript==
  2. // @name Cryptokitty rare highlighter
  3. // @version 2.0.0
  4. // @description A userscript that makes rare cryptokitty cattributes more noticeable
  5. // @license MIT
  6. // @author Rob Garrison
  7. // @namespace https://github.com/Mottie
  8. // @include https://www.cryptokitties.co/*
  9. // @run-at document-idle
  10. // @grant GM_getValue
  11. // @grant GM_setValue
  12. // @grant GM_xmlhttpRequest
  13. // @connect cryptokittydex.com
  14. // @icon https://www.cryptokitties.co/icons/apple-icon-120x120.png
  15. // ==/UserScript==
  16. (() => {
  17. "use strict";
  18.  
  19. let data = GM_getValue("cryptoKittyData", {
  20. updated: 0,
  21. list: {}
  22. });
  23. const checkDelay = 8.64e7; // 24 hours in milliseconds
  24. const maxIterations = 1000;
  25. const rarity = {
  26. "gold": number => number <= 10,
  27. "purple": number => number <= 100,
  28. "orange": number => number <= 500,
  29. "blue": number => number <= 1000,
  30. "green": number => number <= 10000,
  31. "black": number => number <= 100000,
  32. "silver": number => number > 100000
  33. };
  34.  
  35. function buildList() {
  36. GM_xmlhttpRequest({
  37. method: "GET",
  38. url: "https://cryptokittydex.com/",
  39. onload: response => extractList(response.responseText)
  40. });
  41. }
  42.  
  43. function extractList(page = "") {
  44. let pos1 = 0,
  45. pos2 = 0,
  46. counter = 0,
  47. name = "";
  48. const linkPattern = "<a class=\"badge badge-pill badge-cattribute";
  49. const numberPattern = "<span class=\"badge badge-pill badge-secondary\">";
  50.  
  51. // Add counter to prevent infinite loops
  52. while (
  53. counter < maxIterations &&
  54. (pos1 = page.indexOf(linkPattern, pos2)) > -1
  55. ) {
  56. pos2 = page.indexOf(">", pos1);
  57. pos1 = page.indexOf(numberPattern, pos2);
  58. name = page.substring(pos2 + 1, pos1).trim();
  59. pos1 += numberPattern.length;
  60. pos2 = page.indexOf("</span>", pos1);
  61. data.list[name] = parseInt(page.substring(pos1, pos2).replace(/,/g, ""), 10);
  62. counter++;
  63. }
  64. data.updated = new Date().getTime();
  65. GM_setValue("cryptoKittyData", data);
  66. }
  67.  
  68. const getRarity = number => Object.keys(rarity).find(r => rarity[r](number));
  69. const span = document.createElement("small");
  70. span.className = "Cattribute-type";
  71.  
  72. function init() {
  73. if (document.querySelector(".Cattribute-title")) {
  74. if (new Date().getTime() > data.updated + checkDelay) {
  75. buildList();
  76. }
  77. const date = new Date(data.updated)
  78. .toISOString()
  79. .substring(0, 19)
  80. .replace("T", " ");
  81. document.querySelectorAll(".Cattribute-title").forEach(el => {
  82. const number = data.list[el.textContent.trim()] || -1;
  83. if (number > -1 && !el.classList.contains("ckrh-processed")) {
  84. el.classList.add("ckrh-processed");
  85. el.style.color = getRarity(number);
  86. span.textContent = number;
  87. span.title = `Last Updated from CryptoKittydex on ${date} UTC`;
  88. el.insertAdjacentElement("afterend", span.cloneNode(true));
  89. }
  90. });
  91. }
  92. }
  93.  
  94. let timer;
  95. new MutationObserver(() => {
  96. clearTimeout(timer);
  97. timer = setTimeout(() => init(), 500);
  98. }).observe(document.body, {
  99. childList: true,
  100. subtree: true
  101. });
  102. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址