Scrapes all Btv leagues in current open league
// ==UserScript==
// @name BTV Scraper
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Scrapes all Btv leagues in current open league
// @author Beat2er
// @match *://www.btv.de/de/spielbetriebDisabled/*
// @match https://widget.btv.de/btvgrpsearch*
// @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @run-at document-end
// @grant none
// @license MIT
// @require http://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==
let btv_initial_delay = 1000;
let btv_scrape_delay = 3500;
(function() {
$.noConflict();
console.log("Hello there!");
function btv_scraper_main() {
let league_name1_dom = jQuery('.headline-h2.headline-aleo.z-label');
let league_name2_doms = jQuery('button.btn-default.dropdown-toggle.z-button');
let league_name3_doms = jQuery('.step.previous.z-div> .step-label.z-label');
league_name3_doms = league_name3_doms.slice(0, 4);
let league_name = league_name1_dom.text().trim();
jQuery(league_name2_doms).each(function() {
league_name += " " + jQuery(this).text().trim();
});
let i=0;
jQuery(league_name3_doms).each(function() {
league_name += " " + jQuery(this).text().trim().replace(/[\(\)]/g, "");
if (i++ % 2 == 0) league_name += ':';
});
league_name = league_name.trim();
league_name = [...new Set(league_name.split(" "))].join(" ");
league_name = league_name.replace("Archiv ", "");
league_name = league_name.replace("Aktuelle Saison ", "");
console.log(league_name);
let ids_dom = btv_scraper_get_ids_dom();
let ids_list = [];
jQuery(ids_dom).each(function() {
ids_list.push(jQuery(this).text());
});
ids_list.sort(function(a, b) {
return parseInt(a) - parseInt(b);
});
if (ids_list.length == 0) return;
if (isNaN(ids_list[0])) return;
console.log(ids_list);
let confirmed = confirm("Diese Liga (" + league_name + ") scrapen?");
if (!confirmed) return;
let data = {}; // id => {"link" => url, "teams" => [name1, name2]}
jQuery(ids_list).each(function() {
console.log(this)
});
btv_scraper_loop_scrape_ids(ids_list, data, league_name); //here it goes on (i hate async shit)
}
async function btv_scraper_loop_scrape_ids(ids_list, data, league_name) {
for (let i = 0; i < ids_list.length; i++) {
await btv_scraper_screape_id(ids_list[i], data, ids_list[ids_list.length - 1]);
}
//sort
data = Object.keys(data).sort().reduce(function (result, key) {
result[key] = data[key];
return result;
}, {});
console.log('finished data', data)
btv_scraper_create_table(data, league_name);
}
function btv_scraper_create_table(data, league_name) {
let t = "<h4>SCRAPED: " + league_name + "</h4>" + "<table><thead><tr><th>Gruppe</th><th>Mannschaft</th></tr></thead><tbody>";
for (const [key, value] of Object.entries(data)) {
let first_team = true;
value['teams'].forEach(element => {
if (first_team)
t += "<tr><td rowspan='" + value['teams'].length + "'><a href='" + value['link'] + "'>" + key + "</a></td><td>" + element + "</td></tr>";
else
t += "<tr><td>" + element + "</td></tr>";
first_team = false;
});
t += "<td bgcolor='white' style='line-height:10px;' colspan='2'> </td>";
}
t += "</tbody></table>";
jQuery('.u-section .is-container.z-div .z-div[style^="border"]').append(t);
console.log(t);
var a = document.createElement("a");
a.href = "data:text," + t;
a.download = league_name + ".html";
a.click();
}
function btv_scraper_get_ids_dom() {
let container_dom = jQuery('div.slick-track');
let subontainers_dom = jQuery(container_dom).children(':not(.slick-cloned)');
let ids_dom = jQuery(subontainers_dom).find('.z-toolbarbutton-content');
return ids_dom;
}
async function btv_scraper_screape_id(id, data, max_nr) {
console.log('scraping id ' + id + '/' + max_nr);
let ids_dom = btv_scraper_get_ids_dom();
let this_id_dom = null;
jQuery(ids_dom).each(function() {
if (jQuery(this).text() == id) this_id_dom = this;
});
if (this_id_dom !== null)
jQuery(this_id_dom)[0].click();
return new Promise(resolve => {
setTimeout(function() {
let url = null;
let teams = [];
jQuery('.z-hlayout .z-hlayout-inner .gbmeeting.z-groupbox.z-groupbox-3d').find('.z-toolbarbutton-content').each(function() {
teams.push(jQuery(this).text());
});
url = jQuery('.z-html').find('a[href^="https://www.btv.de/de/spielbetrieb"]').attr('href');
data[id] = {"link": url, "teams": teams};
console.log(data);
resolve();
}, btv_scrape_delay);
});
}
setTimeout(function() {
jQuery('.big-container.z-div').append('<button type="button" class="btn-default z-button" id="btv_scraper_button">Scrape</button>');
jQuery('#btv_scraper_button').click(btv_scraper_main);
}, btv_initial_delay);
})();