tamper_get_top_trader_sol_dexscreener.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. // ==UserScript==
  2. // @name DexScreen-GetTopTrader
  3. // @namespace http://tampermonkey.net/
  4. // @version 2024-10-19
  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=dexscreener.com
  9. // @grant none
  10. // ==/UserScript==
  11. // ==/UserScript==
  12. function funcDownload(content, filename) {
  13. console.log('begin download');
  14. // 创建隐藏的可下载链接
  15. var eleLink = document.createElement('a');
  16. eleLink.download = filename;
  17. eleLink.style.display = 'none';
  18. // 字符内容转变成blob地址
  19. var blob = new Blob([content]);
  20. eleLink.href = URL.createObjectURL(blob);
  21. // 触发点击
  22. document.body.appendChild(eleLink);
  23. eleLink.click();
  24. // 然后移除
  25. document.body.removeChild(eleLink);
  26. }
  27. function sleep(sleepdelay) {
  28. return new Promise((resolve, reject) => {
  29. setTimeout(() => {
  30. resolve(sleepdelay);
  31. }, sleepdelay);
  32. })
  33. }
  34. var number_chars_obj = {
  35. "k": 3,
  36. "m": 6,
  37. "b": 9,
  38. "t": 12,
  39. "p": 15
  40. };
  41. var number_chars_arr = ["k", "m", "b", "t", "p"];
  42. function get_thead_arr() {
  43. // let titlearr = _thead.innerText.trim().split(/\r?\n/);
  44. titlearr = [
  45. "Rank",
  46. "Maker",
  47. "Buymoney",
  48. "Sellmoney",
  49. "Earn",
  50. "Earnper",
  51. "Buycount",
  52. "Sellcount",
  53. "Buyamount",
  54. "Sellamount",
  55. "Amountper",
  56. ]
  57. return titlearr;
  58. }
  59. function save_resdata() {
  60. console.log("enter save_resdata");
  61. res_data.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
  62. let urlpathname = window.location.pathname.slice(1).split('/');
  63. urlpathname = urlpathname.pop()
  64. funcDownload(res_data.join(""), urlpathname + "_top_dexscreen_sol" + "_" + parseInt(Date.now() / 1000) + ".csv");
  65. res_data = [];
  66. }
  67. function get_tbodyarr(tbody_arr) {
  68. let urlpathname_arr = window.location.pathname.slice(1).split('/');
  69. let token_address = urlpathname_arr[1];
  70. for (let idx = 0; idx < tbody_arr.length; idx++) {
  71. let tr = tbody_arr[idx];
  72. let tds_arr = Array.from(tr.children);
  73. let td_value_obj = {
  74. "Rank": "0",
  75. "Maker": "",
  76. "Buymoney": 0,
  77. "Sellmoney": 0,
  78. "Earn": 0,
  79. "Earnper": 0,
  80. "Buycount": 0,
  81. "Sellcount": 0,
  82. "Buyamount": 0,
  83. "Sellamount": 0,
  84. "Amountper": 0,
  85. }
  86. let temp_innertext;
  87. for (let i = 0; i < tds_arr.length; i++) {
  88. if (i == 1 || i == 4 || i == 5 || i == 6 || i == 7) {
  89. continue;
  90. } else if (i == 0) {
  91. let td_innerText = tds_arr[i].innerText.trim().replace(/#/g, "");
  92. td_value_obj.Rank = td_innerText;
  93. }
  94. else if (i == 8) {
  95. td_value_obj.Maker = tds_arr[i].querySelector("a").href.split('/').pop();
  96. } else if (i == 2 || i == 3) {
  97. // 获取 Bought
  98. // '<$0.1\n10/1 txns'
  99. // '-'
  100. let td_innerText = tds_arr[i].innerText.trim().toLowerCase();
  101. let money = 0, amount = 0, count = 0;
  102. if (td_innerText == "-") {
  103. if (i == 2) {
  104. td_value_obj.Buycount = 0;
  105. td_value_obj.Buymoney = 0;
  106. } else {
  107. td_value_obj.Sellcount = 0;
  108. td_value_obj.Sellmoney = 0;
  109. }
  110. continue;
  111. }
  112. if (td_innerText.indexOf("$") == -1) {
  113. console.log("idx=", idx, "td_innerText=", td_innerText);
  114. throw ("td_innerText error");
  115. }
  116. td_innerText = td_innerText.replace(/[(\$),]/g, "");
  117. let td_innerText_arr = td_innerText.split(/\r?\n/);
  118. td_innerText_arr.forEach((val, index, arr) => {
  119. arr[index] = val.trim();
  120. });
  121. // 获取buymoney / sellmoney '<0.1' '11.5' '11.5k' '11.5m' 其他更大的数值
  122. if (td_innerText_arr[0].indexOf("<") != -1) {
  123. // td_value_obj.Buymoney = 0.1;
  124. money = 0.1;
  125. } else {
  126. if (!isNaN(td_innerText_arr[0])) {
  127. // td_value_obj.Buy
  128. money = parseFloat(td_innerText_arr[0]);
  129. } else {
  130. for (let number_char of number_chars_arr) {
  131. if (td_innerText_arr[0].indexOf(number_char) != -1) {
  132. money = parseFloat(td_innerText_arr[0]) * 10 ** number_chars_obj[number_char];
  133. }
  134. }
  135. }
  136. }
  137. let temp_td_innerText = td_innerText_arr.pop();
  138. let temp_td_innerText_arr = temp_td_innerText.split("/");
  139. td_innerText_arr = [...td_innerText_arr, ...temp_td_innerText_arr];
  140. td_innerText_arr.forEach((val, index, arr) => {
  141. arr[index] = val.trim();
  142. });
  143. console.log("td_innerText_arr=", td_innerText_arr);
  144. //获取buyamount sellamount
  145. for (let number_char of number_chars_arr) {
  146. // 如果有k , m 等 需要转化为字符串
  147. if (td_innerText_arr[1].indexOf(number_char) != -1) {
  148. amount = String(parseInt(parseFloat(td_innerText_arr[1])) * 1000) + '0'.repeat(number_chars_obj[number_char] - 3);
  149. break;
  150. }
  151. }
  152. if (amount === 0) {
  153. amount = parseFloat(td_innerText_arr[1]);
  154. }
  155. // 获取buycount 1 txns
  156. td_innerText_arr[2] = td_innerText_arr[2].split(" ")[0].trim();
  157. // td_value_obj.Buy
  158. count = td_innerText_arr[2];
  159. if (i == 2) {
  160. td_value_obj.Buycount = count;
  161. td_value_obj.Buymoney = money;
  162. td_value_obj.Buyamount = amount;
  163. } else if (i == 3) {
  164. td_value_obj.Sellcount = count;
  165. td_value_obj.Sellmoney = money;
  166. td_value_obj.Sellamount = amount;
  167. }
  168. }
  169. }
  170. td_value_obj.Earn = td_value_obj.Sellmoney - td_value_obj.Buymoney;
  171. td_value_obj.Earnper = td_value_obj.Buymoney == 0 ? 999999 : td_value_obj.Earn / td_value_obj.Buymoney;
  172. if (typeof (td_value_obj.Sellamount) == 'string') {
  173. if (typeof (td_value_obj.Buyamount) == 'string') {
  174. if (td_value_obj.Sellamount.length > td_value_obj.Buyamount.length) {
  175. td_value_obj.Amountper = 10;
  176. } else if (td_value_obj.Sellamount.length == td_value_obj.Buyamount.length) {
  177. td_value_obj.Amountper = parseFloat(td_value_obj.Sellamount.slice(0, 2)) / parseFloat(td_value_obj.Buyamount.slice(0, 2));
  178. } else {
  179. td_value_obj.Amountper = 0.1;
  180. }
  181. } else {
  182. td_value_obj.Amountper = 10;
  183. }
  184. } else {
  185. if (td_value_obj.Sellamount == 0) {
  186. td_value_obj.Amountper = 0;
  187. } else if (typeof (td_value_obj.Buyamount) == 'string') {
  188. td_value_obj.Amountper = 0.1;
  189. }
  190. else {
  191. td_value_obj.Amountper = td_value_obj.Buyamount == 0 ? 999999 : parseFloat(td_value_obj.Sellamount) / parseFloat(td_value_obj.Buyamount);
  192. }
  193. }
  194. let td_value_arr = Object.values(td_value_obj);
  195. res_data.push(td_value_arr);
  196. }
  197. }
  198. var res_data = [];
  199. // window.addEventListener('load', () => {
  200. (async function () {
  201. console.log("enter load");
  202. await sleep(6000);
  203. console.log("create button");
  204. var mydivbox = document.createElement("div");
  205. var button_tran = document.createElement("button");//创建 获取toptran一个按钮
  206. mydivbox.appendChild(button_tran);
  207. button_tran.className = "tam-mybutton-gettran"
  208. button_tran.textContent = "gettran"; //按钮内容
  209. button_tran.style.width = "90px"; //按钮宽度
  210. button_tran.style.height = "30px"; //按钮高度
  211. button_tran.style.align = "center"; //文本居中
  212. button_tran.style.color = "blue"; //按钮文字颜色
  213. button_tran.style.background = "#e33e33"; //按钮底色
  214. button_tran.style.border = "1px solid #e33e33"; //边框属性
  215. mydivbox.style.position = "fixed";
  216. mydivbox.style.top = "80px";
  217. mydivbox.style.right = "40px";
  218. document.body.appendChild(mydivbox);
  219. button_tran.addEventListener("click", clickButton); //监听按钮点击事件
  220. function clickButton() {
  221. res_data = [];
  222. let table_div_ep1 = document.getElementsByClassName('custom-1vjv7zm')[0];
  223. let div_table = table_div_ep1.getElementsByClassName('custom-1kikirr')[0];
  224. let titlearr = get_thead_arr();
  225. res_data.push(titlearr);
  226. let tbody_arr = Array.from(div_table.children);
  227. tbody_arr.shift();
  228. get_tbodyarr(tbody_arr);
  229. save_resdata();
  230. }
  231. })();