Greasy Fork

Greasy Fork is available in English.

Douban Book Autofill

auto fill douban book subject creation form

目前为 2018-12-24 提交的版本,查看 最新版本

// ==UserScript==
// @name         Douban Book Autofill
// @namespace    https://gimo.me/
// @version      0.1
// @description  auto fill douban book subject creation form
// @author       Yuanji
// @match        https://book.douban.com/new_subject
// @grant        GM_xmlhttpRequest
// ==/UserScript==


function createFillBtn() {
    const isbn = document.getElementById('p_9').value
    const amazonURL = 'https://www.amazon.co.jp/dp/4883929124/' + isbn + '?showDetailProductDesc=1';
    const fillBtn = document.createElement('input');
    const submitBtn = document.querySelector('input[name="detail_subject_submit"]')
    fillBtn.setAttribute('type', 'submit')
    fillBtn.setAttribute('class', 'submit')
    fillBtn.setAttribute('value', '自动填写')
    fillBtn.onclick = (e) => { e.preventDefault(); getDoc(amazonURL, updateText)}
    submitBtn.parentNode.insertBefore(fillBtn, submitBtn)
}

function getDoc(url, callback) {
    GM_xmlhttpRequest({
        method: 'GET',
        url: url,
        headers: {
            'User-agent': window.navigator.userAgent,
        },
        onload: (responseDetail) => {
            var doc;
            doc = '';
            if (responseDetail.status == 200) {
                doc = (new DOMParser).parseFromString(responseDetail.responseText, 'text/html');
                console.log(doc.getElementById('productTitle').innerText);
                callback(doc)
            }
        }
    });
}

function updateText(amazonDoc) {
    const title = document.getElementById('p_2');
    //const subTitle = document.getElementById('p_42');
    const origTitle = document.getElementById('p_98');
    const author = document.getElementById('p_5_0');
    const price = document.getElementById('p_8');
    const publisher = document.getElementById('p_6');
    const publishYear = document.getElementById('p_7_selectYear');
    const publishMonth = document.getElementById('p_7_selectMonth');
    const publishDay = document.getElementById('p_7_selectDay');
    const pageNum = document.getElementById('p_10');
    const intro = document.querySelector('textarea[name="p_3_other"]');
    const authorIntro = document.querySelector('textarea[name="p_40_other"]');
    // 默认平装
    document.getElementById('p_58_0').checked = true;

    const amazonTitleText = amazonDoc.getElementById('productTitle').innerText;
    const publishDate = amazonDoc.querySelector('#title > span:nth-child(3)').innerText;
    const amazonInfo = amazonDoc.getElementById('detail_bullets_id');
    const amazonIntro = amazonDoc.getElementById('productDescription');
    const getTextNodeContent = item => {
        for (let n of item.childNodes) {
            if (n.nodeType === Node.TEXT_NODE) {
                console.log(n);
                return n.textContent
            }
        }
    }
    for (let item of amazonInfo.getElementsByTagName('li')) {
        const itemText = item.innerText
        if (itemText.includes('ページ')) {
            pageNum.value = parseInt(getTextNodeContent(item));
        }
        if (itemText.includes('出版社')) {
            const [publisherText, publishDateText] = getTextNodeContent(item).trim().split(' ');
            const [, yearText, monthText, dayText] = publishDateText.match(/\((\d+)\/(\d+)\/(\d+)\)/);
            publisher.value = publisherText;
            publishYear.value = yearText;
            publishMonth.value = monthText;
            publishMonth.dispatchEvent(new Event('change'));
            publishDay.value = dayText;
            console.log(publisherText, publishDateText);
        }
    }
    for (let el of amazonIntro.children) {
        if (el.innerText === '内容紹介') {
            intro.value = el.nextElementSibling.innerText;
        }
        if (el.innerText === '著者について') {
            authorIntro.value = el.nextElementSibling.innerText;
        }
    }
    title.value = amazonTitleText;
    origTitle.value = amazonTitleText;
    author.value = amazonDoc.getElementsByTagName('title')[0].innerText.split('|')[1].trim();
}

(function() {
    'use strict';
    createFillBtn();

})();