// ==UserScript== // @name Douban Book Autofill // @namespace https://gimo.me/ // @version 0.5.3 // @description auto fill douban book subject creation form // @author Yuanji // @match https://book.douban.com/new_subject* // @connect www.amazon.co.jp // @grant GM_xmlhttpRequest // @downloadURL https://update.greasyfork.icu/scripts/375904/Douban%20Book%20Autofill.user.js // @updateURL https://update.greasyfork.icu/scripts/375904/Douban%20Book%20Autofill.meta.js // ==/UserScript== const submitBtn = document.querySelector('input[name="detail_subject_submit"]') const nextStepBtn = document.querySelector('input[name="subject_submit"]') function createFillBtn() { const isbn = document.getElementById('p_9').value const amazonURL = 'https://www.amazon.co.jp/dp/' + isbn + '?showDetailProductDesc=1'; const fillBtn = document.createElement('input'); fillBtn.setAttribute('type', 'submit') fillBtn.setAttribute('class', 'submit') fillBtn.setAttribute('value', '自动填写') fillBtn.onclick = (e) => { e.preventDefault(); getDoc(amazonURL, updateText)} return fillBtn } function createCoverBtn(url) { const coverBtn = document.createElement('input'); coverBtn.setAttribute('type', 'submit') coverBtn.setAttribute('class', 'submit') coverBtn.setAttribute('value', '下载封面') coverBtn.onclick = (e) => { e.preventDefault(); window.open(url)} return coverBtn } function createSearchBtn() { const searchBtn = document.createElement('input'); searchBtn.setAttribute('type', 'submit') searchBtn.setAttribute('class', 'submit') searchBtn.setAttribute('value', '検索') searchBtn.onclick = (e) => { e.preventDefault(); const title = document.getElementById('p_title').value const amazonSearchURL = 'https://www.amazon.co.jp/s/?url=search-alias%3Dstripbooks&keywords=' + title console.log(amazonSearchURL) getDoc(amazonSearchURL, search) } return searchBtn } function search(amazonSearchDoc) { let amazonSearchBox = document.getElementById('amazon_search_box') if (amazonSearchBox) { amazonSearchBox.remove() } const results = [] console.log(amazonSearchDoc.querySelector('div.s-result-list.sg-row')) for (let li of amazonSearchDoc.querySelector('div.s-result-list.sg-row').children) { let result = {} const h2 = li.getElementsByTagName('h2')[0] if (!h2) { continue } result.title = h2.textContent.trim() const a = h2.getElementsByTagName('a')[0] const url = a.href const match = url.match(/\/dp\/(.*)\//) if (match && match[1].length == 10) { result.isbn = match[1] results.push(result) console.log(result) } } let lists = '' for (let r of results) { lists += `
  • ${r.title}
  • \n` } let ul = document.createElement('ul') ul.innerHTML = ` ` document.querySelector('div[class="article"]').appendChild(ul) for (let item of document.getElementsByClassName('amazon_search_item')) { item.onclick = e => { e.preventDefault() console.log(item.innerText, item.getAttribute('isbn')) document.getElementById('p_title').value = item.innerText.trim() document.getElementById('uid').value = item.getAttribute('isbn') } } } function getDoc(url, callback) { GM_xmlhttpRequest({ method: 'GET', url: url, headers: { 'User-agent': window.navigator.userAgent, }, onload: (responseDetail) => { let doc = ''; if (responseDetail.status == 200) { doc = (new DOMParser).parseFromString(responseDetail.responseText, 'text/html'); 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 amazonInfo = amazonDoc.getElementById('detail_bullets_id'); const amazonIntro = amazonDoc.getElementById('productDescription'); let amazonCoverURL = ''; const amazonCover = amazonDoc.querySelector("#imgThumbs > div:nth-child(1) > img"); if (amazonCover) { amazonCoverURL = amazonCover.src.replace(/_.*_\./, ''); } 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] = getTextNodeContent(item).trim().match(/(.*)\(.*\)/); const [, publishDateText] = getTextNodeContent(item).trim().match(/.*\((.*)\)/); if (publisherText) { publisher.value = publisherText; } if (publishDateText) { let [yearText, monthText, dayText] = publishDateText.split('/').map((x) => parseInt(x)); dayText = dayText || 1; publishYear.value = yearText; publishMonth.value = monthText; publishMonth.dispatchEvent(new Event('change')); publishDay.value = dayText; console.log(publisherText, yearText, monthText, dayText); } } } for (let el of amazonIntro.children) { if (el.innerText.startsWith('内容')) { intro.value += el.nextElementSibling.innerText.trim(); } if (el.innerText.startsWith('著者')) { authorIntro.value = el.nextElementSibling.innerText.trim(); } } title.value = amazonTitleText; origTitle.value = amazonTitleText; author.value = amazonDoc.getElementsByTagName('title')[0].innerText.split('|')[1].trim(); if (amazonCoverURL) { const coverBtn = createCoverBtn(amazonCoverURL); submitBtn.parentNode.insertBefore(coverBtn, submitBtn.parentNode.firstChild) } } (function() { 'use strict'; if (nextStepBtn) { const searchBtn = createSearchBtn(); nextStepBtn.parentNode.insertBefore(searchBtn, nextStepBtn); } if (submitBtn) { const fillBtn = createFillBtn(); submitBtn.parentNode.insertBefore(fillBtn, submitBtn); } })();