// ==UserScript== // @namespace https://tampermonkey.myso.kr/ // @name 네이버 크리에이터 어드바이저 어드밴스드 // @description 네이버 크리에이터 어드바이저에 새로운 기능을 추가합니다. // @copyright 2021, myso (https://tampermonkey.myso.kr) // @license Apache-2.0 // @version 2.1.8 // @author Won Choi // @connect naver.com // @match *://creator-advisor.naver.com/* // @grant GM_addStyle // @grant GM_xmlhttpRequest // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/vendor/gm-app.js // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/vendor/gm-add-style.js // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/vendor/gm-add-script.js // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/vendor/gm-xmlhttp-request-async.js // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/vendor/gm-xmlhttp-request-cors.js // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/vendor/handle-locationchange.js // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/donation.js // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/lib/naver-blog.js // @require https://cdn.jsdelivr.net/npm/kr.myso.tampermonkey@1.0.48/assets/lib/naver-creator-advisor.js // @require https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.7.2/bluebird.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.7/handlebars.min.js // @downloadURL https://update.greasyfork.icu/scripts/428680/%EB%84%A4%EC%9D%B4%EB%B2%84%20%ED%81%AC%EB%A6%AC%EC%97%90%EC%9D%B4%ED%84%B0%20%EC%96%B4%EB%93%9C%EB%B0%94%EC%9D%B4%EC%A0%80%20%EC%96%B4%EB%93%9C%EB%B0%B4%EC%8A%A4%EB%93%9C.user.js // @updateURL https://update.greasyfork.icu/scripts/428680/%EB%84%A4%EC%9D%B4%EB%B2%84%20%ED%81%AC%EB%A6%AC%EC%97%90%EC%9D%B4%ED%84%B0%20%EC%96%B4%EB%93%9C%EB%B0%94%EC%9D%B4%EC%A0%80%20%EC%96%B4%EB%93%9C%EB%B0%B4%EC%8A%A4%EB%93%9C.meta.js // ==/UserScript== // ==OpenUserJS== // @author myso // ==/OpenUserJS== GM_App(async function main() { GM_donation('#root'); GM_addStyle(`@import url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.0.1/css/bootstrap-grid.min.css)`); GM_addStyle(`@import url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.0.1/css/bootstrap-utilities.min.css)`); GM_addStyle(`.form-control { font-size: 12px; line-height: 24px; background: transparent; border: 1px solid rgba(0,0,0,0.2); } select.form-control { height: 28px; }`); Handlebars.registerHelper('select', (selected, options) => options.fn(this).replace(new RegExp(' value=\"' + selected + '\"'), '$& selected="selected"')); window.addEventListener('locationchange', async function() { if(location.pathname != '/') return; const uri = new URL(location.href); const channels = await CreatorAdvisor.exec('channels'); await (async function draw() { const wrap = document.querySelector('.u_ni_section_wrap'); const cont = wrap.querySelector('.u_ni_advanced') || document.createElement('div'); cont.classList.add('u_ni_advanced'); wrap.prepend(cont); const data = Object.assign({ service: 'naver_blog' }, Object.fromEntries(uri.searchParams)); data.sdate = data.sdate || moment().subtract(2, 'days').format('YYYY-MM-DD'); data.edate = data.edate || moment().format('YYYY-MM-DD'); data.channels = _.uniqBy(channels, 'service'); data.channel = _.find(data.channels, { service: data.service || 'naver_blog' }); data.items = data.query && await Promise.map(_.range(moment(data.edate).diff(data.sdate, 'days') + 1).map((o)=>moment(data.edate).subtract(o, 'days').format('YYYY-MM-DD')), async (date) => { const params = { service: data.channel.service, channelId: data.channel.channelId, date, keyword: data.query, limit: 20 }; if(params.service == 'influencer') Object.assign(params, { metric: 'cv', contentType: 'text', interval: 'day' }); if(params.service == 'naver_blog') Object.assign(params, { metric: 'cv', contentType: 'text', interval: 'day' }); if(params.service == 'naver_post') Object.assign(params, { metric: 'cv', contentType: 'text', interval: 'day' }); if(params.service == 'ntv') Object.assign(params, { metric: 'play_count', contentType: 'video', interval: 'day' }); const contents = await window.CreatorAdvisor.exec('popular-contents', params); return { date, data: contents.data } }); data.report = data.items && _.orderBy(_.map(_.groupBy(data.items.map(o=>o.data).flat(), 'channelName'), (items, channelName)=>({ channelName, metricValue: _.sumBy(items, 'metricValue') })), 'metricValue', 'desc').map((o, i)=>Object.assign({ rank: i + 1 }, o)); cont.innerHTML = Handlebars.compile(`
{{metricValue}}