tamper_dexscreener_gettop.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. // ==UserScript==
  2. // @name DexScreen-GetTopTrader
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description try to take over the world!
  6. // @author You
  7. // @match https://dexscreener.com/solana/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
  9. // @grant none
  10. // ==/UserScript==
  11. function funcDownload(content, filename) {
  12. console.log('begin download');
  13. // 创建隐藏的可下载链接
  14. var eleLink = document.createElement('a');
  15. eleLink.download = filename;
  16. eleLink.style.display = 'none';
  17. // 字符内容转变成blob地址
  18. var 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. // window.addEventListener('load', () => {
  42. (async function () {
  43. console.log("enter load");
  44. var res = [];
  45. await sleep(6000);
  46. console.log("create button");
  47. var mydivbox = document.createElement("div");
  48. var input = document.createElement("input")
  49. var button = document.createElement("button");//创建一个按钮
  50. var button_toptraders = document.createElement("button");//创建 获取toptraders一个按钮
  51. mydivbox.appendChild(input);
  52. mydivbox.appendChild(button);
  53. mydivbox.appendChild(button_toptraders);
  54. input.value = "350";
  55. input.className = "tam-myinput"
  56. input.type = "number"
  57. button_toptraders.className = "tam-mybutton-gettop";
  58. button_toptraders.textContent = "gettop"; //按钮内容
  59. button_toptraders.style.width = "90px"; //按钮宽度
  60. //button.style.height = "28px"; //按钮高度
  61. button_toptraders.style.align = "center"; //文本居中
  62. button_toptraders.style.color = "blue"; //按钮文字颜色
  63. button_toptraders.style.background = "#e33e33"; //按钮底色
  64. button_toptraders.style.border = "1px solid #e33e33"; //边框属性
  65. button_toptraders.addEventListener("click", clickBotton); //监听按钮点击事件
  66. mydivbox.style.position = "fixed";
  67. mydivbox.style.top = "60px";
  68. mydivbox.style.right = "60px";
  69. document.body.appendChild(mydivbox)
  70. // var parentdiv = document.getElementsByClassName("custom-1275zxc")[0];
  71. // parentdiv.insertBefore(mydivbox, parentdiv.getElementsByTagName("div")[0]);
  72. // parentdiv.appendChild(mydivbox);
  73. var theadtr = document.getElementsByClassName("custom-19qkkht")[0].getElementsByTagName("thead")[0];
  74. theadtr.style.color = "blue";
  75. function get_thead_arr(_thead) {
  76. let titlearr = _thead.innerText.trim().split(/\r?\n/);
  77. // titlearr = titlearr.slice(1, 5);
  78. titlearr = [
  79. "Rank",
  80. "Maker",
  81. "Buymoney",
  82. "Sellmoney",
  83. "Earn",
  84. "Earnper",
  85. "Buycount",
  86. "Sellcount",
  87. "Buyamount",
  88. "Sellamount",
  89. "Amountper",
  90. "TokenAddress",
  91. "isNormal",
  92. ]
  93. return titlearr;
  94. }
  95. function get_tbodyarr(tbody_arr) {
  96. let urlpathname_arr = window.location.pathname.slice(1).split('/');
  97. let token_address = urlpathname_arr[1];
  98. for (let idx = 0; idx < tbody_arr.length; idx++) {
  99. let tr = tbody_arr[idx];
  100. let tds_arr = Array.from(tr.children);
  101. let td_value_obj = {
  102. "Rank": "0",
  103. "Maker": "",
  104. "Buymoney": 0,
  105. "Sellmoney": 0,
  106. "Earn": 0,
  107. "Earnper": 0,
  108. "Buycount": 0,
  109. "Sellcount": 0,
  110. "Buyamount": 0,
  111. "Sellamount": 0,
  112. "Amountper": 0,
  113. "TokenAddress": token_address,
  114. "isNormal": -1,
  115. }
  116. let temp_innertext;
  117. for (let i = 0; i < tds_arr.length; i++) {
  118. if (i == 1 || i == 4 || i == 5 || i == 6 || i == 7) {
  119. continue;
  120. } else if (i == 0) {
  121. let td_innerText = tds_arr[i].innerText.trim().replace(/#/g, "");
  122. td_value_obj.Rank = td_innerText;
  123. }
  124. else if (i == 8) {
  125. td_value_obj.Maker = tds_arr[i].querySelector("a").href.split('/').pop();
  126. } else if (i == 2 || i == 3) {
  127. // 获取 Bought
  128. // '<$0.1\n10/1 txns'
  129. // '-'
  130. let td_innerText = tds_arr[i].innerText.trim().toLowerCase();
  131. let money = 0, amount = 0, count = 0;
  132. if (td_innerText == "-") {
  133. if (i == 2) {
  134. td_value_obj.Buycount = 0;
  135. td_value_obj.Buymoney = 0;
  136. } else {
  137. td_value_obj.Sellcount = 0;
  138. td_value_obj.Sellmoney = 0;
  139. }
  140. continue;
  141. }
  142. if (td_innerText.indexOf("$") == -1) {
  143. console.log("idx=", idx, "td_innerText=", td_innerText);
  144. throw ("td_innerText error");
  145. }
  146. td_innerText = td_innerText.replace(/[(\$),]/g, "");
  147. let td_innerText_arr = td_innerText.split(/\r?\n/);
  148. td_innerText_arr.forEach((val, index, arr) => {
  149. arr[index] = val.trim();
  150. });
  151. // 获取buymoney / sellmoney '<0.1' '11.5' '11.5k' '11.5m' 其他更大的数值
  152. if (td_innerText_arr[0].indexOf("<") != -1) {
  153. // td_value_obj.Buymoney = 0.1;
  154. money = 0.1;
  155. } else {
  156. if (!isNaN(td_innerText_arr[0])) {
  157. // td_value_obj.Buy
  158. money = parseFloat(td_innerText_arr[0]);
  159. } else {
  160. for (let number_char of number_chars_arr) {
  161. if (td_innerText_arr[0].indexOf(number_char) != -1) {
  162. money = parseFloat(td_innerText_arr[0]) * 10 ** number_chars_obj[number_char];
  163. }
  164. }
  165. }
  166. }
  167. let temp_td_innerText = td_innerText_arr.pop();
  168. let temp_td_innerText_arr = temp_td_innerText.split("/");
  169. td_innerText_arr = [...td_innerText_arr, ...temp_td_innerText_arr];
  170. td_innerText_arr.forEach((val, index, arr) => {
  171. arr[index] = val.trim();
  172. });
  173. console.log("td_innerText_arr=", td_innerText_arr);
  174. //获取buyamount sellamount
  175. for (let number_char of number_chars_arr) {
  176. // 如果有k , m 等 需要转化为字符串
  177. if (td_innerText_arr[1].indexOf(number_char) != -1) {
  178. amount = String(parseInt(parseFloat(td_innerText_arr[1])) * 1000) + '0'.repeat(number_chars_obj[number_char] - 3);
  179. break;
  180. }
  181. }
  182. if (amount === 0) {
  183. amount = parseFloat(td_innerText_arr[1]);
  184. }
  185. // 获取buycount 1 txns
  186. td_innerText_arr[2] = td_innerText_arr[2].split(" ")[0].trim();
  187. // td_value_obj.Buy
  188. count = td_innerText_arr[2];
  189. if (i == 2) {
  190. td_value_obj.Buycount = count;
  191. td_value_obj.Buymoney = money;
  192. td_value_obj.Buyamount = amount;
  193. } else if (i == 3) {
  194. td_value_obj.Sellcount = count;
  195. td_value_obj.Sellmoney = money;
  196. td_value_obj.Sellamount = amount;
  197. }
  198. }
  199. }
  200. td_value_obj.Earn = td_value_obj.Sellmoney - td_value_obj.Buymoney;
  201. td_value_obj.Earnper = td_value_obj.Buymoney == 0 ? -10 : td_value_obj.Earn / td_value_obj.Buymoney;
  202. if (typeof (td_value_obj.Sellamount) == 'string') {
  203. if (typeof (td_value_obj.Buyamount) == 'string') {
  204. if (td_value_obj.Sellamount.length > td_value_obj.Buyamount.length) {
  205. td_value_obj.Amountper = 10;
  206. } else if (td_value_obj.Sellamount.length == td_value_obj.Buyamount.length) {
  207. td_value_obj.Amountper = parseFloat(td_value_obj.Sellamount.slice(0, 2)) / parseFloat(td_value_obj.Buyamount.slice(0, 2));
  208. } else {
  209. td_value_obj.Amountper = 0.1;
  210. }
  211. } else {
  212. td_value_obj.Amountper = 10;
  213. }
  214. } else {
  215. if (td_value_obj.Sellamount == 0) {
  216. td_value_obj.Amountper = 0;
  217. } else if (typeof (td_value_obj.Buyamount) == 'string') {
  218. td_value_obj.Amountper = 0.1;
  219. }
  220. else {
  221. td_value_obj.Amountper = td_value_obj.Buyamount == 0 ? -10 : parseFloat(td_value_obj.Sellamount) / parseFloat(td_value_obj.Buyamount);
  222. }
  223. }
  224. let td_value_arr = Object.values(td_value_obj);
  225. res.push(td_value_arr);
  226. }
  227. }
  228. function clickBotton() {
  229. // let table_div_ep1 = document.querySelector('.custom-19qkkht');
  230. let table_div_ep1 = document.getElementsByClassName('custom-p3e2vj')[0];
  231. let divscrollerdep2 = table_div_ep1.querySelector('[data-test-id="virtuoso-scroller"]');
  232. let div_table = table_div_ep1.getElementsByClassName('custom-17mi4hx')[0];
  233. // console.log("div_table=", div_table);
  234. let titlearr = get_thead_arr(div_table.children[0]);
  235. let urlpathname_arr = window.location.pathname.slice(1).split('/');
  236. res.push(titlearr);
  237. let tbody_arr = Array.from(div_table.children);
  238. tbody_arr.shift();
  239. get_tbodyarr(tbody_arr);
  240. res.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
  241. urlpathname_arr[0] = urlpathname_arr[0].slice(0, 3);
  242. funcDownload(res.join(""), "Dex-" + urlpathname_arr.join('-') + ".csv");
  243. }
  244. })();