Pixiv extended dashboard statistics.

Put view-ratio data on likes, bookmarks, etc.

  1. // ==UserScript==
  2. // @name Pixiv extended dashboard statistics.
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.5
  5. // @description Put view-ratio data on likes, bookmarks, etc.
  6. // @author cro
  7. // @match https://www.pixiv.net/*
  8. // @icon https://www.google.com/s2/favicons?domain=pixiv.net
  9. // @grant none
  10. // @require https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.6/underscore-umd-min.js
  11. // @license MIT
  12. // ==/UserScript==
  13. /* jshint esversion: 6 */
  14.  
  15. (function() {
  16. 'use strict';
  17. let id_name = "cro_pixiv_extended";
  18.  
  19. let make_set_ratio = function(container_query)
  20. {
  21. let get_container = function(node)
  22. {
  23. let maybe_child = node.querySelector(`span[id=${id_name}]`);
  24. if (maybe_child) return maybe_child;
  25. let child = document.createElement('span');
  26. child.id = id_name;
  27. let container = node.querySelector(container_query) || node;
  28. container.append(child);
  29. return child;
  30. };
  31.  
  32. let count = function (node)
  33. {
  34. let data = node.querySelector(container_query) || node;
  35. return parseInt(data.textContent.replace(',', ''));
  36. };
  37.  
  38. return function(target_node, denom_node)
  39. {
  40. if (target_node && denom_node) get_container(target_node).textContent = ` (${(count(target_node) / count(denom_node) * 100).toFixed(2)}%)`;
  41. };
  42. };
  43.  
  44. let query_array = (selector) => Array.from(document.querySelectorAll(selector).values());
  45.  
  46. let process_all = function()
  47. {
  48. if (window.location.pathname == "/dashboard/works")
  49. {
  50. // Desktop view
  51. if (document.querySelector('[class*=sc-1b2i4p6-0]'))
  52. {
  53. let set_ratio = make_set_ratio('a');
  54. let indices = query_array('div[class*=gtm-dashboard-works-sort-select]');
  55. let get_index = function(name)
  56. {
  57. let node = document.querySelector(`div[class*=gtm-dashboard-works-sort-select-${name}]`);
  58. let i = indices.indexOf(node);
  59. return i == -1 ? null : i - 1;
  60. };
  61. let view_index = get_index('view');
  62. let like_index = get_index('rating');
  63. let bookmark_index = get_index('bookmark');
  64. let rows = _.chunk(query_array('div[class*=sc-1b2i4p6-25]'), indices.length + 1);
  65. rows = rows.map(row => row.slice(2));
  66. for (let row of rows)
  67. {
  68. let view = row[view_index];
  69. set_ratio(row[like_index], view);
  70. set_ratio(row[bookmark_index], view);
  71. }
  72. }
  73. // Mobile view
  74. else if (document.querySelector('[class*=sc-18qovzs-0]'))
  75. {
  76. let set_ratio = make_set_ratio('div[class*=sc-18qovzs-13]');
  77. let cell_nodes = query_array('div[class*=sc-18qovzs-7]');
  78. for (let cell of cell_nodes)
  79. {
  80. let view = cell.querySelector('a[href*=access]');
  81. let like = cell.querySelector('a[href*=rating]');
  82. let bookmark = cell.querySelector('a[href*=bookmark]');
  83. set_ratio(like, view);
  84. set_ratio(bookmark, view);
  85. }
  86. }
  87. }
  88. else if (window.location.pathname == "/dashboard")
  89. {
  90. let set_ratio = make_set_ratio(`span:last-of-type:not(#${id_name})`);
  91. let views = query_array('a.gtm-dashboard-home-latest-works-number-link-view');
  92. let likes = query_array('a.gtm-dashboard-home-latest-works-number-link-like');
  93. let bookmarks = query_array('a.gtm-dashboard-home-latest-works-number-link-bookmark');
  94. for (let [view, like, bookmark] of _.zip(views, likes, bookmarks))
  95. {
  96. set_ratio(like, view);
  97. set_ratio(bookmark, view);
  98. }
  99. }
  100. };
  101.  
  102. setInterval(process_all, 500);
  103. })();

QingJ © 2025

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