// ==UserScript== // @name Dune-Get-Data // @namespace http://tampermonkey.net/ // @version 2024-11-09 // @description try to take over the world! // @author You // @match https://dune.com/queries/* // @icon https://www.google.com/s2/favicons?sz=64&domain=dune.com // @grant none // ==/UserScript== function funcDownload(content, filename) { console.log('begin download'); // 创建隐藏的可下载链接 var eleLink = document.createElement('a'); eleLink.download = filename; eleLink.style.display = 'none'; // 字符内容转变成blob地址 var 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); }) } async function get_thead_data() { let table = document.querySelectorAll('table.table_table__FDV2P')[0]; // Get the element let thead = table.querySelector('thead'); let tr_of_thead = thead.querySelectorAll('tr')[0]; let row_th = [] let arr_td = tr_of_thead.querySelectorAll('th'); for (let idx_th = 0; idx_th < arr_td.length; idx_th++) { let td = arr_td[idx_th]; // console.log(td.innerText); row_th.push(td.innerText); } res_data_get_dune_data.push(row_th); } async function get_tbody_data() { // Get the table element let table = document.querySelector('table.table_table__FDV2P'); // Get the element let tbody = table.querySelector('tbody'); // Get all elements in let tbodyTrs = tbody.querySelectorAll('tr'); // Traverse the elements in and get the data for (let i = 0; i < tbodyTrs.length; i++) { let tr = tbodyTrs[i]; let row_tr = [] let arr_td = tr.querySelectorAll('td'); for (let idx_td = 0; idx_td < arr_td.length; idx_td++) { let td = arr_td[idx_td]; console.log(td.innerText); row_tr.push(td.innerText) } res_data_get_dune_data.push(row_tr); } } async function clickButton_get_data() { await get_thead_data(); let ul_table_footer__Ky_k2 = document.querySelector('div.visual_vizFooter__vCe59').querySelector("ul.table_footer__Ky_k2"); let arr_ul_children = ul_table_footer__Ky_k2.children; let page_count = arr_ul_children[4].querySelectorAll("option").length; // 获取 页数 并且不断next 页 console.log("first= ", res_data_get_dune_data); for (let cur_page = 1; cur_page <= page_count; cur_page++) { await get_tbody_data(); let button_next = arr_ul_children[5].querySelector("button"); button_next.click(); await sleep(3000); } res_data_get_dune_data.forEach((val, index, arr) => { arr[index] = val.join() + "\n" }); let curTime = getCurrentTime(); let urlpathname = window.location.pathname.slice(1).split('/').pop(); urlpathname = urlpathname.replaceAll('-', "_"); funcDownload(res.join(""), "sol_" + curTime + urlpathname + ".csv"); funcDownload((res_data_get_dune_data), "dune_data.csv"); } var res_data_get_dune_data = []; (async function () { console.log("enter load"); await sleep(6000); console.log("create button"); var mydivbox = document.createElement("div"); var button_ = document.createElement("button");//创建 获取 holders 一个按钮 button_.className = "tam-mybutton-getdata" button_.textContent = "getdata"; //按钮内容 button_.style.width = "90px"; //按钮宽度 button_.style.height = "30px"; //按钮高度 button_.style.align = "center"; //文本居中 button_.style.color = "blue"; //按钮文字颜色 button_.style.background = "#045710"; //按钮底色 button_.style.border = "1px solid #045710"; //边框属性 mydivbox.appendChild(button_); mydivbox.style.position = "fixed"; mydivbox.style.top = "180px"; mydivbox.style.right = "40px"; document.body.appendChild(mydivbox); button_.addEventListener("click", clickButton_get_data); //监听按钮点击事件 })();