123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- // ==UserScript==
- // @name GMGN-Get-Top
- // @namespace http://tampermonkey.net/
- // @version 2024-10-19
- // @description try to take over the world!
- // @author You
- // @match https://gmgn.ai/sol/token/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=gmgn.ai
- // @grant none
- // ==/UserScript==
- function funcDownload(content, filename) {
- console.log('begin download');
- // 创建隐藏的可下载链接
- let eleLink = document.createElement('a');
- eleLink.download = filename;
- eleLink.style.display = 'none';
- // 字符内容转变成blob地址
- let blob = new Blob([content]);
- eleLink.href = URL.createObjectURL(blob);
- // 触发点击
- document.body.appendChild(eleLink);
- eleLink.click();
- // 然后移除
- document.body.removeChild(eleLink);
- }
- function sleep(sleepdelay) {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve(sleepdelay);
- }, sleepdelay);
- })
- }
- var number_chars_obj = {
- "k": 3,
- "m": 6,
- "b": 9,
- "t": 12,
- "p": 15
- };
- var number_chars_arr = ["k", "m", "b", "t", "p"];
- function get_thead_arr() {
- // let titlearr = _thead.innerText.trim().split(/\r?\n/);
- let titlearr = ['Maker', 'SOL', 'Buy_sol', 'Sell_sol', 'Pnl_sol', 'Pnl_per'];
- return titlearr;
- }
- var pre_timestamp = -1;
- var now_timestamp = -1;
- async function get_tbody_data() {
- let div_has_tran_table = document.querySelector("div.chakra-tabs__tab-panels.css-2zi8qu");
- let tbody = div_has_tran_table.querySelector("tbody.g-table-tbody");
- let arr_tbody_trs;
- arr_tbody_trs = Array.from(tbody.children);
- arr_tbody_trs.shift();
- for (let i = 0; i < arr_tbody_trs.length; i++) {
- let arr_tds;
- arr_tds = Array.from(arr_tbody_trs[i].children);
- let tdtexts = [];
- // if (arr_tds.length != 10) {
- // continue;
- // }
- for (let i = 0; i < arr_tds.length; i++) {
- if (i == 0) {
- // trader
- let a_element = arr_tds[i].querySelector("a");
- let str_trader = a_element.href.split('/').pop();
- tdtexts.push(str_trader);
- }
- else if (i == 1) {
- //sol balance
- let str_balance = arr_tds[i].innerText.trim().replace(/[,]/g, "").trim();
- str_balance = str_balance.replace(/\s+/g, "");
- str_balance = str_balance.toLowerCase();
- let float_balance;
- float_balance = parseFloat(str_balance);
- for (let number_char of number_chars_arr) {
- if (str_balance.indexOf(number_char) != -1) {
- float_balance = parseFloat(str_balance) * 10 ** number_chars_obj[number_char];
- }
- }
- tdtexts.push(float_balance);
- } else if (i == 2) {
- // bought
- let str_sol = "0";
- let str_token_amount = "0";
- let float_sol;
- let arr_sol_amount = arr_tds[i].children[0].children;
- if (arr_sol_amount.length == 1) {
- tdtexts.push(0);
- continue;
- }
- str_sol = arr_sol_amount[0].innerText.trim().toLowerCase();
- str_sol = str_sol.replace(/[sol,%\+><]/g, "").trim();
- if (str_sol == "--") {
- str_sol = "0";
- }
- float_sol = parseFloat(str_sol);
- for (let number_char of number_chars_arr) {
- if (str_sol.indexOf(number_char) != -1) {
- float_sol = parseFloat(str_sol) * 10 ** number_chars_obj[number_char];
- }
- }
- tdtexts.push(float_sol);
- } else if (i == 3) {
- // sold
- let str_sol = "0";
- let str_token_amount = "0";
- let float_sol;
- let arr_sol_amount = arr_tds[i].children[0].children;
- if (arr_sol_amount.length == 1) {
- tdtexts.push(0);
- continue;
- }
- str_sol = arr_sol_amount[0].innerText.trim().toLowerCase();
- str_sol = str_sol.replace(/[sol,%\+><]/g, "").trim();
- if (str_sol == "--") {
- str_sol = "0";
- }
- float_sol = parseFloat(str_sol);
- for (let number_char of number_chars_arr) {
- if (str_sol.indexOf(number_char) != -1) {
- float_sol = parseFloat(str_sol) * 10 ** number_chars_obj[number_char];
- }
- }
- tdtexts.push(float_sol);
- } else if (i == 4) {
- // pnl
- let str_sol = "0";
- let str_percent = "0";
- let float_sol = 0;
- let float_percent = 0;
- let arr_sol_percent = arr_tds[i].children[0].children;
- str_sol = arr_sol_percent[0].innerText.trim().toLowerCase();
- str_sol = str_sol.replace(/[sol,%\+><]/g, "").trim();
- str_percent = arr_sol_percent[1].innerText.trim().toLowerCase();
- str_percent = str_percent.replace(/[sol,%\+><]/g, "").trim();
- if (str_sol == "--") {
- str_sol = "0";
- }
- if (str_percent == "--") {
- str_percent = "999999";
- }
- float_sol = parseFloat(str_sol);
- float_percent = parseFloat(str_percent);
- for (let number_char of number_chars_arr) {
- if (str_sol.indexOf(number_char) != -1) {
- float_sol = parseFloat(str_sol) * 10 ** number_chars_obj[number_char];
- }
- if (str_percent.indexOf(number_char) != -1) {
- float_percent = parseFloat(str_percent) * 10 ** number_chars_obj[number_char];
- }
- }
- tdtexts.push(float_sol);
- tdtexts.push(float_percent);
- } else if (i == 5) {
- // Realized
- continue;
- }
- else if (i == 6) {
- // UnRealized
- continue
- } else if (i == 7) {
- // Avg Cost/Sold
- } else if (i == 8) {
- // TXs
- } else if (i == 9) {
- // Last Active
- }
- }
- res_data.push(tdtexts);
- }
- }
- function save_resdata() {
- console.log("enter save_resdata");
- res_data.forEach((val, index, arr) => { arr[index] = val.join() + "\n" });
- let urlpathname = window.location.pathname.slice(1).split('/');
- urlpathname = urlpathname.pop()
- funcDownload(res_data.join(""), urlpathname + "_top_gmgn_sol" + "_" + parseInt(Date.now() / 1000) + ".csv");
- res_data = [];
- }
- function autoScroll() {
- console.log("enter autoScroll");
- let interval;
- let scroll_times = 15;
- let div_has_tran_table = document.querySelector("div.chakra-tabs__tab-panels.css-2zi8qu");
- let tbody = div_has_tran_table.querySelector("div.css-1o2kb31 tbody.g-table-tbody");
- async function down() {
- interval = setInterval(async () => {
- let tbodytrs;
- if (scroll_times > 0) {
- await sleep(150);
- tbodytrs = tbody.children;
- tbodytrs[tbodytrs.length - 1].scrollIntoView({ behavior: "smooth", block: "start" });
- } else {
- clearInterval(interval);
- await get_tbody_data();
- save_resdata();
- return;
- }
- scroll_times--;
- tbodytrs = tbody.children;
- if (tbodytrs.length == 101) {
- clearInterval(interval);
- await get_tbody_data();
- save_resdata();
- return;
- }
- await sleep(300);
- }, 1200)
- }
- down()
- }
- var res_data = [];
- var sTop = 0;
- // window.addEventListener('load', async () => {
- (async function () {
- console.log("enter load");
- await sleep(6000);
- console.log("create button");
- var mydivbox = document.createElement("div");
- var button_tran = document.createElement("button");//创建 获取toptran一个按钮
- mydivbox.appendChild(button_tran);
- button_tran.className = "tam-mybutton-gettran"
- button_tran.textContent = "gettran"; //按钮内容
- button_tran.style.width = "90px"; //按钮宽度
- button_tran.style.height = "30px"; //按钮高度
- button_tran.style.align = "center"; //文本居中
- button_tran.style.color = "blue"; //按钮文字颜色
- button_tran.style.background = "#e33e33"; //按钮底色
- button_tran.style.border = "1px solid #e33e33"; //边框属性
- mydivbox.style.position = "fixed";
- mydivbox.style.top = "80px";
- mydivbox.style.right = "40px";
- document.body.appendChild(mydivbox);
- button_tran.addEventListener("click", clickButton); //监听按钮点击事件
- async function clickButton() {
- res_data = [];
- console.log("enter clickButton res_data=", res_data);
- let div_chakra_tabs = document.querySelector('[role="tablist"]');
- let arr_buttons_chakra = Array.from(div_chakra_tabs.querySelectorAll("button"));
- let button_top_trader = undefined;
- for (let button of arr_buttons_chakra) {
- if (button.innerText.includes("Top Traders")) {
- button_top_trader = button;
- break;
- }
- }
- if (button_top_trader == undefined) {
- console.log("no button_top_trader");
- return;
- }
- await button_top_trader.click();
- await sleep(7000);
- let div_has_tran_table;
- let _tbody;
- let _thead;
- // chakra-tabs__tablist css-1p75jc5
- div_has_tran_table = document.querySelector("div.chakra-tabs__tab-panels.css-2zi8qu");
- _tbody = div_has_tran_table.querySelector("div.css-1o2kb31 tbody.g-table-tbody");
- _thead = div_has_tran_table.querySelector("div.css-1o2kb31 thead.g-table-thead");
- let arr_th = _thead.querySelectorAll("th");
- let click_USD = arr_th[1].querySelector("div.css-1vimx2u");
- if (click_USD.innerText.includes("USD")) {
- await click_USD.click();
- await sleep(4000);
- }
- let titlearr = get_thead_arr();
- res_data.push(titlearr);
- autoScroll();
- }
- })();
|