tamper_get_top_trader_sol_gmgn.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. // ==UserScript==
  2. // @name GMGN-Get-Top
  3. // @namespace http://tampermonkey.net/
  4. // @version 2024-10-19
  5. // @description try to take over the world!
  6. // @author You
  7. // @match https://gmgn.ai/sol/token/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=gmgn.ai
  9. // @grant none
  10. // ==/UserScript==
  11. function funcDownload(content, filename) {
  12. console.log('begin download');
  13. // 创建隐藏的可下载链接
  14. let eleLink = document.createElement('a');
  15. eleLink.download = filename;
  16. eleLink.style.display = 'none';
  17. // 字符内容转变成blob地址
  18. let blob = new Blob([content]);
  19. eleLink.href = URL.createObjectURL(blob);
  20. // 触发点击
  21. document.body.appendChild(eleLink);
  22. eleLink.click();
  23. // 然后移除
  24. document.body.removeChild(eleLink);
  25. }
  26. function sleep(sleepdelay) {
  27. return new Promise((resolve, reject) => {
  28. setTimeout(() => {
  29. resolve(sleepdelay);
  30. }, sleepdelay);
  31. })
  32. }
  33. var number_chars_obj = {
  34. "k": 3,
  35. "m": 6,
  36. "b": 9,
  37. "t": 12,
  38. "p": 15
  39. };
  40. var number_chars_arr = ["k", "m", "b", "t", "p"];
  41. function get_thead_arr() {
  42. // let titlearr = _thead.innerText.trim().split(/\r?\n/);
  43. let titlearr = ['Maker', 'SOL', 'Buy_sol', 'Sell_sol', 'Pnl_sol', 'Pnl_per'];
  44. return titlearr;
  45. }
  46. var pre_timestamp = -1;
  47. var now_timestamp = -1;
  48. async function get_tbody_data() {
  49. let div_has_tran_table = document.querySelector("div.chakra-tabs__tab-panels.css-2zi8qu");
  50. let tbody = div_has_tran_table.querySelector("tbody.g-table-tbody");
  51. let arr_tbody_trs;
  52. arr_tbody_trs = Array.from(tbody.children);
  53. arr_tbody_trs.shift();
  54. for (let i = 0; i < arr_tbody_trs.length; i++) {
  55. let arr_tds;
  56. arr_tds = Array.from(arr_tbody_trs[i].children);
  57. let tdtexts = [];
  58. // if (arr_tds.length != 10) {
  59. // continue;
  60. // }
  61. for (let i = 0; i < arr_tds.length; i++) {
  62. if (i == 0) {
  63. // trader
  64. let a_element = arr_tds[i].querySelector("a");
  65. let str_trader = a_element.href.split('/').pop();
  66. tdtexts.push(str_trader);
  67. }
  68. else if (i == 1) {
  69. //sol balance
  70. let str_balance = arr_tds[i].innerText.trim().replace(/[,]/g, "").trim();
  71. str_balance = str_balance.replace(/\s+/g, "");
  72. str_balance = str_balance.toLowerCase();
  73. let float_balance;
  74. float_balance = parseFloat(str_balance);
  75. for (let number_char of number_chars_arr) {
  76. if (str_balance.indexOf(number_char) != -1) {
  77. float_balance = parseFloat(str_balance) * 10 ** number_chars_obj[number_char];
  78. }
  79. }
  80. tdtexts.push(float_balance);
  81. } else if (i == 2) {
  82. // bought
  83. let str_sol = "0";
  84. let str_token_amount = "0";
  85. let float_sol;
  86. let arr_sol_amount = arr_tds[i].children[0].children;
  87. if (arr_sol_amount.length == 1) {
  88. tdtexts.push(0);
  89. continue;
  90. }
  91. str_sol = arr_sol_amount[0].innerText.trim().toLowerCase();
  92. str_sol = str_sol.replace(/[sol,%\+><]/g, "").trim();
  93. if (str_sol == "--") {
  94. str_sol = "0";
  95. }
  96. float_sol = parseFloat(str_sol);
  97. for (let number_char of number_chars_arr) {
  98. if (str_sol.indexOf(number_char) != -1) {
  99. float_sol = parseFloat(str_sol) * 10 ** number_chars_obj[number_char];
  100. }
  101. }
  102. tdtexts.push(float_sol);
  103. } else if (i == 3) {
  104. // sold
  105. let str_sol = "0";
  106. let str_token_amount = "0";
  107. let float_sol;
  108. let arr_sol_amount = arr_tds[i].children[0].children;
  109. if (arr_sol_amount.length == 1) {
  110. tdtexts.push(0);
  111. continue;
  112. }
  113. str_sol = arr_sol_amount[0].innerText.trim().toLowerCase();
  114. str_sol = str_sol.replace(/[sol,%\+><]/g, "").trim();
  115. if (str_sol == "--") {
  116. str_sol = "0";
  117. }
  118. float_sol = parseFloat(str_sol);
  119. for (let number_char of number_chars_arr) {
  120. if (str_sol.indexOf(number_char) != -1) {
  121. float_sol = parseFloat(str_sol) * 10 ** number_chars_obj[number_char];
  122. }
  123. }
  124. tdtexts.push(float_sol);
  125. } else if (i == 4) {
  126. // pnl
  127. let str_sol = "0";
  128. let str_percent = "0";
  129. let float_sol = 0;
  130. let float_percent = 0;
  131. let arr_sol_percent = arr_tds[i].children[0].children;
  132. str_sol = arr_sol_percent[0].innerText.trim().toLowerCase();
  133. str_sol = str_sol.replace(/[sol,%\+><]/g, "").trim();
  134. str_percent = arr_sol_percent[1].innerText.trim().toLowerCase();
  135. str_percent = str_percent.replace(/[sol,%\+><]/g, "").trim();
  136. if (str_sol == "--") {
  137. str_sol = "0";
  138. }
  139. if (str_percent == "--") {
  140. str_percent = "999999";
  141. }
  142. float_sol = parseFloat(str_sol);
  143. float_percent = parseFloat(str_percent);
  144. for (let number_char of number_chars_arr) {
  145. if (str_sol.indexOf(number_char) != -1) {
  146. float_sol = parseFloat(str_sol) * 10 ** number_chars_obj[number_char];
  147. }
  148. if (str_percent.indexOf(number_char) != -1) {
  149. float_percent = parseFloat(str_percent) * 10 ** number_chars_obj[number_char];
  150. }
  151. }
  152. tdtexts.push(float_sol);
  153. tdtexts.push(float_percent);
  154. } else if (i == 5) {
  155. // Realized
  156. continue;
  157. }
  158. else if (i == 6) {
  159. // UnRealized
  160. continue
  161. } else if (i == 7) {
  162. // Avg Cost/Sold
  163. } else if (i == 8) {
  164. // TXs
  165. } else if (i == 9) {
  166. // Last Active
  167. }
  168. }
  169. res_data.push(tdtexts);
  170. }
  171. }
  172. function save_resdata() {
  173. console.log("enter save_resdata");
  174. res_data.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
  175. let urlpathname = window.location.pathname.slice(1).split('/');
  176. urlpathname = urlpathname.pop()
  177. funcDownload(res_data.join(""), urlpathname + "_top_gmgn_sol" + "_" + parseInt(Date.now() / 1000) + ".csv");
  178. res_data = [];
  179. }
  180. function autoScroll() {
  181. console.log("enter autoScroll");
  182. let interval;
  183. let scroll_times = 15;
  184. let div_has_tran_table = document.querySelector("div.chakra-tabs__tab-panels.css-2zi8qu");
  185. let tbody = div_has_tran_table.querySelector("div.css-1o2kb31 tbody.g-table-tbody");
  186. async function down() {
  187. interval = setInterval(async () => {
  188. let tbodytrs;
  189. if (scroll_times > 0) {
  190. await sleep(150);
  191. tbodytrs = tbody.children;
  192. tbodytrs[tbodytrs.length - 1].scrollIntoView({ behavior: "smooth", block: "start" });
  193. } else {
  194. clearInterval(interval);
  195. await get_tbody_data();
  196. save_resdata();
  197. return;
  198. }
  199. scroll_times--;
  200. tbodytrs = tbody.children;
  201. if (tbodytrs.length == 101) {
  202. clearInterval(interval);
  203. await get_tbody_data();
  204. save_resdata();
  205. return;
  206. }
  207. await sleep(300);
  208. }, 1200)
  209. }
  210. down()
  211. }
  212. var res_data = [];
  213. var sTop = 0;
  214. // window.addEventListener('load', async () => {
  215. (async function () {
  216. console.log("enter load");
  217. await sleep(6000);
  218. console.log("create button");
  219. var mydivbox = document.createElement("div");
  220. var button_tran = document.createElement("button");//创建 获取toptran一个按钮
  221. mydivbox.appendChild(button_tran);
  222. button_tran.className = "tam-mybutton-gettran"
  223. button_tran.textContent = "gettran"; //按钮内容
  224. button_tran.style.width = "90px"; //按钮宽度
  225. button_tran.style.height = "30px"; //按钮高度
  226. button_tran.style.align = "center"; //文本居中
  227. button_tran.style.color = "blue"; //按钮文字颜色
  228. button_tran.style.background = "#e33e33"; //按钮底色
  229. button_tran.style.border = "1px solid #e33e33"; //边框属性
  230. mydivbox.style.position = "fixed";
  231. mydivbox.style.top = "80px";
  232. mydivbox.style.right = "40px";
  233. document.body.appendChild(mydivbox);
  234. button_tran.addEventListener("click", clickButton); //监听按钮点击事件
  235. async function clickButton() {
  236. res_data = [];
  237. console.log("enter clickButton res_data=", res_data);
  238. let div_chakra_tabs = document.querySelector('[role="tablist"]');
  239. let arr_buttons_chakra = Array.from(div_chakra_tabs.querySelectorAll("button"));
  240. let button_top_trader = undefined;
  241. for (let button of arr_buttons_chakra) {
  242. if (button.innerText.includes("Top Traders")) {
  243. button_top_trader = button;
  244. break;
  245. }
  246. }
  247. if (button_top_trader == undefined) {
  248. console.log("no button_top_trader");
  249. return;
  250. }
  251. await button_top_trader.click();
  252. await sleep(7000);
  253. let div_has_tran_table;
  254. let _tbody;
  255. let _thead;
  256. // chakra-tabs__tablist css-1p75jc5
  257. div_has_tran_table = document.querySelector("div.chakra-tabs__tab-panels.css-2zi8qu");
  258. _tbody = div_has_tran_table.querySelector("div.css-1o2kb31 tbody.g-table-tbody");
  259. _thead = div_has_tran_table.querySelector("div.css-1o2kb31 thead.g-table-thead");
  260. let arr_th = _thead.querySelectorAll("th");
  261. let click_USD = arr_th[1].querySelector("div.css-1vimx2u");
  262. if (click_USD.innerText.includes("USD")) {
  263. await click_USD.click();
  264. await sleep(4000);
  265. }
  266. let titlearr = get_thead_arr();
  267. res_data.push(titlearr);
  268. autoScroll();
  269. }
  270. })();