// ==UserScript==
// @name Acfun_UP稿件搜索
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 来点稿件搜索
// @author 幽想
// @match https://www.acfun.cn/u/*
// @license GNU GPLv3
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @grant GM_getValue
// @connect member.acfun.cn
// @require https://cdn.jsdelivr.net/npm/sweetalert2@11.0.18/dist/sweetalert2.all.min.js
// @downloadURL https://update.greasyfork.icu/scripts/440321/Acfun_UP%E7%A8%BF%E4%BB%B6%E6%90%9C%E7%B4%A2.user.js
// @updateURL https://update.greasyfork.icu/scripts/440321/Acfun_UP%E7%A8%BF%E4%BB%B6%E6%90%9C%E7%B4%A2.meta.js
// ==/UserScript==
var searchPage = 0;
if (!GM_getValue('showSearchCount')) {
GM_setValue('showSearchCount',20);
}
if (!GM_getValue('searchDefType')) {
GM_setValue('searchDefType',0);
}
var searchDefType = GM_getValue('searchDefType');
var count = GM_getValue('showSearchCount');
GM_addStyle(`
#yx_search_main{
flex-wrap: wrap;
overflow: visible;
justify-content: center;
}
.yx_search-video,.yx_search-article{
padding: 0.75rem;
display: flex;
border-bottom: 1px solid #ececec;
transition: all 0.3s ease-in-out;
max-height: 90px;
align-items: center;
background-color: white;
border-radius: 5px;
}
.yx_search-video:hover{
transform: scale(1.01);
background-color: lightgrey;
}
.yx_search-article{
width: 47%;
}
.yx_search-article:hover{
transform: scale(1.05);
background-color: #f3f3f3;
border: 2px solid #fd4c5d;
}
.yx_svideo_main{
margin-left: 20px;
display: flex;
width: 100%;
flex-wrap: wrap;
}
.yx_svideo_main_title{
font-size: 1.1rem;
font-weight: bold;
width: 100%;
}
.yx_svideo_main_info{
font-size: 1rem;
width: 100%;
height: 100%;
margin-top: 1rem;
}
.yx_search_keyWord{
padding-top: 0.5rem;
height: 30px;
display: flex;
justify-content: flex-end;
}
.yx_search_keyWord_main{
border: 1px solid #ccc;
display: flex;
width: fit-content;
}
.yx_search_keyWord_main > input{
outline-style: none;
border: 0;
padding: 0.3rem;
border-right: 1px solid #ccc;
width: 18rem;
}
.yx_search_keyWord_main > div{
display: flex;
align-items: center;
cursor: pointer;
padding: 0px 0.3rem;
transition: all 0.3s ease-in-out;
background: white;
}
.yx_search_keyWord_main > div:hover{
background: #fd4c5b;
color: white;
transform: scale(1.1);
}
#yx_searchBtn_Video{
border-right: 1px solid #ccc;
}
#yx_search_pager{
margin-top: 0.7rem;
display: flex;
justify-content: center;
}
.yx_search_aComment{
float: left;
width: 130px;
margin-top: -1px;
text-align: right;
font-size: 14px;
line-height: 14px;
color: #999;
cursor: pointer;
}
.yx_search_aComment_count{
font-size: 28px;
line-height: 28px;
color: #fd4c5d;
margin-bottom: 7px;
}
#yx_search_settings{
border-right: 1px solid #ccc;
}
#yx_search_settings:hover svg{
animation: 1s rotate180;
}
@keyframes rotate180 {
from { transform: rotate(0deg); }
to { transform: rotate(180deg); }
}
`)
function toast_info (t,timer = 2000) {
Swal.fire({
icon:'info',
title:t,
showConfirmButton: false,
toast: true,
timer: timer
});
}
function toast_error (t,timer = 2000) {
Swal.fire({
icon:'error',
title:t,
showConfirmButton: false,
toast: true,
timer: timer
});
}
function gensHTML_v (acid,coverUrl,title,infos) {
const content = `
`
return content;
}
function gensHTML_a (acid,commentCount,title,infos) {
const content = `
`
return content;
}
function updateNum (n) {
let div = document.querySelector('#yx_search_TotalNum');
if (!!div) {
div.textContent = n;
}
}
function addPager (np,tp,kw,rt) {
if (tp==1){
return;
}
let e = document.createElement('div');
let prev = '';
let next = '';
if (np == 0) {
prev = 'pager__btn__disabled';
}
if (np == tp-1) {
next = 'pager__btn__disabled';
}
let content = ``;
append2Div(content);
document.querySelector('#yx_search_pager_prev').addEventListener('click',function(){
if (document.querySelector('#yx_search_pager_prev').classList.contains('pager__btn__disabled')) {
return;
}
search(kw,np-1,rt);
});
document.querySelector('#yx_search_pager_next').addEventListener('click',function(){
if (document.querySelector('#yx_search_pager_next').classList.contains('pager__btn__disabled')) {
return;
}
search(kw,np+1,rt);
});
document.querySelector('#yx_search_pager_input').addEventListener('keypress',function(e){
if (e.keyCode == 13) {
let page = Number(document.querySelector("#yx_search_pager_input").value) - 1;
if (page+1 > tp) {
toast_error('超出页数范围,最大页数为 ' + tp);
return;
}
search(kw,page,rt);
}
});
}
function append2Div (v) {
let tdiv = document.querySelector('#yx_search_main');
if (!tdiv) {
//更新,报错
toast_error('出错,搜索结果面板异常,请刷新页面重试。');
return;
}
let n = document.createElement('div');
tdiv.appendChild(n);
n.outerHTML = v;
}
function clearSearchPanel () {
document.querySelector("#yx_search_main").innerHTML = '';
}
async function getKW (uid,keyword,page = 0,rtype = 2,stype = 3) {//返回JSON
let res = await gm_xhr('POST','https://member.acfun.cn/list/api/queryContributeList',`pcursor=${page}&count=${count}&resourceType=${rtype}&sortType=${stype}&authorId=${uid}&keyword=${keyword}`);
if (!!res) {
res = res.responseText;
};
let j = null;
try {
j = JSON.parse(res);
} catch (e) {
};
return j;
}
async function search (keyword,page = 0,rtype = 2, append = false) {
if (!append) {
clearSearchPanel();
}
toast_info('正在获取数据…',1000);
let uid;
try {
uid = document.URL.match(/acfun.cn\/u\/(.*)/)[1];
} catch {
toast_error('uid获取出错');
console.log('uid获取出错');
return;
}
let j = await getKW (uid,keyword,page,rtype);
if (j == null) {
toast_error('API返回信息出错');
console.log('返回信息出错');
return;
}
//console.log(j)
if (j.totalNum == 0) {
toast_info('未找到相关稿件');
console.log('未找到相关稿件');
return;
};
updateNum(j.totalNum);
let arr = j.feed;
let content;
arr.forEach(function(v){
if (rtype == 2) {
let resizeCoverUrl = v.coverUrl.replace('?imageslim',`?imageView2/1/w/160/h/90|imageMogr2/auto-orient/format/webp/quality/80!/ignore-error/1`);
//console.log(resizeCoverUrl);
content = gensHTML_v(v.dougaId,resizeCoverUrl,v.title,`播放:${v.viewCountShow} 评论:${v.commentCount} 弹幕:${v.danmakuCount} 时间:${v.createTime}`);
}
if (rtype == 3) {
let otime = v.contributeTime;
let ntime = getTime_Unix(otime);
content = gensHTML_a(v.contentId,v.commentCount,v.contentTitle,`浏览:${v.viewCountShow} 时间:${ntime}`);
}
if (!!content) {
append2Div(content);
}
});
if (rtype == 2) {
document.querySelector('#yx_search_main').style.display = '';
}
if (rtype == 3) {
document.querySelector('#yx_search_main').style.display = 'flex';
}
addPager(page,Math.ceil(j.totalNum/count),keyword,rtype);
document.querySelector("#yx_search_li").click();
}
function getTime_Unix (unix) {
unix = Number(unix);
let le = unix.toString().length;
if (le == 10) {//10为unix则乘1000
unix = unix * 1000;
}
let time = new Date(unix);
return time.getFullYear() + '/' + (time.getMonth()+1) + '/' + time.getDate();
}
function changeSearchDefType (v) {
GM_setValue('searchDefType',v);
searchDefType = v;
}
function showSettings () {
Swal.fire({
title: '稿件搜索栏设置',
html:
`
设置将实时保存
`,
allowEscapeKey: false,
allowEnterKey: false,
allowOutsideClick: false,
didOpen: function () {
//导入默认配置
if (GM_getValue('searchDefType') == 1) {
document.querySelector("#yx_search_settings_defArticle").checked = true
} else {
document.querySelector("#yx_search_settings_defVideo").checked = true
};
document.querySelector("#yx_search_settings_showCountForSPage").value = count;
//实现按钮效果
document.querySelector("#yx_search_settings_defVideo").addEventListener('click',function(){
changeSearchDefType(0);
});
document.querySelector("#yx_search_settings_defArticle").addEventListener('click',function(){
changeSearchDefType(1);
});
document.querySelector("#yx_search_settings_showCountForSPage").addEventListener('keyup',function(){
let text = document.querySelector("#yx_search_settings_showCountForSPage").value;
text = text.replace(/[^\d]/g,'');
let num = Number(text);
num = Math.floor(num);
if (!num || text.includes('.')) {
alert('输入了非法字符\n(只能输入数字,不可输入小数点)');
document.querySelector("#yx_search_settings_showCountForSPage").value = '';
return;
};
if (num < 1) {
alert('数量区间在1-99');
document.querySelector("#yx_search_settings_showCountForSPage").value = '1';
};
count = num;
GM_setValue('showSearchCount',num);
});
},
})
}
function init () {
let tagsDiv = document.querySelector("ul.tags");
let n = document.createElement('li');
tagsDiv.insertBefore(n,tagsDiv.lastElementChild)
n.outerHTML = `搜索结果0`;
let contentDiv = document.querySelector("div.ac-space-contribute-list");
let n1 = document.createElement('div');
n1.setAttribute('data-index','yx_search');
n1.setAttribute('id','yx_search_main');
n1.setAttribute('class','tag-content');
contentDiv.appendChild(n1);
let contributeDiv;
document.querySelectorAll("#ac-space > div.wp > div.tab-content").forEach(function(v){
if (v.getAttribute('tab-index') == 'contribute') {
contributeDiv = v;
}
})
let n2 = document.createElement('div');
contributeDiv.insertBefore(n2,contributeDiv.firstChild);
n2.outerHTML = ``;
document.querySelector("#yx_search_keyWordInput").addEventListener('keypress',function(e){
if (e.keyCode == 13) {
if (searchDefType == 0) {//检索视频
search(document.querySelector("#yx_search_keyWordInput").value);
} else {//检索文章
search(document.querySelector("#yx_search_keyWordInput").value,0,3);
}
}
})
document.querySelector("#yx_searchBtn_Video").addEventListener('click',function(){
search(document.querySelector("#yx_search_keyWordInput").value);
});
document.querySelector("#yx_searchBtn_Article").addEventListener('click',function(){
search(document.querySelector("#yx_search_keyWordInput").value,0,3);
});
document.querySelector("#yx_search_settings").addEventListener('click',function(){
showSettings();
})
}
function xhrAsync(method,url,data,headers) {//发出请求
if (!data) {
data = null;
};
if (!headers) {
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
};
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: method,
url: url,
data: data,
headers: headers,
onload: resolve
});
});
}
function delayAsync(time) {//超时返回
return new Promise(resolve => {
setTimeout(resolve, time);
});
}
async function gm_xhr(method,url,data,headers) {
console.log("发起请求…");
return xhrAsync(method,url,data,headers).then(response => {//返回xhr请求结果
if (response.responseText == "未响应" || response.responseText.includes("ERRO")) {
return null;
} else {//正常获得返回数据
console.log('获得数据…');
return response;
}
});
}
window.onload = function() {
init();
}