LeetCodeRating|English

LeetCodeRating The score of the weekly competition is displayed, and currently supports the tag page, question bank page, problem_list page and question page

当前为 2022-12-29 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name LeetCodeRating|English
  3. // @namespace https://github.com/zhang-wangz
  4. // @version 1.1.0
  5. // @license MIT
  6. // @description LeetCodeRating The score of the weekly competition is displayed, and currently supports the tag page, question bank page, problem_list page and question page
  7. // @author 小东是个阳光蛋(Leetcode Nickname of chinese site
  8. // @leetcodehomepage https://leetcode.cn/u/runonline/
  9. // @homepageURL https://github.com/zhang-wangz/LeetCodeRating
  10. // @contributionURL https://www.showdoc.com.cn/2069209189620830
  11. // @match *://*leetcode.com/*
  12. // @grant GM_xmlhttpRequest
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // @grant GM_addStyle
  16. // @grant GM_getResourceText
  17. // @connect zerotrac.github.io
  18. // @connect raw.staticdn.net
  19. // @connect raw.githubusercontents.com
  20. // @connect raw.githubusercontent.com
  21. // @require https://gcore.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js
  22. // @require https://gcore.jsdelivr.net/gh/andywang425/BLTH@4368883c643af57c07117e43785cd28adcb0cb3e/assets/js/library/layer.min.js
  23. // @resource css https://gcore.jsdelivr.net/gh/andywang425/BLTH@d25aa353c8c5b2d73d2217b1b43433a80100c61e/assets/css/layer.css
  24. // @grant unsafeWindow
  25. // @run-at document-end
  26. // @note 2022-12-29 1.1.0 add english site support
  27. // ==/UserScript==
  28.  
  29. (function () {
  30. 'use strict';
  31. let t2rate = {}
  32. let latestpb = {}
  33. let id1 = ""
  34. let id2 = ""
  35. let id3 = ""
  36. let id4 = ""
  37. let id5 = ""
  38. let id6 = ""
  39. let version = "1.1.0"
  40. let preDate
  41. let allUrl = "https://leetcode.com/problemset"
  42. let tagUrl = "https://leetcode.com/tag"
  43. let pblistUrl = "https://leetcode.com/problem-list"
  44. let pbUrl = "https://leetcode.com/problems"
  45. GM_addStyle(GM_getResourceText("css"));
  46.  
  47. // 深拷贝
  48. function deepclone(obj) {
  49. let str = JSON.stringify(obj);
  50. return JSON.parse(str);
  51. }
  52.  
  53. // 获取数字
  54. function getcontestNumber(url) {
  55. return parseInt(url.substr(15));
  56. }
  57.  
  58. // 获取时间
  59. function getCurrentDate(format) {
  60. let now = new Date();
  61. let year = now.getFullYear(); //得到年份
  62. let month = now.getMonth(); //得到月份
  63. let date = now.getDate(); //得到日期
  64. let hour = now.getHours(); //得到小时
  65. let minu = now.getMinutes(); //得到分钟
  66. let sec = now.getSeconds(); //得到秒
  67. month = month + 1;
  68. if (month < 10) month = "0" + month;
  69. if (date < 10) date = "0" + date;
  70. if (hour < 10) hour = "0" + hour;
  71. if (minu < 10) minu = "0" + minu;
  72. if (sec < 10) sec = "0" + sec;
  73. let time = "";
  74. // 精确到天
  75. if (format == 1) {
  76. time = year + "年" + month + "月" + date + "日";
  77. }
  78. // 精确到分
  79. else if (format == 2) {
  80. time = year + "-" + month + "-" + date + " " + hour + ":" + minu + ":" + sec;
  81. }
  82. return time;
  83. }
  84.  
  85.  
  86.  
  87. let t // all and tag
  88. let t1, le // pb
  89. function getData() {
  90. try {
  91. let arr = document.querySelector("#__next > div > div > div.grid.grid-cols-4.gap-4.md\\:grid-cols-3.lg\\:grid-cols-4.lg\\:gap-6 > div.col-span-4.z-base.md\\:col-span-2.lg\\:col-span-3 > div:nth-child(7) > div.-mx-4.md\\:mx-0 > div > div > div:nth-child(2)")
  92. // pb页面加载时直接返回
  93. if (arr == undefined) {
  94. return
  95. }
  96.  
  97. // 防止过多的无效操作
  98. if (t != undefined && t == arr.lastChild.innerHTML) {
  99. return
  100. }
  101.  
  102. let childs = arr.childNodes
  103. for (let idx = 0; idx < childs.length; idx++) {
  104. let v = childs[idx]
  105. let length = v.childNodes.length
  106. let t = v.childNodes[1].childNodes[0].childNodes[0].childNodes[0].childNodes[0].childNodes[0].innerText
  107. let data = t.split(".")
  108. let id = data[0].trim()
  109. let nd = v.childNodes[length - 2].childNodes[0].innerHTML
  110. if (t2rate[id] != undefined) {
  111. nd = t2rate[id]["Rating"]
  112. v.childNodes[length - 2].childNodes[0].innerHTML = nd
  113. } else {
  114. let nd2ch = { "text-olive dark:text-dark-olive": "Easy", "text-yellow dark:text-dark-yellow": "Medium", "text-pink dark:text-dark-pink": "Hard" }
  115. let cls = v.childNodes[length - 2].childNodes[0].getAttribute("class")
  116. v.childNodes[length - 2].childNodes[0].innerHTML = nd2ch[cls]
  117. }
  118. }
  119. t = deepclone(arr.lastChild.innerHTML)
  120. } catch (e) {
  121. return
  122. }
  123. }
  124.  
  125. function getTagData() {
  126. if (!window.location.href.startsWith(tagUrl)) {
  127. clearInterval(id2)
  128. id3 = setInterval(getpb, 1)
  129. GM_setValue("pb", id3)
  130. return
  131. }
  132. try {
  133. let arr = document.querySelector("#app > div > div.ant-row.content__xk8m > div > div > div > table > tbody")
  134. if (t != undefined && t == arr.lastChild.innerHTML) {
  135. return
  136. }
  137. let childs = arr.childNodes
  138. for (const element of childs) {
  139. let v = element
  140. let length = v.childNodes.length
  141. let idText = v.childNodes[1].innerText
  142. let id = idText.trim()
  143. let nd = v.childNodes[length - 2].childNodes[0].innerHTML
  144. if (t2rate[id] != undefined) {
  145. nd = t2rate[id]["Rating"]
  146. v.childNodes[length - 2].childNodes[0].innerHTML = nd
  147. } else {
  148. let nd2ch = { "label label-success round": "Easy", "label label-warning round": "Medium", "label label-danger round": "Hard" }
  149. let clr = v.childNodes[length - 2].childNodes[0].getAttribute("class")
  150. v.childNodes[length - 2].childNodes[0].innerHTML = nd2ch[clr]
  151. }
  152. }
  153. t = deepclone(arr.lastChild.innerHTML)
  154. } catch (e) {
  155. return
  156. }
  157. }
  158.  
  159.  
  160. function getPblistData() {
  161. if (!window.location.href.startsWith(pblistUrl)) {
  162. clearInterval(id5)
  163. id3 = setInterval(getpb, 1)
  164. GM_setValue("pb", id3)
  165. return
  166. }
  167. try {
  168. let arr = document.querySelector("#__next > div > div.mx-auto.mt-\\[50px\\].w-full.grow.p-4.md\\:mt-0.md\\:max-w-\\[888px\\].md\\:p-6.lg\\:max-w-screen-xl.bg-overlay-1.dark\\:bg-dark-overlay-1.md\\:bg-paper.md\\:dark\\:bg-dark-paper > div > div.col-span-4.md\\:col-span-2.lg\\:col-span-3 > div:nth-child(2) > div.-mx-4.md\\:mx-0 > div > div > div:nth-child(2)")
  169. if (t != undefined && t == arr.lastChild.innerHTML) {
  170. return
  171. }
  172. let childs = arr.childNodes
  173. for (const element of childs) {
  174. let v = element
  175. let length = v.childNodes.length
  176. let t = v.childNodes[1].childNodes[0].childNodes[0].childNodes[0].childNodes[0].childNodes[0].innerText
  177. let data = t.split(".")
  178. let id = data[0].trim()
  179. let nd = v.childNodes[length - 2].childNodes[0].innerHTML
  180.  
  181. if (t2rate[id] != undefined) {
  182. nd = t2rate[id]["Rating"]
  183. v.childNodes[length - 2].childNodes[0].innerHTML = nd
  184. } else {
  185. let nd2ch = { "text-olive dark:text-dark-olive": "Easy", "text-yellow dark:text-dark-yellow": "Medium", "text-pink dark:text-dark-pink": "Hard" }
  186. let cls = v.childNodes[length - 2].childNodes[0].getAttribute("class")
  187. v.childNodes[length - 2].childNodes[0].innerHTML = nd2ch[cls]
  188. }
  189. }
  190. t = deepclone(arr.lastChild.innerHTML)
  191. } catch (e) {
  192. return
  193. }
  194. }
  195.  
  196. function getpb() {
  197. if (!window.location.href.startsWith(pbUrl)) {
  198. clearInterval(id3)
  199. if (window.location.href.startsWith(allUrl)){
  200. id1 = setInterval(getData, 1)
  201. GM_setValue("all", id1)
  202. }else if (window.location.href.startsWith(tagUrl)) {
  203. id2 = setInterval(getTagData, 1)
  204. GM_setValue("tag", id2)
  205. } else if (window.location.href.startsWith(pblistUrl)) {
  206. id5 = setInterval(getPblistData, 1)
  207. GM_setValue("pblist", id5)
  208. }
  209. return
  210. }
  211.  
  212. try {
  213.  
  214. // 旧版的标题位置
  215. let t = document.querySelector("#app > div > div.main__2_tD > div.content__3fR6 > div > div.side-tools-wrapper__1TS9 > div > div.css-1gd46d6-Container.e5i1odf0 > div.css-jtoecv > div > div.tab-pane__ncJk.css-1eusa4c-TabContent.e5i1odf5 > div > div.css-101rr4k > div.css-v3d350")
  216. if (t == undefined){
  217. // 新版逻辑
  218. t = document.querySelector("#qd-content > div.h-full.flex-col.ssg__qd-splitter-primary-w > div > div > div > div.flex.h-full.w-full.overflow-y-auto > div > div > div.w-full.px-5.pt-4 > div > div:nth-child(1) > div.flex-1 > div > div > span")
  219. if (t == undefined) {
  220. t1 = "unknown"
  221. return
  222. }
  223. let data = t.innerText.split(".")
  224. let id = data[0].trim()
  225. let colorSpan = document.querySelector("#qd-content > div.h-full.flex-col.ssg__qd-splitter-primary-w > div > div > div > div.flex.h-full.w-full.overflow-y-auto > div > div > div.w-full.px-5.pt-4 > div > div.mt-3.flex.space-x-4 > div:nth-child(1) > div")
  226. let pa = colorSpan.parentNode.parentNode
  227. if (t1 != undefined && t1 == id) {
  228. return
  229. }
  230. // 新版统计难度分数并且修改
  231. let nd = colorSpan.getAttribute("class")
  232. let nd2ch = { "dark:text-dark-olive text-olive": "Easy", "dark:bg-dark-yellow text-yellow": "Medium", "dark:text-dark-pink text-pink": "Hard" }
  233. if (t2rate[id] != undefined) {
  234. colorSpan.innerHTML = t2rate[id]["Rating"]
  235. } else {
  236. for (let item in nd2ch) {
  237. if (nd.toString().includes(item)) {
  238. colorSpan.innerHTML = nd2ch[item]
  239. break
  240. }
  241. }
  242. }
  243. // 新版逻辑,准备做周赛链接,如果已经不存在组件就执行操作
  244. let url = "https://leetcode.com/contest/"
  245. let zhUrl = "https://leetcode.com/contest/"
  246. let q = pa.lastChild
  247. let le = pa.childNodes.length
  248. if (q.textContent == "") {
  249. let abody = document.createElement("a")
  250. abody.setAttribute("data-small-spacing", "true")
  251. abody.setAttribute("class", "css-nabodd-Button e167268t1")
  252.  
  253. let abody2 = document.createElement("a")
  254. abody2.setAttribute("data-small-spacing", "true")
  255. abody2.setAttribute("class", "css-nabodd-Button e167268t1")
  256.  
  257. let span = document.createElement("span")
  258. let span2 = document.createElement("span")
  259. // ContestID_en ContestSlug
  260. if (t2rate[id] != undefined) {
  261. let contestUrl;
  262. let num = getcontestNumber(t2rate[id]["ContestSlug"])
  263. if (num < 83) { contestUrl = zhUrl } else { contestUrl = url }
  264. span.innerText = t2rate[id]["ContestID_en"]
  265. span2.innerText = t2rate[id]["ProblemIndex"]
  266.  
  267. abody.setAttribute("href", contestUrl + t2rate[id]["ContestSlug"])
  268. abody.setAttribute("target", "_blank")
  269. abody.removeAttribute("hidden")
  270.  
  271. abody2.setAttribute("href", contestUrl + t2rate[id]["ContestSlug"] + "/problems/" + t2rate[id]["TitleSlug"])
  272. abody2.setAttribute("target", "_blank")
  273. abody2.removeAttribute("hidden")
  274. } else {
  275. span.innerText = "对应周赛未知"
  276. abody.setAttribute("href", "")
  277. abody.setAttribute("target", "_self")
  278. abody.setAttribute("hidden", "true")
  279.  
  280. span2.innerText = "未知"
  281. abody2.setAttribute("href", "")
  282. abody2.setAttribute("target", "_self")
  283. abody2.setAttribute("hidden", "true")
  284. }
  285. abody.appendChild(span)
  286. abody2.appendChild(span2)
  287. pa.appendChild(abody)
  288. pa.appendChild(abody2)
  289. } else if(q.textContent.charAt(0) == "Q" || q.textContent == "未知") { // 存在就直接替换
  290. if (t2rate[id] != undefined) {
  291. let contestUrl;
  292. let num = getcontestNumber(t2rate[id]["ContestSlug"])
  293. if (num < 83) { contestUrl = zhUrl } else { contestUrl = url }
  294. pa.childNodes[le - 2].childNodes[0].innerText = t2rate[id]["ContestID_en"]
  295. pa.childNodes[le - 2].setAttribute("href", contestUrl + t2rate[id]["ContestSlug"])
  296. pa.childNodes[le - 2].setAttribute("target", "_blank")
  297. pa.childNodes[le - 2].removeAttribute("hidden")
  298.  
  299. pa.childNodes[le - 1].childNodes[0].innerText = t2rate[id]["ProblemIndex"]
  300. pa.childNodes[le - 1].setAttribute("href", contestUrl + t2rate[id]["ContestSlug"] + "/problems/" + t2rate[id]["TitleSlug"])
  301. pa.childNodes[le - 1].setAttribute("target", "_blank")
  302. pa.childNodes[le - 1].removeAttribute("hidden")
  303. } else {
  304. pa.childNodes[le - 2].childNodes[0].innerText = "对应周赛未知"
  305. pa.childNodes[le - 2].setAttribute("href", "")
  306. pa.childNodes[le - 2].setAttribute("target", "_self")
  307. pa.childNodes[le - 2].setAttribute("hidden", "true")
  308.  
  309. pa.childNodes[le - 1].childNodes[0].innerText = "未知"
  310. pa.childNodes[le - 1].setAttribute("href", "")
  311. pa.childNodes[le - 1].setAttribute("target", "_self")
  312. pa.childNodes[le - 1].setAttribute("hidden", "true")
  313. }
  314. }
  315. t1 = deepclone(id)
  316.  
  317. }else {
  318. // 旧版逻辑,使用参数t和t1,分别代表标题的html和标题id
  319.  
  320. // 旧版题目左侧列表里面所有分数
  321. let pbAll = document.querySelector("body > div.question-picker-detail__2A9V.show__GfjG > div.question-picker-detail-menu__3NQq.show__3hiR > div.lc-theme-dark.question-picker-questions-wrapper__13qM > div")
  322. if (pbAll != undefined) {
  323. let childs = pbAll.childNodes
  324. for (const element of childs) {
  325. let v = element
  326. let length = v.childNodes.length
  327. let t = v.childNodes[0].childNodes[1].innerText
  328. let data = t.split(" ")[0]
  329. let id = data.slice(1)
  330. let nd = v.childNodes[length - 1].childNodes[0].innerText
  331. if (t2rate[id] != undefined) {
  332. nd = t2rate[id]["Rating"]
  333. v.childNodes[length - 1].childNodes[0].innerText = nd
  334. }
  335. }
  336. }
  337. // 旧版标题修改位置
  338. let data = t.innerText.split(".")
  339. let id = data[0].trim()
  340. let colorSpan = document.querySelector("#app > div > div.main__2_tD > div.content__3fR6 > div > div.side-tools-wrapper__1TS9 > div > div.css-1gd46d6-Container.e5i1odf0 > div.css-jtoecv > div > div.tab-pane__ncJk.css-1eusa4c-TabContent.e5i1odf5 > div > div.css-101rr4k > div.css-10o4wqw > div")
  341. let pa = colorSpan.parentNode
  342. if ((t1 != undefined && t1 == id) && (le != undefined && le <= pa.childNodes.length)) {
  343. return
  344. }
  345. // 统计难度分数
  346. let nd = colorSpan.getAttribute("diff")
  347. let nd2ch = { "easy": "Easy", "medium": "Medium", "hard": "Hard" }
  348. if (t2rate[id] != undefined) {
  349. colorSpan.innerHTML = t2rate[id]["Rating"]
  350. } else {
  351. colorSpan.innerHTML = nd2ch[nd]
  352. }
  353. // 准备做周赛链接,如果已经不存在组件就执行操作
  354. let url = "https://leetcode.com/contest/"
  355. let zhUrl = "https://leetcode.com/contest/"
  356. if (le == undefined || le != pa.childNodes.length) {
  357.  
  358. let button = document.createElement("button")
  359. button.setAttribute("class", "btn__r7r7 css-1rdgofi")
  360. let abody = document.createElement("a")
  361. abody.setAttribute("style", "color: #546E7A;")
  362.  
  363. let button2 = document.createElement("button")
  364. button2.setAttribute("class", "btn__r7r7 css-1rdgofi")
  365. let abody2 = document.createElement("a")
  366. abody2.setAttribute("style", "color: #546E7A;")
  367.  
  368. // ContestID_en ContestSlug
  369. if (t2rate[id] != undefined) {
  370. let contestUrl;
  371. let num = getcontestNumber(t2rate[id]["ContestSlug"])
  372. if (num < 83) { contestUrl = zhUrl } else { contestUrl = url }
  373. abody.innerText = t2rate[id]["ContestID_en"]
  374. abody2.innerText = t2rate[id]["ProblemIndex"]
  375.  
  376. abody.setAttribute("href", contestUrl + t2rate[id]["ContestSlug"])
  377. abody.setAttribute("target", "_blank")
  378. abody.removeAttribute("hidden")
  379.  
  380. abody2.setAttribute("href", contestUrl + t2rate[id]["ContestSlug"] + "/problems/" + t2rate[id]["TitleSlug"])
  381. abody2.setAttribute("target", "_blank")
  382. abody2.removeAttribute("hidden")
  383. } else {
  384. span.innerText = "对应周赛未知"
  385. abody.setAttribute("href", "")
  386. abody.setAttribute("target", "_self")
  387. abody.setAttribute("hidden", "true")
  388.  
  389. span2.innerText = "未知"
  390. abody2.setAttribute("href", "")
  391. abody2.setAttribute("target", "_self")
  392. abody2.setAttribute("hidden", "true")
  393. }
  394.  
  395. button.appendChild(abody)
  396. button2.appendChild(abody2)
  397. pa.appendChild(button)
  398. pa.appendChild(button2)
  399. } else if (le == pa.childNodes.length) { // 存在就直接替换
  400. if (t2rate[id] != undefined) {
  401. let contestUrl;
  402. let num = getcontestNumber(t2rate[id]["ContestSlug"])
  403. if (num < 83) { contestUrl = zhUrl } else { contestUrl = url }
  404. pa.childNodes[le - 2].childNodes[0].innerText = t2rate[id]["ContestID_en"]
  405. pa.childNodes[le - 2].setAttribute("href", contestUrl + t2rate[id]["ContestSlug"])
  406. pa.childNodes[le - 2].setAttribute("target", "_blank")
  407. pa.childNodes[le - 2].removeAttribute("hidden")
  408.  
  409. pa.childNodes[le - 1].childNodes[0].childNodes[0].innerText = t2rate[id]["ProblemIndex"]
  410. pa.childNodes[le - 1].childNodes[0].setAttribute("href", contestUrl + t2rate[id]["ContestSlug"] + "/problems/" + t2rate[id]["TitleSlug"])
  411. pa.childNodes[le - 1].childNodes[0].setAttribute("target", "_blank")
  412. pa.childNodes[le - 1].childNodes[0].removeAttribute("hidden")
  413. } else {
  414. pa.childNodes[le - 2].childNodes[0].innerText = "对应周赛未知"
  415. pa.childNodes[le - 2].setAttribute("href", "")
  416. pa.childNodes[le - 2].setAttribute("target", "_self")
  417. pa.childNodes[le - 2].setAttribute("hidden", "true")
  418.  
  419. pa.childNodes[le - 1].childNodes[0].childNodes[0].innerText = "未知"
  420. pa.childNodes[le - 1].childNodes[0].setAttribute("href", "")
  421. pa.childNodes[le - 1].childNodes[0].setAttribute("target", "_self")
  422. pa.childNodes[le - 1].childNodes[0].setAttribute("hidden", "true")
  423. }
  424. }
  425. le = pa.childNodes.length
  426. t1 = deepclone(id)
  427. }
  428. } catch (e) {
  429. return
  430. }
  431. }
  432.  
  433. t2rate = JSON.parse(GM_getValue("t2ratedb", "{}").toString())
  434. latestpb = JSON.parse(GM_getValue("latestpb", "{}").toString())
  435. preDate = GM_getValue("preDate", "")
  436. let now = getCurrentDate(1)
  437. if (t2rate["idx13"] == undefined || (preDate == "" || preDate != now)) {
  438. GM_xmlhttpRequest({
  439. method: "get",
  440. url: 'https://raw.staticdn.net/zerotrac/leetcode_problem_rating/main/data.json' + "?timeStamp=" + new Date().getTime(),
  441. headers: {
  442. "Content-Type": "application/x-www-form-urlencoded",
  443. "user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
  444. },
  445. onload: function (res) {
  446. if (res.status === 200) {
  447. // 保留唯一标识
  448. t2rate = {}
  449. let dataStr = res.response
  450. let json = eval(dataStr)
  451. for (const element of json) {
  452. t2rate[element.ID] = element
  453. t2rate[element.ID]["Rating"] = Number.parseInt(Number.parseFloat(element["Rating"]) + 0.5)
  454. }
  455. t2rate["idx13"] = -13
  456. console.log("everyday getdate once...")
  457. preDate = now
  458. GM_setValue("preDate", preDate)
  459. GM_setValue("t2ratedb", JSON.stringify(t2rate))
  460. }
  461. },
  462. onerror: function (err) {
  463. console.log('error')
  464. console.log(err)
  465. }
  466. });
  467. }
  468. function clearAndStart(start, func, timeout) {
  469. let lst = ['all', 'tag', 'pb', 'company', 'pblist', 'search']
  470. lst.forEach(each => {
  471. if (each !== start) {
  472. let tmp = GM_getValue(each, -1)
  473. clearInterval(tmp)
  474. }
  475. })
  476. if (start !== "") {
  477. let cnt = lst.indexOf(start) + 1
  478. switch (cnt) {
  479. case 1:
  480. id1 = setInterval(func, timeout)
  481. GM_setValue(start, id1)
  482. break
  483. case 2:
  484. id2 = setInterval(func, timeout)
  485. GM_setValue(start, id2)
  486. break
  487. case 3:
  488. id3 = setInterval(func, timeout)
  489. GM_setValue(start, id3)
  490. break
  491. case 4:
  492. id4 = setInterval(func, timeout)
  493. GM_setValue(start, id4)
  494. break
  495. case 5:
  496. id5 = setInterval(func, timeout)
  497. GM_setValue(start, id5)
  498. break
  499. case 6:
  500. id6 = setInterval(func, timeout)
  501. GM_setValue(start, id6)
  502. break
  503. }
  504. }
  505. }
  506.  
  507. [...document.querySelectorAll('*')].forEach(item => {
  508. item.oncopy = function (e) {
  509. e.stopPropagation();
  510. }
  511. });
  512.  
  513. if (window.location.href.startsWith(allUrl)) {
  514. // 版本更新机制
  515. GM_xmlhttpRequest({
  516. method: "get",
  517. url: 'https://raw.staticdn.net/zhang-wangz/LeetCodeRating/english/version.json' + "?timeStamp=" + new Date().getTime(),
  518. headers: {
  519. "Content-Type": "application/x-www-form-urlencoded",
  520. "user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
  521. },
  522. onload: function (res) {
  523. if (res.status === 200) {
  524. console.log("enter home page check version once...")
  525. let dataStr = res.response
  526. let json = JSON.parse(dataStr)
  527. let v = json["version"]
  528. let upcontent = json["content"]
  529. if (v != version) {
  530. layer.open({
  531. content: 'Update notice: <br/>leetcodeRating difficulty plugin has a new version, please go to update ~ <br/>' + "update content: <br/>" + upcontent,
  532. yes: function (index, layer0) {
  533. let c = window.open("https://github.com/zhang-wangz/LeetCodeRating/raw/english/leetcodeRating_greasyfork.user.js")
  534. c.close()
  535. layer.close(index)
  536. }
  537. });
  538. } else {
  539. console.log("leetcodeRating难度分插件当前已经是最新版本~")
  540. }
  541. }
  542. },
  543. onerror: function (err) {
  544. console.log('error')
  545. console.log(err)
  546. }
  547. });
  548.  
  549. clearAndStart('all', getData, 1)
  550. } else if (window.location.href.startsWith(tagUrl)) {
  551. clearAndStart('tag', getTagData, 1)
  552. } else if (window.location.href.startsWith(pbUrl)) {
  553. clearAndStart('pb', getpb, 1)
  554. let id = setInterval(getData, 1)
  555. GM_setValue("all", id)
  556. } else if (window.location.href.startsWith(pblistUrl)) {
  557. clearAndStart('pblist', getPblistData, 1)
  558. } else {
  559. clearAndStart('', undefined, 1)
  560. }
  561. })();

QingJ © 2025

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