Coding.NET Activities Grabber

Grab Coding.NET develope activities

  1. // ==UserScript==
  2. // @name Coding.NET Activities Grabber
  3. // @namespace Zcc911
  4. // @version 0.2
  5. // @description Grab Coding.NET develope activities
  6. // @author Zcc911
  7. // @match *://coding.net/user
  8. // @grant none
  9. // @copyright Zcc911
  10. // ==/UserScript==
  11.  
  12. 'use strict';
  13. // https://coding.net/api/activities/joined_watched_projects_last?type=joined_watched_projects_last&last_id=999999999
  14. // https://wangdoc.com/javascript/dom/mutationobserver.html
  15.  
  16. // 通过 document.querySelector('#id||.class||tagname') 获取DOM元素
  17. let container = document.querySelector('div#container');
  18.  
  19. // 所要观察的变动类型(子节点变动、属性变动、节点内容/节点文本变动)
  20. let options = {
  21. attributes: false,
  22. characterData: false,
  23. childList: true,
  24. subtree: true,
  25. attributeOldValue: false,
  26. characterDataOldValue: false
  27. };
  28.  
  29. let watchedActivities;
  30. let watchedArr;
  31. let listEleShow = true;
  32.  
  33. // 使用MutationObserver构造函数,新建一个观察器实例,Mutation Observer API用来监视DOM变动
  34. let DOMObserver = new MutationObserver(function (mutations, DOMObserver) {
  35. // 创建代码推送记录文本框展示节点
  36. let listDiv = document.createElement('div');
  37. let listEle = document.createElement('textarea');
  38. let toggleBtn = document.createElement('button');
  39.  
  40. // 配置代码推送记录展示节点样式
  41. listDiv.style = 'margin: 66px 0 0 10px; position: fixed;'
  42. listEle.rows = 15;
  43. listEle.cols = 140;
  44. toggleBtn.innerText = '隐藏代码推送记录文本框';
  45. toggleBtn.style = 'display: block;';
  46. toggleBtn.addEventListener("click", () => {
  47. listEle.style = listEleShow ? "display: none" : "display: inline-block";
  48. toggleBtn.innerText = listEleShow ? '显示代码推送记录文本框' : '隐藏代码推送记录文本框';
  49. listEleShow = !listEleShow;
  50. });
  51.  
  52. // 插入代码推送记录文本框展示节点
  53. listDiv.appendChild(listEle);
  54. listDiv.appendChild(toggleBtn);
  55.  
  56. mutations.forEach(function(mutation) {
  57. if(mutation.target.id == 'joined_watched_projects_last' && !listEle.value) {
  58. watchedActivities = mutation.target;
  59. watchedArr = watchedActivities.querySelectorAll('.cuk-list-type-blocked>div');
  60. // console.log(watchedActivities);
  61. // console.dir(watchedArr);
  62.  
  63. // 提取推送动态数据
  64. watchedArr.forEach((listBlock) => {
  65. let listDate = listBlock.querySelector('.activity-title-3M6 .title-label-2Mr').innerHTML;
  66. let listArr = listBlock.querySelectorAll('.activity-3yv');
  67. // console.log(listDate);
  68. // console.log(listArr);
  69. let inputText = '' + listDate + '\n';
  70. for(let listIndex = 0; listIndex < listArr.length; listIndex++) {
  71. // console.log(listArr[listIndex].innerText);
  72. inputText += listArr[listIndex].innerText + '\n';
  73. }
  74. listEle.value += inputText + '\n';
  75. })
  76.  
  77. let reactRoot = container.childNodes[0];
  78. reactRoot.insertBefore(listDiv, reactRoot.childNodes[0]);
  79. }
  80. });
  81. });
  82.  
  83. // 观察指定DOM节点
  84. DOMObserver.observe(container, options);
  85. // DOMObserver.disconnect();