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"));




까지