// ==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 // @downloadURL none // ==/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(); })();