VjudgeRankParse

用于爬取vjudge的排名情况

  1. // ==UserScript==
  2. // @license MIT
  3. // @name VjudgeRankParse
  4. // @namespace http://tampermonkey.net
  5. // @version v1.0
  6. // @description 用于爬取vjudge的排名情况
  7. // @author chenyyy28
  8. // @match https://vjudge.net/*
  9. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  10. // @grant GM_xmlhttpRequest
  11. // @grant GM_download
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16.  
  17. let button = document.createElement("li")
  18. button.classList.add("nav-item")
  19. button.innerText = "解析排名"
  20. //button.style.lineHeight = "38px"
  21. button.style.padding = "8px 16px"
  22. button.style.cursor = "pointer"
  23. let title = document.querySelector(".nav.nav-tabs")
  24. title.insertBefore(button,title.querySelector(".text-xs-right"))
  25. button.onclick = parse
  26. function parse(){
  27. let time = prompt("请输入训练截止时间(小时),允许小数")
  28. if(time!=null||time!=""){
  29. let timeInt = parseFloat(time)
  30. let ddl_H = parseInt(timeInt)
  31. let ddl_M = parseInt(60*(timeInt-parseInt(timeInt)))
  32. let ddl = ddl_H.toString()+":"+ddl_M.toString().padStart(2,'0')+":00"
  33. let rankTable = document.querySelector("#contest-rank-table tbody")
  34. let account = []
  35. let ranking = []
  36. let accept = []
  37. let supplement = []
  38. for(let i = 1;i<=rankTable.children.length; i++){
  39. let cssSelector = "tr:nth-child("+i.toString()+")"
  40. let data = rankTable.querySelector(cssSelector)
  41. let accountData = data.querySelector("td:nth-child(2) div a").text;
  42. if(accountData.indexOf(" ") != -1){
  43. accountData = accountData.split(" ")[0]
  44. }
  45. account.push(accountData)
  46. ranking.push(parseInt(data.querySelector("td:nth-child(1)").innerText))
  47. accept.push(0)
  48. supplement.push(0)
  49. for(let j = 5;j<=data.children.length;j++){
  50. let passData = data.querySelector(".accepted:nth-child("+j.toString()+")");
  51. if(passData!=null){
  52. let passTime = passData.innerText.split('\n')[0]
  53. if(passTime>ddl||passTime.length>ddl.length){
  54. supplement[i-1]++;
  55. }else{
  56. accept[i-1]++;
  57. }
  58. }
  59. }
  60. }
  61. console.log(account)
  62. console.log(ranking)
  63. console.log(accept)
  64. console.log(supplement)
  65. let res = []
  66. for(let i = 0;i<rankTable.children.length;i++){
  67. let el = {
  68. account: account[i],
  69. rank: ranking[i],
  70. accept: accept[i],
  71. supplement: supplement[i]
  72. }
  73. res.push(el)
  74. }
  75. res.sort((a,b)=>{
  76. if(a.accept!==b.accpet){
  77. return b.accept-a.accept
  78. }else{
  79. if(a.accept==0){
  80. if(a.supplement>b.supplment){
  81. b.supplement-a.supplement
  82. }else{
  83. return 0;
  84. }
  85. }else{
  86. return 0
  87. }
  88. }
  89. })
  90. let msg = "本次获取结果:\n"
  91. for(let i = 1;i<=rankTable.children.length;i++){
  92. res[i-1].rank = i;
  93. let addMsg = res[i-1].account+"\t:排名 "+res[i-1].rank+ "\t过题数 "+res[i-1].accept+ "\t补题数 " +res[i-1].supplement
  94. msg = msg+addMsg +'\n'
  95. }
  96. msg = msg + "请输入本次训练id\n 如果不清楚id,可以在管理系统查询"
  97. let id = prompt(msg)
  98. if(id!=null&&id!=""){
  99. let url = prompt("请输入数据目标地址")
  100. let req = {
  101. id: id,
  102. platform: "vjudge",
  103. data:res
  104. }
  105. console.log(JSON.stringify(req))
  106. GM_xmlhttpRequest({
  107. method: "POST",
  108. url: url,
  109. headers: {
  110. "Content-Type": "application/json"
  111. },
  112. data:JSON.stringify(req),
  113. onload: function(response){
  114. console.log("请求成功");
  115. console.log(response.responseText);
  116. },
  117. onerror: function(response){
  118. console.log(response);
  119. }
  120. });
  121. }
  122. }
  123. }
  124. })();