markList Script

special Follows!

  1. // ==UserScript==
  2. // @name markList Script
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.7
  5. // @description special Follows!
  6. // @author 行亦难
  7.  
  8. // @match https://*.summer-plus.net/*
  9. // @match https://*.level-plus.net/*
  10. // @match https://*.white-plus.net/*
  11. // @match https://*.south-plus.net/*
  12. // @match https://*.imoutolove.me/*
  13.  
  14. // @grant GM_setValue
  15. // @grant GM_getValue
  16. // ==/UserScript==
  17.  
  18. // 最大条数
  19. var max_count = 100;
  20.  
  21. (function() {
  22. 'use strict';
  23.  
  24. //use tools
  25.  
  26. if(!jQuery){
  27. console.log('没获取到jq');
  28. return;
  29. }
  30.  
  31. home_element();
  32. home_event();
  33. if(window.location.pathname.includes('index.php') || window.location.pathname == '/'){
  34. console.log('首页')
  35.  
  36. }else if(window.location.pathname == '/u.php'){
  37. console.log('用户信息')
  38.  
  39. }else if(window.location.pathname == '/read.php'){
  40. console.log('帖子详情')
  41. // if(jQuery('a[href$="fid-48.html"].gray3').length){
  42. if(jQuery('.crumbs-item.gray3').text().includes('询问&求物')){
  43. page_element();
  44. }
  45.  
  46. }else{
  47. console.log('其他页面')
  48. }
  49.  
  50. //initTempDiv(`/read.php?tid-1020134.html`)
  51. // Your code here...
  52. })();
  53.  
  54. function home_event(){
  55. // 获取元素和初始值
  56. let oBox = document.querySelector('.div1'),
  57. disX = 0, disY = 0;
  58. let div2 = document.querySelector('.div2');
  59. let close2 = document.querySelector('.c-close');
  60. let open2 = document.querySelector('.c-open');
  61. let refresh = document.querySelector('.refresh-btn');
  62. let loader = document.querySelector('.c-loader');
  63.  
  64.  
  65.  
  66. // 容器鼠标按下事件
  67. oBox.onmousedown = function (e) {
  68. let ev = e || window.event;
  69. disX = ev.clientX - this.offsetLeft;
  70. disY = ev.clientY - this.offsetTop;
  71. document.onmousemove = function (e) {
  72. let ev = e || window.event;
  73. oBox.style.left = (ev.clientX - disX) + 'px';
  74. oBox.style.top = (ev.clientY - disY) + 'px';
  75. };
  76. document.onmouseup = function () {
  77. document.onmousemove = null;
  78. document.onmouseup = null;
  79. };
  80. return false;
  81. };
  82. // 事件不冒泡
  83. div2.onmousedown = (event) => {
  84. event.stopPropagation();
  85. }
  86. close2.onclick = () => {
  87. oBox.style.display = 'none';
  88. open2.style.display = 'block';
  89. }
  90. open2.onclick = (event) => {
  91. oBox.style.display = 'block';
  92. //event.target.style.display = 'none';
  93. jQuery('.c-open').hide()
  94. }
  95. refresh.onclick = () => {
  96. while (document.querySelector('.c-item')) {
  97. document.querySelector('.c-item').remove();
  98. }
  99.  
  100. loader.style.display = 'block';
  101. refresh.style.display = 'none';
  102.  
  103. let mark_map = GM_getValue('mark_map') ? GM_getValue('mark_map') : new Object();
  104. let arr_p = []
  105. for(let item in mark_map){
  106. arr_p.push(initTempDiv(`/read.php?tid=${item}`, item));
  107. }
  108. Promise.all(arr_p).then((res)=>{
  109.  
  110. console.log(res);
  111.  
  112. for(let i of res){
  113. if(i.isAnswer){
  114. mark_map[i.id].isAnswer = true;
  115. }else{
  116. mark_map[i.id].isAnswer = false;
  117. }
  118. }
  119. GM_setValue('mark_map', mark_map);
  120.  
  121. loader.style.display = 'none';
  122. refresh.style.display = 'block';
  123. addHomeList();
  124. })
  125. console.log('循环结束')
  126. return;
  127. //GM_setValue('mark_map', mark_map);
  128. setTimeout(() => {
  129. loader.style.display = 'none';
  130. refresh.style.display = 'block';
  131. addHomeList();
  132. }, 2000)
  133. }
  134. // 清空已读
  135. let reset2 = document.querySelector('.c-reset');
  136. reset2.onclick = () => {
  137. let mark_map = GM_getValue('mark_map');
  138. if(mark_map){
  139. let arr_temp = []
  140. for(let i in mark_map){
  141. if(mark_map[i].rank == 2){
  142. arr_temp.push(mark_map[i])
  143. delete mark_map[i];
  144. }
  145. }
  146. if(arr_temp.length > 0){
  147. GM_setValue('mark_map', mark_map);
  148. while (document.querySelector('.c-item')) {
  149. document.querySelector('.c-item').remove();
  150. }
  151. addHomeList();
  152. }
  153. }
  154. }
  155. }
  156. function home_element(){
  157. // 初始化悬浮窗节点
  158. let cssDiv = document.createElement('style');
  159. cssDiv.innerHTML = initCss();
  160. //let nTable = document.querySelector('#main .t table');
  161. //nTable.appendChild(cssDiv);
  162. let $ = jQuery;
  163. $('#toptool').append($(cssDiv))
  164. $('#toptool').append($(initHtml()))
  165.  
  166. // 12.12更新
  167. $('#guide').prepend($('.c-open'));
  168.  
  169. // 缓存中读取列表
  170. addHomeList()
  171.  
  172. }
  173.  
  174.  
  175. function page_element(){
  176.  
  177. let $ = jQuery;
  178.  
  179. $('#toptool').append($(initMark()));
  180. // 12.12更新
  181.  
  182. let tizName = $('strong [href^=read]').text();
  183. let tizUrl = window.location.pathname + window.location.search;
  184. let tizId = tizUrl.match(/[0-9]+/).toString();
  185. // 加强匹配
  186. //let isAnswer = Boolean($('.tpc_content:eq(3) .s3').length);
  187. let isAnswer = false;
  188. if($('.tpc_content:eq(3) .s3').length){
  189.  
  190. if($('.tpc_content:eq(3) .s3').text().includes('最佳答案奖励')){
  191. isAnswer = true
  192. }
  193. }else{
  194. isAnswer = false;
  195. }
  196.  
  197. let map = GM_getValue('mark_map') ? GM_getValue('mark_map') : new Object();
  198.  
  199. $('.t3').prepend($('.c-mark'));
  200.  
  201. let flag = true
  202.  
  203. for(let key in map){
  204. if(key === tizId){
  205. flag = false;
  206. $('.c-mark').addClass('unmark').text('已 Mark');
  207. }
  208. }
  209.  
  210.  
  211. // 点击mark
  212. $('.c-mark').click((event)=>{
  213. console.log($(event.target));
  214. console.log(flag);
  215. flag=!flag;
  216.  
  217. //console.log(tizName, tizUrl, tizId, isAnswer)
  218.  
  219. map[tizId] = {tizName, tizUrl, tizId, isAnswer, rank: isAnswer?0:1}
  220.  
  221. if(flag){
  222. $('.c-mark').removeClass('unmark').text('Mark');
  223. delete map[tizId];
  224. GM_setValue('mark_map', map);
  225. }else{
  226. $('.c-mark').addClass('unmark').text('已 Mark');
  227. if(Object.keys(map).length > max_count){
  228. return
  229. }
  230. GM_setValue('mark_map', map);
  231. }
  232. })
  233. }
  234.  
  235. function addHomeList(){
  236. // 缓存中读取列表
  237. let $ = jQuery;
  238. let mark_map = GM_getValue('mark_map') ? GM_getValue('mark_map') : new Object();
  239.  
  240. if(!Object.keys(mark_map).length){
  241. $('.c-items').append($(`
  242. <div class="c-item">
  243. <a href="">
  244. 没有mark了~
  245. </a>
  246. </div>`))
  247. }
  248.  
  249.  
  250. let arr = [];
  251. for (let key in mark_map) {
  252. arr.push(mark_map[key]);
  253. }
  254. if (arr.length > 0) {
  255. if (arr.length > 1) {
  256. arr.sort(function (a, b) {
  257. return a.rank - b.rank;
  258. })
  259. }
  260. for(let item of arr){
  261. let str = `<div class="c-item" data-id="${item.tizId}">
  262. <span class="isRead">${item.rank == 2 ? '[已读]' : ''}</span>
  263. <a href="${item.tizUrl}" class="c-item-text" data-id="${item.tizId}" target="_blank">
  264. ${item.tizName}
  265. </a>
  266. <b class="answer">${item.isAnswer ? '[有答案]' : ''}</b>
  267. <strong><a href="javascript:void(0);" class="c-del">[删除]</a></strong>
  268. </div>`
  269. $('.c-items').append($(str))
  270. }
  271. }
  272.  
  273. $('.c-del').click(function(event){
  274. //删除marke
  275. let item = $(event.target).parent().parent();
  276. console.log(item.data())
  277. if(item.data().id){
  278. item.remove()
  279. //console.log(mark_map)
  280. delete mark_map[item.data().id]
  281. GM_setValue('mark_map', mark_map);
  282. }
  283. })
  284.  
  285. //点击有答案的,标记已读
  286. $('.c-item-text').on('click', function(event){
  287.  
  288. console.log($(event.target).data())
  289. let id = $(event.target).data().id
  290. if(id && mark_map[id].isAnswer){
  291. $('.c-items').append($(event.target).parent())
  292. mark_map[id].rank = 2;
  293. GM_setValue('mark_map', mark_map);
  294. $(event.target).parent().find('.isRead').text('[已读]');
  295. }
  296.  
  297. })
  298. }
  299. function delItem(id){
  300.  
  301. }
  302.  
  303. async function initTempDiv(url, id){
  304. // 创建缓存节点,解析文本形式的html
  305. let $ = jQuery;
  306. let p1 = await getPageData(url);
  307. let tempDiv = document.createElement('div');
  308. tempDiv.innerHTML = p1;
  309.  
  310. let tic = $(tempDiv)
  311. //let flag = tic.find('.tpc_content:eq(3) .s3').get(0)
  312.  
  313. let flag = false;
  314. if(tic.find('.tpc_content:eq(3) .s3').length){
  315.  
  316. if(tic.find('.tpc_content:eq(3) .s3').text().includes('最佳答案奖励')){
  317. flag = true
  318. }
  319. }else{
  320. flag = false;
  321. }
  322.  
  323. if(flag){
  324. console.log(flag)
  325. return {isAnswer:Boolean(flag), id};
  326. }else{
  327. console.log('无')
  328. return {isAnswer: false, id};
  329. }
  330.  
  331. }
  332. // 获取求物区的帖子数据
  333. function getPageData(url){
  334. return new Promise(function(resolve, reject){
  335. let xhr = new XMLHttpRequest();
  336. xhr.open('GET', url, true);
  337. xhr.onreadystatechange = function() {
  338. if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) {
  339. resolve(xhr.responseText)
  340. }
  341. }
  342. xhr.send();
  343. })
  344. }
  345.  
  346.  
  347.  
  348. function initHtml(){
  349. return `<div class="div1">
  350. <span>&nbsp;&nbsp;此处拖动</span><span>&nbsp;&nbsp;>>>> Mark列表</span>
  351. <span class="btn c-close">缩小</span>
  352. <span class="btn c-reset">清空已读</span>
  353. <div class="div2">
  354. <div class="c-items">
  355. </div>
  356. <div class="c-loader">
  357. <div class="loader">Loading...</div>
  358. </div>
  359. </div>
  360. <div class="refresh-btn">
  361.  
  362. <span class="btn">刷新</span>
  363.  
  364. </div>
  365. </div>
  366. <li class="c-open">
  367. <a href="javascript:void(0);">Mark列表</a>
  368. </li>`
  369. }
  370. function initMark(){
  371. return `<div class="c-mark btn">Mark</div>`
  372. }
  373. function initCss() {
  374. // 初始化样式
  375. let textCss = `
  376. .div1 {
  377. width: 20vw;
  378. min-height: 100px;
  379. max-height: 75vh;
  380. position: fixed;
  381. right: 0;
  382. top: 30%;
  383. padding-top: 20px;
  384. border-radius: 5px;
  385. overflow-x: hidden;
  386. overflow-y: scroll;
  387. z-index: 999;
  388. text-align: left;
  389. cursor: pointer;
  390. display:none;
  391. background-color: white;
  392. border: 1px solid black;
  393. }
  394. .c-open{
  395. cursor: pointer;
  396. float: left;
  397. }
  398. .refresh-btn{
  399. height: 20px;
  400. padding: 8px;
  401. width: max-content;
  402. }
  403. .div2 {
  404. margin-top: 20px;
  405. min-height: 200px;
  406. background-color: white;
  407. border-bottom: 1px solid;
  408. border-top: 1px solid;
  409.  
  410. }
  411.  
  412. .c-close, .c-reset {
  413. cursor: pointer;
  414. float: right;
  415. margin-right: 5px;
  416. padding: 2px 10px;
  417. }
  418.  
  419. .c-item {
  420. line-height: 24px;
  421. border-bottom: 1px dashed;
  422. padding: 0 0 0 3px;
  423. }
  424. .c-mark{
  425. cursor: pointer;
  426. float: right;
  427. color: white;
  428. width: 83px;
  429. height: 25px;
  430. line-height: 25px;
  431. margin: 0 5px;
  432. font-size: 18px;
  433. border-radius: 3px;
  434. text-align: center;
  435. position: relative;
  436. z-index: 1;
  437. overflow: hidden;
  438. box-shadow: 0rem 0.25rem 0.25rem rgb(45, 50, 58);
  439. cursor: pointer;
  440. transition: all 200ms ease;
  441. }
  442. .unmark{
  443. filter: grayscale(100%);
  444. }
  445.  
  446. .answer {
  447. color:red;
  448. }
  449.  
  450. .c-loader {
  451. display: none;
  452. }
  453.  
  454. .loader {
  455. color: yellow;
  456. font-size: 60px;
  457. text-indent: -9999em;
  458. overflow: hidden;
  459. width: 1em;
  460. height: 1em;
  461. border-radius: 50%;
  462. margin: 0px auto;
  463. position: relative;
  464. -webkit-transform: translateZ(0);
  465. -ms-transform: translateZ(0);
  466. transform: translateZ(0);
  467. -webkit-animation: load6 1.7s infinite ease, round 1.7s infinite ease;
  468. animation: load6 1.7s infinite ease, round 1.7s infinite ease;
  469. }
  470.  
  471. @-webkit-keyframes load6 {
  472. 0% {
  473. box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  474. }
  475.  
  476. 5%,
  477. 95% {
  478. box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  479. }
  480.  
  481. 10%,
  482. 59% {
  483. box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
  484. }
  485.  
  486. 20% {
  487. box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
  488. }
  489.  
  490. 38% {
  491. box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
  492. }
  493.  
  494. 100% {
  495. box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  496. }
  497. }
  498.  
  499. @keyframes load6 {
  500. 0% {
  501. box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  502. }
  503.  
  504. 5%,
  505. 95% {
  506. box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  507. }
  508.  
  509. 10%,
  510. 59% {
  511. box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
  512. }
  513.  
  514. 20% {
  515. box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
  516. }
  517.  
  518. 38% {
  519. box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
  520. }
  521.  
  522. 100% {
  523. box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  524. }
  525. }
  526.  
  527. @-webkit-keyframes round {
  528. 0% {
  529. -webkit-transform: rotate(0deg);
  530. transform: rotate(0deg);
  531. }
  532.  
  533. 100% {
  534. -webkit-transform: rotate(360deg);
  535. transform: rotate(360deg);
  536. }
  537. }
  538.  
  539. @keyframes round {
  540. 0% {
  541. -webkit-transform: rotate(0deg);
  542. transform: rotate(0deg);
  543. }
  544.  
  545. 100% {
  546. -webkit-transform: rotate(360deg);
  547. transform: rotate(360deg);
  548. }
  549. }`;
  550. return textCss;
  551. }

QingJ © 2025

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