您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Handles the process for language course signup with persistent course selection
- // ==UserScript==
- // @name Das Tool Tool
- // @namespace http://tampermonkey.net/
- // @version 1.6.1
- // @description Handles the process for language course signup with persistent course selection
- // @author ricardofauch
- // @match https://tool.uni-leipzig.de/einschreibung/bookings/*
- // @match https://tool.uni-leipzig.de/einschreibung/info/*
- // @grant GM_addStyle
- // @grant GM_setValue
- // @grant GM_getValue
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- let isEnabled = GM_getValue('isEnabled', false);
- let autoReload = GM_getValue('autoReload', true);
- let targetCourse = GM_getValue('targetCourse', '');
- const RELOAD_INTERVAL = 1000; // Reload every 1 second
- let intervalId = null;
- // Add styles
- GM_addStyle(`
- #courseSignupControl {
- position: fixed;
- top: 40%;
- left: 10px;
- background: rgba(255, 203, 207, 0.8);
- border: 1px solid #ccc;
- padding: 10px;
- z-index: 9999;
- width: 180px;
- font-family: Arial, sans-serif;
- font-size: 12px;
- box-shadow: 0 2px 5px rgba(0,0,0,0.2);
- border-radius: 10px;
- }
- #courseSignupControl h3 {
- margin: 0 0 10px 0;
- font-size: 14px;
- }
- .text{
- margin: 5px 5px 5px 0;
- }
- .toggle-switch {
- position: relative;
- display: inline-block;
- width: 40px;
- height: 20px;
- margin-right: 5px;
- }
- .toggle-switch input {
- opacity: 0;
- width: 0;
- height: 0;
- }
- .slider {
- position: absolute;
- cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: #ccc;
- transition: .4s;
- border-radius: 20px;
- }
- .slider:before {
- position: absolute;
- content: "";
- height: 16px;
- width: 16px;
- left: 2px;
- bottom: 2px;
- background-color: white;
- transition: .4s;
- border-radius: 50%;
- }
- input:checked + .slider {
- background-color: #2196F3;
- }
- input:checked + .slider:before {
- transform: translateX(20px);
- }
- .control-group {
- margin-bottom: 5px;
- }
- .labelsprachkurs{
- margin-bottom: 10px;
- }
- #courseSelect {
- width: 100%;
- box-sizing: border-box;
- margin-top: 5px;
- margin-bottom: 10px;
- }
- #status {
- margin-top: 10px;
- font-size: 11px;
- color: red;
- }
- `);
- // Add this function to handle course changes
- function handleCourseChange(newCourse) {
- console.log('Course changed to:', newCourse);
- targetCourse = newCourse;
- GM_setValue('targetCourse', targetCourse);
- if (isEnabled){
- // Navigate back to the course selection page
- if (window.location.href !== 'https://tool.uni-leipzig.de/einschreibung/bookings/course') {
- console.log('Navigating to course selection page');
- window.location.href = 'https://tool.uni-leipzig.de/einschreibung/bookings/course';
- } else {
- console.log('Already on course selection page, running checkAndSelect');
- checkAndSelect();
- }
- }
- }
- // Create UI (updated to set the selected course)
- function createControlPanel() {
- const controlPanel = document.createElement('div');
- controlPanel.id = 'courseSignupControl';
- controlPanel.innerHTML = `
- <h3>Das Tool Tool</h3>
- <p class="text">1. Wähle einen Sprachkurs aus dem Dropdown-Menü aus.</p>
- <p class="text">2. Aktiviere das Skript</p>
- <p class="text labelsprachkurs" >Die Seite wird dann für dich einmal pro Sekunde aktualisiert und sobald die Einschreibung freigeschaltet ist wirst du automatisch bis zur finalen Terminwahl weitergeleitet.</p>
- <div class="control-group">
- <label for="courseSelect">Sprachkurs:</label>
- <select id="courseSelect">
- <option value="">Wähle einen Sprachkurs</option>
- <option value="Grundkurs Altgriechisch">Grundkurs Altgriechisch</option>
- <option value="Arabisch A2.1">Arabisch A2.1</option>
- <option value="Autonomes Sprachenlernen">Autonomes Sprachenlernen</option>
- <option value="Bosnisch Kroatisch Serbisch A2">Bosnisch Kroatisch Serbisch A2</option>
- <option value="Brasilianisches Portugiesisch B1">Brasilianisches Portugiesisch B1</option>
- <option value="Fachübergreifendes Englisch B2">Fachübergreifendes Englisch B2</option>
- <option value="Englisch für Geowissenschaften B2">Englisch für Geowissenschaften B2</option>
- <option value="Englisch für Geistes- und Sozialwissenschaften B2">Englisch für Geistes- und Sozialwissenschaften B2</option>
- <option value="Englisch für Geistes- und Sozialwissenschaften C1">Englisch für Geistes- und Sozialwissenschaften C1</option>
- <option value="Englisch in der Wirtschaft B2">Englisch in der Wirtschaft B2</option>
- <option value="Englisch in der Wirtschaft C1">Englisch in der Wirtschaft C1</option>
- <option value="Französisch A2">Französisch A2</option>
- <option value="Französisch B1">Französisch B1</option>
- <option value="Französisch B2">Französisch B2</option>
- <option value="Französisch C1">Französisch C1</option>
- <option value="Italienisch A2">Italienisch A2</option>
- <option value="Italienisch B1">Italienisch B1</option>
- <option value="Italienisch B2">Italienisch B2</option>
- <option value="Grundkurs Latein">Grundkurs Latein</option>
- <option value="Lateinkenntnisse">Lateinkenntnisse</option>
- <option value="Latinum">Latinum</option>
- <option value="Norwegisch B1">Norwegisch B1</option>
- <option value="Polnisch A1">Polnisch A1</option>
- <option value="Polnisch A2">Polnisch A2</option>
- <option value="Russisch A1">Russisch A1</option>
- <option value="Russisch A2">Russisch A2</option>
- <option value="Russisch B1 für Fremdsprachenlernende">Russisch B1 für Fremdsprachenlernende</option>
- <option value="Russisch B2.1">Russisch B2.1</option>
- <option value="Spanisch A2">Spanisch A2</option>
- <option value="Spanisch B1">Spanisch B1</option>
- <option value="Spanisch B2">Spanisch B2</option>
- <option value="Spanisch C1">Spanisch C1</option>
- <option value="Sprachenlernen im Tandem">Sprachenlernen im Tandem</option>
- <option value="Polnisch B2.1">Polnisch B2.1</option>
- <option value="Polnisch B1.1">Polnisch B1.1</option>
- <option value="Russisch B2.2 für Fremdsprachenlernende">Russisch B2.2 für Fremdsprachenlernende</option>
- <option value="Russisch B1 für Herkunftssprechende">Russisch B1 für Herkunftssprechende</option>
- <option value="Tschechisch B2.1">Tschechisch B2.1</option>
- <option value="Tschechisch B1.1">Tschechisch B1.1</option>
- <option value="Tschechisch A1">Tschechisch A1</option>
- <option value="Sprache und Kommunikation IIa (Obersorbisch)">Sprache und Kommunikation IIa (Obersorbisch)</option>
- <option value="Sprache und Kommunikation IIb (Niedersorbisch)">Sprache und Kommunikation IIb (Niedersorbisch)</option>
- <option value="Keltische Studien I">Keltische Studien I</option>
- <option value="Keltische Studien III">Keltische Studien III</option>
- <option value="Irisch im 21. Jahrhundert">Irisch im 21. Jahrhundert</option>
- <option value="Basiskenntnisse Obersorbisch">Basiskenntnisse Obersorbisch</option>
- <option value="Basiskenntnisse Niedersorbisch">Basiskenntnisse Niedersorbisch</option>
- <option value="Aktivierungskurs Obersorbisch I">Aktivierungskurs Obersorbisch I</option>
- </select>
- <div class="control-group">
- <label class="toggle-switch">
- <input type="checkbox" id="enableAutoReload" ${autoReload ? 'checked' : ''}>
- <span class="slider"></span>
- </label>
- <label for="enableAutoReload">Auto-Reload</label>
- </div>
- <div class="control-group">
- <label class="toggle-switch">
- <input type="checkbox" id="enableScript" ${isEnabled ? 'checked' : ''}>
- <span class="slider"></span>
- </label>
- <label for="enableScript">Skript aktivieren</label>
- </div>
- <div id="status"></div>
- </div>
- `;
- document.body.appendChild(controlPanel);
- // Set the selected course
- document.getElementById('courseSelect').value = targetCourse || "";
- // Event listeners
- document.getElementById('enableScript').addEventListener('change', (e) => {
- isEnabled = e.target.checked;
- GM_setValue('isEnabled', isEnabled);
- if (isEnabled) {
- startScript();
- } else {
- console.log('Stopped, because Toggle Switch got deactivated');
- stopScript();
- }
- });
- document.getElementById('enableAutoReload').addEventListener('change', (e) => {
- autoReload = e.target.checked;
- GM_setValue('autoReload', autoReload);
- });
- document.getElementById('courseSelect').addEventListener('change', (e) => {
- const newCourse = e.target.value;
- handleCourseChange(newCourse);
- });
- }
- function selectSprachenzentrum() {
- const radioButtons = document.querySelectorAll('input[type="radio"]');
- for (let radio of radioButtons) {
- const label = radio.nextElementSibling;
- if (label && label.textContent.includes('Sprachenmodule des Sprachenzentrums')) {
- if (!radio.disabled) {
- radio.click();
- return true;
- }
- return false;
- }
- }
- return false;
- }
- function selectLanguageModule() {
- console.log('Starting selectLanguageModule function');
- console.log('Target course:', targetCourse);
- const rows = document.querySelectorAll('table tbody tr');
- console.log('Found', rows.length, 'rows in the table');
- // Uncheck all checkboxes first
- rows.forEach((row, index) => {
- const checkbox = row.querySelector('input[type="checkbox"]');
- if (checkbox && checkbox.checked) {
- console.log('Unchecking previously selected course in row', index + 1);
- checkbox.click();
- }
- });
- for (let i = 0; i < rows.length; i++) {
- const row = rows[i];
- console.log('Checking row', i + 1);
- const courseTitleCell = row.querySelector('td:nth-child(3)');
- if (courseTitleCell) {
- const courseTitle = courseTitleCell.textContent.trim();
- console.log('Row', i + 1, 'Course Title:', courseTitle);
- if (courseTitle.includes(targetCourse)) {
- console.log('Found matching course in row', i + 1);
- const checkbox = row.querySelector('input[type="checkbox"]');
- if (checkbox) {
- console.log('Checkbox found. Disabled:', checkbox.disabled, 'Checked:', checkbox.checked);
- if (checkbox.disabled) {
- console.log('Target course checkbox is disabled. Stopping the script.');
- checkbox.scrollIntoView({ behavior: "smooth", block: "center"});
- stopScript();
- updateStatus('Kurs ist ausgebucht!');
- return false;
- }
- if (!checkbox.checked) {
- console.log('Clicking checkbox');
- checkbox.click();
- } else {
- console.log('Checkbox already checked');
- }
- console.log('Course selected successfully');
- return true;
- } else {
- console.log('No checkbox found in this row');
- }
- }
- } else {
- console.log('Row', i + 1, 'is missing course title cell');
- }
- }
- console.log('No matching course found or all matching courses are unavailable');
- return false;
- }
- function updateStatus(message) {
- const statusElement = document.getElementById('status');
- if (statusElement) {
- statusElement.textContent = message;
- } else {
- console.log('Status update:', message);
- }
- }
- function clickWeiter() {
- const weiterButton = document.querySelector('input[type="submit"][value="Weiter"]');
- if (weiterButton) {
- weiterButton.click();
- return true;
- }
- return false;
- }
- function areAllCheckboxesChecked() {
- const checkboxes = document.querySelectorAll('input[type="checkbox"]');
- return Array.from(checkboxes).every(checkbox => checkbox.checked);
- }
- function checkAndSelect() {
- if (!isEnabled) return false;
- if (window.location.href.includes('/bookings/group')) {
- if (selectSprachenzentrum()) {
- return clickWeiter();
- }
- } else if (window.location.href.includes('/bookings/course')) {
- if (selectLanguageModule()) {
- if (clickWeiter()) {
- console.log('Successfully selected language module and clicked "Weiter"');
- return true;
- } else {
- console.log('Selected language module but failed to click "Weiter"');
- return false;
- }
- } else {
- console.log('Language Course not found or fully booked');
- stopScript();
- return false;
- }
- } else if (window.location.href.includes('/bookings/details')) {
- window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });
- if (areAllCheckboxesChecked()){
- console.log('All Checkboxes checked!');
- const speichernButton = document.querySelector('input[type="submit"][value="Speichern"]');
- if (speichernButton) {
- speichernButton.click();
- }
- }
- return true;
- } else if (window.location.href.includes('/info/')) {
- window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });
- console.log('Info Page reached. Stopping');
- return true;
- }
- return false;
- }
- function reloadAndCheck() {
- if (isEnabled) {
- if (!checkAndSelect() && autoReload && window.location.href.includes('/bookings/group')) {
- console.log('Target not available. Reloading in 1 second...');
- setTimeout(() => {
- location.reload();
- }, RELOAD_INTERVAL);
- }
- }
- }
- function startScript() {
- console.log('Starting script');
- if (window.location.href.includes('/info/')){
- window.location.href = 'https://tool.uni-leipzig.de/einschreibung/bookings/group';
- }
- if (!intervalId) {
- intervalId = setInterval(reloadAndCheck, RELOAD_INTERVAL);
- reloadAndCheck(); // Run once immediately
- }
- }
- function stopScript() {
- console.log('Stopping script');
- if (intervalId) {
- clearInterval(intervalId);
- intervalId = null;
- }
- isEnabled = false;
- GM_setValue('isEnabled', false);
- const enableScriptCheckbox = document.getElementById('enableScript');
- if (enableScriptCheckbox) {
- enableScriptCheckbox.checked = false;
- }
- }
- createControlPanel();
- if (isEnabled && window.location.href.includes('/bookings/')) {
- console.log('Script is enabled, starting automatically');
- startScript();
- }
- if (isEnabled && window.location.href.includes('/info/')) {
- console.log('Scrolling down!')
- window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });
- stopScript();
- }
- })();