1. 버튼 추가
2. 글씨 가독성 UP

3. 상세페이지 버튼 추가
4. 다운수~찜수 보여줌
흡듭헬퍼랑 및챈헬퍼 개조해서 작성함
사용법은 흡듭헬퍼 / 및챈헬퍼와 동일하게
Tampermonkey 깔고 새 스크립트 추가해서 붙여넣기하셈
이하 코드내용
// ==UserScript==
// @name erovoice-helper
// @version 2.1.0
// @match http://e.erovoice.us/*
// @match https://e.erovoice.us/*
// @author ggee // tensorcrisis 수정
// @grant GM.xmlHttpRequest
// @description 에보헬퍼
// ==/UserScript==
;(function() {
const lang = document.documentElement.lang
function request(options = {}) {
return new Promise((resolve, reject) => {
GM.xmlHttpRequest(Object.assign({
method: 'GET',
onload: function (resp) {
if (resp.status === 200) { resolve(resp.response) }
else { reject(resp) }
},
onerror: function (resp) {
reject(resp)
},
}, options))
})
}
function fetchAPI(rj) {
const url = `https://www.dlsite.com/maniax/product/info/ajax?product_id=${rj}&cdn_cache_min=1`
return request({ url, responseType: 'json' })
}
async function addMetadata(rj, rjAnchor) {
const numFormat = new Intl.NumberFormat()
const insertAfter = (rf, node) => rf.parentNode.insertBefore(node, rf.nextSibling)
const metaList = document.createElement('dl')
metaList.className = 'RJ-modal-meta'
const meta = {}
const APPEND_DICT = lang === 'ja-jp'
? {
'販売日': '발매일',
'予告開始日': '예고일',
'声優': '성우',
'年齢指定': '수위',
'ジャンル': '태그',
}
: {
'판매일': '발매일',
'예고 개시일': '예고일',
'성우': '성우',
'연령 지정': '수위',
'작품 형식': '태그',
}
const DICT = {
'TITLE': '제목',
'CIRCLE': '서클',
'PRICE': '가격',
'RATE': '평점',
'DL': '다운수',
'WISH': '찜수',
...APPEND_DICT,
}
try {
const body = await request({ url: `${DL_BASE_URL}/${rj}.html` })
const frag = document.createElement('div')
frag.innerHTML = body
const table = frag.querySelector('#work_outline')
const rows = Array.from(table.querySelectorAll('tr'))
const appendDictKeys = Object.keys(APPEND_DICT);
const pHtml = rows.forEach(row => {
const [th, td] = Array.from(row.children)
//상세페이지엔 바뀐 dlsite 방식에 따라 이걸 추가해야지
})
} catch (e) { console.error(e) }
try {
const api = await fetchAPI(rj)
const data = api[rj] || {}
const { dl_count, wishlist_count, rate_average, rate_average_2dp, rate_count, price_str } = data
meta.RATE = `${rate_average_2dp} (${rate_count})`
//makeRate(rate_average)=별표시, 0.5간격, rate_average_2dp=소수점 표시
meta.DL = numFormat.format(dl_count)
meta.WISH = numFormat.format(wishlist_count)
meta.PRICE = `${price_str}円`
} catch (e) { console.error(e) }
// 판매량, 찜 수, 평점, 가격 받아오는 곳
Object.entries(DICT).forEach(([ key, value ]) => {
if (!meta[key]) { return }
const dt = document.createElement('dt')
dt.textContent = value + " = " + meta[key]
metaList.appendChild(dt)
})
rjAnchor.appendChild(metaList)
}
//여기까지 dl에서 정보 받아와서 정리
const DL_BASE_URL = 'https://www.dlsite.com/maniax'
const WORK_ITEMS = Array.prototype.slice.call(document.querySelectorAll('.post-outer'))
//여기 있는것들에 모두 적용시킬거임
//여기서부터 버튼 추가 함수
const cloneAnchor = function (node) {
const anchor = node.cloneNode(true)
anchor.target = '_blank'
anchor.rel = 'nofollow'
anchor.textContent = 'DLSITE'
// anchor.style.background = '#000'
anchor.style=""
anchor.style.background = '#bbb'
anchor.style.color = '#fff'
anchor.style.borderRadius = '5px'
anchor.style.padding = '2px 5px'
anchor.style.fontSize = '0.8em'
anchor.title=""
return anchor
}
const afterAnchor = function (node, anchor) {
node.insertAdjacentHTML('afterend', ` ${anchor.outerHTML}`)
}
const cloneRJLink = function (rjAnchor, rjCode, returns) {
const anchor = cloneAnchor(rjAnchor)
anchor.href = `${DL_BASE_URL}/work/=/product_id/${rjCode}.html`
return returns ? anchor : afterAnchor(rjAnchor, anchor)
}
const cloneHvdbRJLink = function (rjAnchor, rjCode, returns) {
const anchor = cloneAnchor(rjAnchor)
anchor.href = `https://hvdb.me/Dashboard/WorkDetails/${rjCode}`
anchor.textContent = 'HVDB'
return returns ? anchor : afterAnchor(rjAnchor, anchor)
}
const cloneAsmroneRJLink = function (rjAnchor, rjCode, returns) {
const anchor = cloneAnchor(rjAnchor)
anchor.href = `https://asmr.one/work/${rjCode}`
anchor.textContent = '짱엘'
return returns ? anchor : afterAnchor(rjAnchor, anchor)
}
//HVDB용
WORK_ITEMS
.filter(workItem => {
var rjAnchor = workItem.querySelector('.crop-wrap')
if (window.location.href.slice(-4)=="html"){
rjAnchor = workItem.querySelector('.title')
}
const HEADER = rjAnchor && rjAnchor.querySelector(':scope > h2 > a')
const [rjCode, HEADER_TITLE] = HEADER ? HEADER.textContent.replace(/\s+/g, ' ').replace(' - ', '-').trim().split('-') : []
//<div class="crop-wrap"> 안의 <h2> 안의 <a href:~~> 를 선택하고 싶을때는
//이렇게 :scope를 쓰면 됨
//안의 내용물은 .textContent로 봄
let anchor = rjAnchor.querySelector(":scope > h2 > a")
//지역변수 선언
if (window.location.href.slice(-4)!="html"){
anchor.style = "text-shadow: -1px 0 #000, 0 1px #000, 1px 0 #000, 0 -1px #000; font-size:13pt; font-weight:bold"
//글자에 테두리 추가
if (anchor) {
// DLSITE 링크
// 흡듭 링크
cloneAsmroneRJLink(anchor, rjCode)
cloneHvdbRJLink(anchor, rjCode)
cloneRJLink(anchor, rjCode)
}
} else {
cloneAsmroneRJLink(anchor, rjCode)
cloneHvdbRJLink(anchor, rjCode)
cloneRJLink(anchor, rjCode)
anchor = workItem.querySelector('.cover > .separator')
//div class="cover" 아래에 있는 div class="separator" 객체 선택
addMetadata(rjCode, anchor)
}
})
})();
// const parentElement = document.querySelector('#parent');
// let allChildren = parentElement.querySelectorAll(":scope > span");
// allChildren.forEach(item => item.classList.add("red"));
까지