Актуальная версия (форк от @Klizmach_Bro )
// ==UserScript==
// @name New Userscript BS
// @namespace https://tampermonkey.net/
// @version 1.3
// @description try to take over the world!
// @author You
// @match https://bs2tor2.at/*
// @match https://bs2tor2.com/*
// @match https://bs2tor2.in/*
// @match https://clear.bs2tor2.io/*
// @match https://clear.bs2tor2.cc/*
// @match https://bs2web11.shop/*
// @match https://btrhbfeojofxcpxuwnsp5h7h22htohw4btqegnxatocbkgdlfiawhyid.onion/*
// @match https://blackspruty4w3j4bzyhlk24jr32wbpnfo3oyywn4ckwylo4hkcyy4yd.onion/*
// @match https://blacksprut2rprrt3aoigwh7zftiprzqyqynzz2eiimmwmykw7wkpyad.onion/*
// @match https://blackspfgh3bi6im374fgl54qliir6to37txpkkd6ucfiu7whfy2odid.onion/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=bs2tor2.at
// @grant none
// ==/UserScript==
(function () {
(function () {
(function () {
const consoleUIstyle = ["background-color:#fff; color: #242424;font-family: 'Play', sans-serif;font-size: 24px;", "color: #fd9638;font-family: 'Play', sans-serif;font-size: 24px;", "color: purple;font-family: 'Play', sans-serif;font-size: 36px;"];
function prettySprut() {
let consoleUI = [];
let productStats = { name: "", sum: 0, sumbtc: 0, sumrub: 0 };
productStats.name = document.querySelector("h1").innerText;
document.querySelectorAll("a").forEach(item => {
if (item.href.includes(document.location.hostname + "/products/checkout/")) {
let url = item.href;
let cuirub = 0;
let cuibtc = 0;
let cuikbtc = 0;
let extractedPortion = url.substring(url.lastIndexOf('/') + 1);
const tr = item.parentNode.closest('tr');
const td = tr.querySelectorAll('td');
const [locationBlock, amountBlock, typeBlock, priceBlock] = td;
let cuives = 1 * amountBlock.innerText.replace(" г", "");
if (priceBlock.querySelectorAll(".new-price").length) {
cuirub = priceBlock.innerText.split("~")[0].replace("\n", "").replace(" ₽", "").split(" ")[0] * 1;
cuikbtc = document.querySelector(".fa-btc").parentElement.innerText.replace("1 = ", "").replace(" ₽", "");
cuibtc = 1 * parseFloat(cuirub / cuikbtc).toFixed(8);
} else {
const [rub, btc] = priceBlock.innerText.split("~");
cuibtc = parseFloat(btc.trim()).toFixed(8);
cuirub = parseInt(rub.replace("\n", "").replace(" ₽", ""));
}
let cuicity = locationBlock.innerText.split(": ")[0];
consoleUI.push({
id: 1 * extractedPortion,
rub: cuirub,
BTC: cuibtc,
weight: cuives,
city: cuicity,
location: locationBlock.innerText.split(": ")[1].replace("\nПримечание", ""),
note: locationBlock.innerText.split(": ")[2],
type: typeBlock.innerText,
url: item.href,
});
productStats.sumbtc = parseFloat(productStats.sumbtc) + parseFloat(cuibtc);
productStats.sum = productStats.sum + cuives;
productStats.sumrub = productStats.sumrub + parseInt(cuirub);
}
});
consoleUI.sort((a, b) => b.id - a.id);
console.log('%c\n\n\n\n\n\n\n\n\n\n\n\n\n\n Black%cSprut', consoleUIstyle[0], consoleUIstyle[1]);
console.log(`%c\n${productStats.name}: размещено %c${consoleUI.length} позиций общим весом минимум ${productStats.sum.toFixed(2)} грамм на сумму минимум ${productStats.sumrub.toFixed(2)} или ${productStats['sumbtc'].toFixed(8)} BTC`, consoleUIstyle[0], consoleUIstyle[2]);
console.table(consoleUI);
/*console.log('%cklad.men - Первая независимая школа кладменов. Углубленный курс онлайн и офлайн безопасности; Практикующие преподаватели с 8-летним опытом в профессии; Только актуальные материалы!\nhttps://klad.men/', consoleUIstyle[2]);*/
return consoleUI;
}
if (!document.location.pathname.startsWith("/products/")) {
return;
}
let data = prettySprut();
let cityFilteredData = [];
const newTable = document.createElement('table');
const city = document.querySelectorAll('.header-top-right .ht-menu li')[1].querySelector('strong').innerText;
const balance = document.querySelectorAll('.user-menu-dd .account-btn span')[1].innerText.trim();
if (city && !document.getElementById('change_city').value) {
cityFilteredData = data.filter(item => item.city === city);
if (cityFilteredData.length) {
data = cityFilteredData
}
}
newTable.className = 'table';
newTable.innerHTML = `<thead><tr><th>ID</th><th>RUB</th><th>BTC</th><th>Вес</th><th class="usercity">Город</th><th>Район</th><th>Примечание</th><th>Тип</th><th>URL</th></tr></thead>
<tbody>
${data.map(row => `<tr>
<td>${row.id}</td>
<td>${row.rub}</td>
<td>${row.BTC}</td>
<td>${row.weight}</td>
<td class="usercity">${row.city}</td>
<td>${row.location}</td>
<td>${row.note = row.note || "-"}</td>
<td>${row.type}</td>
<td>
<a href="${balance >= row.BTC ? row.url : '/exchanges/25/create?method=1&amount=' + row.rub}" class="btn btn-info btn-sm">Купить</a>
</td>
</tr>`).join('')
}
</tbody>`;
const oldTable = document.querySelector('table.table');
oldTable.parentNode.replaceChild(newTable, oldTable);
const getCellValue = (tr, idx) => tr.children[idx].innerText || tr.children[idx].textContent;
const comparer = (idx, asc) => (a, b) => ((v1, v2) =>
v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2)
)(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));
Array.from(document.querySelector('table.table thead').querySelectorAll('th'))
.forEach((th, idx) => {
th.addEventListener('click', () => {
const table = th.closest('table');
Array.from(table.querySelectorAll('tbody tr'))
.sort(comparer(idx, (this.asc = !this.asc)))
.forEach(tr => table.querySelector('tbody').appendChild(tr));
});
});
return true;
})();
})();
})();
Букмарклет:
javascript:(function()%7B(function%20()%20%7B(function%20()%20%7B(function%20()%20%7Bconst%20consoleUIstyle%20%3D%20%5B%22background-color%3A%23fff%3B%20color%3A%20%23242424%3Bfont-family%3A%20'Play'%2C%20sans-serif%3Bfont-size%3A%2024px%3B%22%2C%20%22color%3A%20%23fd9638%3Bfont-family%3A%20'Play'%2C%20sans-serif%3Bfont-size%3A%2024px%3B%22%2C%20%22color%3A%20purple%3Bfont-family%3A%20'Play'%2C%20sans-serif%3Bfont-size%3A%2036px%3B%22%5D%3Bfunction%20prettySprut()%20%7Blet%20consoleUI%20%3D%20%5B%5D%3Blet%20productStats%20%3D%20%7B%20name%3A%20%22%22%2C%20sum%3A%200%2C%20sumbtc%3A%200%2C%20sumrub%3A%200%20%7D%3BproductStats.name%20%3D%20document.querySelector(%22h1%22).innerText%3Bdocument.querySelectorAll(%22a%22).forEach(item%20%3D%3E%20%7Bif%20(item.href.includes(document.location.hostname%20%2B%20%22%2Fproducts%2Fcheckout%2F%22))%20%7Blet%20url%20%3D%20item.href%3Blet%20cuirub%20%3D%200%3Blet%20cuibtc%20%3D%200%3Blet%20cuikbtc%20%3D%200%3Blet%20extractedPortion%20%3D%20url.substring(url.lastIndexOf('%2F')%20%2B%201)%3Bconst%20tr%20%3D%20item.parentNode.closest('tr')%3Bconst%20td%20%3D%20tr.querySelectorAll('td')%3Bconst%20%5BlocationBlock%2C%20amountBlock%2C%20typeBlock%2C%20priceBlock%5D%20%3D%20td%3Blet%20cuives%20%3D%201%20*%20amountBlock.innerText.replace(%22%20%D0%B3%22%2C%20%22%22)%3Bif%20(priceBlock.querySelectorAll(%22.new-price%22).length)%20%7Bcuirub%20%3D%20priceBlock.innerText.split(%22~%22)%5B0%5D.replace(%22%5Cn%22%2C%20%22%22).replace(%22%20%E2%82%BD%22%2C%20%22%22).split(%22%20%22)%5B0%5D%20*%201%3Bcuikbtc%20%3D%20document.querySelector(%22.fa-btc%22).parentElement.innerText.replace(%221%20%20%3D%20%22%2C%20%22%22).replace(%22%20%E2%82%BD%22%2C%20%22%22)%3Bcuibtc%20%3D%201%20*%20parseFloat(cuirub%20%2F%20cuikbtc).toFixed(8)%3B%7D%20else%20%7Bconst%20%5Brub%2C%20btc%5D%20%3D%20priceBlock.innerText.split(%22~%22)%3Bcuibtc%20%3D%20parseFloat(btc.trim()).toFixed(8)%3Bcuirub%20%3D%20parseInt(rub.replace(%22%5Cn%22%2C%20%22%22).replace(%22%20%E2%82%BD%22%2C%20%22%22))%3B%7Dlet%20cuicity%20%3D%20locationBlock.innerText.split(%22%3A%20%22)%5B0%5D%3BconsoleUI.push(%7Bid%3A%201%20*%20extractedPortion%2Crub%3A%20cuirub%2CBTC%3A%20cuibtc%2Cweight%3A%20cuives%2Ccity%3A%20cuicity%2Clocation%3A%20locationBlock.innerText.split(%22%3A%20%22)%5B1%5D.replace(%22%5Cn%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%87%D0%B0%D0%BD%D0%B8%D0%B5%22%2C%20%22%22)%2Cnote%3A%20locationBlock.innerText.split(%22%3A%20%22)%5B2%5D%2Ctype%3A%20typeBlock.innerText%2Curl%3A%20item.href%2C%7D)%3BproductStats.sumbtc%20%3D%20parseFloat(productStats.sumbtc)%20%2B%20parseFloat(cuibtc)%3BproductStats.sum%20%3D%20productStats.sum%20%2B%20cuives%3BproductStats.sumrub%20%3D%20productStats.sumrub%20%2B%20parseInt(cuirub)%3B%7D%7D)%3BconsoleUI.sort((a%2C%20b)%20%3D%3E%20b.id%20-%20a.id)%3Bconsole.log('%25c%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%5Cn%20Black%25cSprut'%2C%20consoleUIstyle%5B0%5D%2C%20consoleUIstyle%5B1%5D)%3Bconsole.log(%60%25c%5Cn%24%7BproductStats.name%7D%3A%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%BE%20%25c%24%7BconsoleUI.length%7D%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%B9%20%D0%BE%D0%B1%D1%89%D0%B8%D0%BC%20%D0%B2%D0%B5%D1%81%D0%BE%D0%BC%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC%20%24%7BproductStats.sum.toFixed(2)%7D%20%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%20%D0%BD%D0%B0%20%D1%81%D1%83%D0%BC%D0%BC%D1%83%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC%20%24%7BproductStats.sumrub.toFixed(2)%7D%20%D0%B8%D0%BB%D0%B8%20%24%7BproductStats%5B'sumbtc'%5D.toFixed(8)%7D%20BTC%60%2C%20consoleUIstyle%5B0%5D%2C%20consoleUIstyle%5B2%5D)%3Bconsole.table(consoleUI)%3B%2F*console.log('%25cklad.men%20-%20%D0%9F%D0%B5%D1%80%D0%B2%D0%B0%D1%8F%20%D0%BD%D0%B5%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%B0%D1%8F%20%D1%88%D0%BA%D0%BE%D0%BB%D0%B0%20%D0%BA%D0%BB%D0%B0%D0%B4%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2.%20%D0%A3%D0%B3%D0%BB%D1%83%D0%B1%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%BA%D1%83%D1%80%D1%81%20%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD%20%D0%B8%20%D0%BE%D1%84%D0%BB%D0%B0%D0%B9%D0%BD%20%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8%3B%20%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D1%8E%D1%89%D0%B8%D0%B5%20%D0%BF%D1%80%D0%B5%D0%BF%D0%BE%D0%B4%D0%B0%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B8%20%D1%81%208-%D0%BB%D0%B5%D1%82%D0%BD%D0%B8%D0%BC%20%D0%BE%D0%BF%D1%8B%D1%82%D0%BE%D0%BC%20%D0%B2%20%D0%BF%D1%80%D0%BE%D1%84%D0%B5%D1%81%D1%81%D0%B8%D0%B8%3B%20%D0%A2%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%B0%D0%BA%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D0%BC%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D1%8B!%5Cnhttps%3A%2F%2Fklad.men%2F'%2C%20consoleUIstyle%5B2%5D)%3B*%2Freturn%20consoleUI%3B%7Dif%20(!document.location.pathname.startsWith(%22%2Fproducts%2F%22))%20%7Breturn%3B%7Dlet%20data%20%3D%20prettySprut()%3Blet%20cityFilteredData%20%3D%20%5B%5D%3Bconst%20newTable%20%3D%20document.createElement('table')%3Bconst%20city%20%3D%20document.querySelectorAll('.header-top-right%20.ht-menu%20li')%5B1%5D.querySelector('strong').innerText%3Bconst%20balance%20%3D%20document.querySelectorAll('.user-menu-dd%20.account-btn%20span')%5B1%5D.innerText.trim()%3Bif%20(city%20%26%26%20!document.getElementById('change_city').value)%20%7BcityFilteredData%20%3D%20data.filter(item%20%3D%3E%20item.city%20%3D%3D%3D%20city)%3Bif%20(cityFilteredData.length)%20%7Bdata%20%3D%20cityFilteredData%7D%7DnewTable.className%20%3D%20'table'%3BnewTable.innerHTML%20%3D%20%60%3Cthead%3E%3Ctr%3E%3Cth%3EID%3C%2Fth%3E%3Cth%3ERUB%3C%2Fth%3E%3Cth%3EBTC%3C%2Fth%3E%3Cth%3E%D0%92%D0%B5%D1%81%3C%2Fth%3E%3Cth%20class%3D%22usercity%22%3E%D0%93%D0%BE%D1%80%D0%BE%D0%B4%3C%2Fth%3E%3Cth%3E%D0%A0%D0%B0%D0%B9%D0%BE%D0%BD%3C%2Fth%3E%3Cth%3E%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%87%D0%B0%D0%BD%D0%B8%D0%B5%3C%2Fth%3E%3Cth%3E%D0%A2%D0%B8%D0%BF%3C%2Fth%3E%3Cth%3EURL%3C%2Fth%3E%3C%2Ftr%3E%3C%2Fthead%3E%3Ctbody%3E%24%7Bdata.map(row%20%3D%3E%20%60%3Ctr%3E%3Ctd%3E%24%7Brow.id%7D%3C%2Ftd%3E%3Ctd%3E%24%7Brow.rub%7D%3C%2Ftd%3E%3Ctd%3E%24%7Brow.BTC%7D%3C%2Ftd%3E%3Ctd%3E%24%7Brow.weight%7D%3C%2Ftd%3E%3Ctd%20class%3D%22usercity%22%3E%24%7Brow.city%7D%3C%2Ftd%3E%3Ctd%3E%24%7Brow.location%7D%3C%2Ftd%3E%3Ctd%3E%24%7Brow.note%20%3D%20row.note%20%7C%7C%20%22-%22%7D%3C%2Ftd%3E%3Ctd%3E%24%7Brow.type%7D%3C%2Ftd%3E%3Ctd%3E%3Ca%20href%3D%22%24%7Bbalance%20%3E%3D%20row.BTC%20%3F%20row.url%20%3A%20'%2Fexchanges%2F25%2Fcreate%3Fmethod%3D1%26amount%3D'%20%2B%20row.rub%7D%22%20class%3D%22btn%20btn-info%20btn-sm%22%3E%D0%9A%D1%83%D0%BF%D0%B8%D1%82%D1%8C%3C%2Fa%3E%3C%2Ftd%3E%3C%2Ftr%3E%60).join('')%7D%3C%2Ftbody%3E%60%3Bconst%20oldTable%20%3D%20document.querySelector('table.table')%3BoldTable.parentNode.replaceChild(newTable%2C%20oldTable)%3Bconst%20getCellValue%20%3D%20(tr%2C%20idx)%20%3D%3E%20tr.children%5Bidx%5D.innerText%20%7C%7C%20tr.children%5Bidx%5D.textContent%3Bconst%20comparer%20%3D%20(idx%2C%20asc)%20%3D%3E%20(a%2C%20b)%20%3D%3E%20((v1%2C%20v2)%20%3D%3Ev1%20!%3D%3D%20''%20%26%26%20v2%20!%3D%3D%20''%20%26%26%20!isNaN(v1)%20%26%26%20!isNaN(v2)%20%3F%20v1%20-%20v2%20%3A%20v1.toString().localeCompare(v2))(getCellValue(asc%20%3F%20a%20%3A%20b%2C%20idx)%2C%20getCellValue(asc%20%3F%20b%20%3A%20a%2C%20idx))%3BArray.from(document.querySelector('table.table%20thead').querySelectorAll('th')).forEach((th%2C%20idx)%20%3D%3E%20%7Bth.addEventListener('click'%2C%20()%20%3D%3E%20%7Bconst%20table%20%3D%20th.closest('table')%3BArray.from(table.querySelectorAll('tbody%20tr')).sort(comparer(idx%2C%20(this.asc%20%3D%20!this.asc))).forEach(tr%20%3D%3E%20table.querySelector('tbody').appendChild(tr))%3B%7D)%3B%7D)%3Breturn%20true%3B%7D)()%3B%7D)()%3B%7D)()%7D)();