Greasy Fork

Google Scholar to Sci-Hub

Adds Sci-Hub and LibGen buttons to Google Scholar results

目前为 2025-02-02 提交的版本。查看 最新版本

// ==UserScript==
// @name         Google Scholar to Sci-Hub
// @namespace    ScholarToSciHub
// @version      1.1
// @description  Adds Sci-Hub and LibGen buttons to Google Scholar results
// @author       Bui Quoc Dung
// @include      https://scholar.google.*/*
// @license      AGPL-3.0-or-later
// ==/UserScript==

const SCIHUB_URL = 'https://www.tesble.com/';
const LIBGEN_URL = 'https://libgen.li/index.php?req=';

function addButtons() {
    const results = document.querySelectorAll('#gs_res_ccl_mid .gs_r.gs_or.gs_scl');

    results.forEach(result => {
        const titleLink = result.querySelector('.gs_rt a');
        let buttonContainer = result.querySelector('.gs_or_ggsm');

        if (!buttonContainer) {
            const div = document.createElement('div');
            div.className = 'gs_ggs gs_fl';
            div.innerHTML = '<div class="gs_ggsd"><div class="gs_or_ggsm"></div></div>';
            result.insertBefore(div, result.firstChild);
            buttonContainer = div.querySelector('.gs_or_ggsm');

            const sciHubLink = document.createElement('a');
            sciHubLink.textContent = 'Sci-Hub';
            sciHubLink.addEventListener('click', () => window.open(SCIHUB_URL + titleLink.href));
            buttonContainer.appendChild(sciHubLink);

            const libGenLink = document.createElement('a');
            libGenLink.textContent = ' LibGen';
            libGenLink.addEventListener('click', () => window.open(LIBGEN_URL + encodeURIComponent(titleLink.textContent)));
            buttonContainer.appendChild(libGenLink);
        }
    });
}

// Initial setup
addButtons();

// Watch for dynamic content changes
const observer = new MutationObserver((mutations) => {
    mutations.forEach((mutation) => {
        if (mutation.addedNodes.length) {
            addButtons();
        }
    });
});

observer.observe(document.body, {
    childList: true,
    subtree: true
});