// ==UserScript==
// @name 喵呜简易辅助
// @version 2.3.1
// @description 喵呜辅助
// @author Ming
// @match https://meows.com.cn/wp-admin/post-new.php
// @match http://meows.com.cn/wp-admin/post-new.php
// @match https://bgm.tv/subject/*
// @match https://bgm.tv/subject_search/*
// @icon https://lain.bgm.tv/pic/user/s/icon.jpg
// @run-at document-end
// @require https://cdn.jsdelivr.net/npm/sweetalert2@11
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @grant GM_setClipboard
// @grant GM_addStyle
// @license GPL
// @namespace https://gf.qytechs.cn/users/890367
// ==/UserScript==
/*
更新日志:
--- 2.3 (2022.3.24)
------ 1. 新增设置选项:在新标签页打开搜索结果
------ 2. 新增设置选项:粘贴时直接应用摘要和标签
------ 3. 优化设置的文本提示
--- 2.2 (2022.3.23)
------ 1. 简化搜索页
------ 2. 增加搜索页的隐藏/显示按钮
------ 3. 优化部分代码
------ 4. 美化发帖页面
------ 5. 在编辑器底部打开时详情页自动复制
------ 6. 在编辑器底部打开时若只有一个搜索结果直接跳转
------ 7. 可以同时应用摘要和标签(设置中开启)
--- 2.1 (2022.3.22)
------ 1. 现在无需打开新网页了,在编辑器底部即可复制模板
------ 2. 优化了对标题的识别
------ 3. 修复:无中文名时标题错误的问题
------ 4. 修复其他小Bug
*/
var url = window.location.href
if (url.search('meows.com.cn') != -1)
{
GM_addStyle('#ed_toolbar,#categorydiv,#tagsdiv-post_tag,#submitdiv,#major-publishing-actions,#formatdiv,#postexcerpt,#postimagediv{border-radius: 5px}')
GM_addStyle('#post-status-info,#category-all{border-bottom-left-radius: 5px;border-bottom-right-radius: 5px}')
GM_addStyle('#wp-content-editor-container{border-top-left-radius: 5px}')
GM_addStyle('.update-nag.notice.notice-warning.inline,#contextual-help-link-wrap{display: none}')
var bgmIframe = document.createElement("iframe")
bgmIframe.style.cssText = 'height: 280px; width: 100%; margin-top: 15px; border-radius: 5px; box-shadow: rgb(170, 170, 170) 0px 0px 3px; display: none;'
bgmIframe.id = "bgmframe"
document.querySelector("#postdivrich").append(bgmIframe)
var write = document.querySelector('.wp-header-end')
var hideIframeBtn = document.createElement("button")
var isIframeHidden = true
hideIframeBtn.innerText = "隐藏搜索页"
hideIframeBtn.style.cssText = 'font-size: 14px; margin-top: 10px; margin-left: 10px; display: none;'
hideIframeBtn.className = "button"
hideIframeBtn.onclick = function()
{
if (isIframeHidden)
{
hideIframeBtn.innerText = "隐藏搜索页"
$("#bgmframe").fadeIn(250)
}
else
{
hideIframeBtn.innerText = "显示搜索页"
$("#bgmframe").fadeOut(250)
}
isIframeHidden = !isIframeHidden
}
//添加模板按钮
var templateBtn = document.createElement("button")
templateBtn.innerText = "模板"
templateBtn.className = "button"
templateBtn.style.cssText = 'font-size: 14px; margin-top: 10px; margin-left: 2px'
write.parentElement.insertBefore(templateBtn, write)
templateBtn.onclick = function(){templateClick()} //按钮点击事件
//设置按钮
var settingsBtn = document.createElement("button")
settingsBtn.innerText = "设置"
settingsBtn.style.cssText = 'font-size: 14px; margin-left: 10px; margin-top: 10px;'
settingsBtn.className = "button"
var settingsBg = document.createElement("div")
settingsBg.style.cssText = 'position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.4); z-index: 9998; backdrop-filter: blur(2px); display: none'
settingsBg.id = 'jsSettingsBg'
$('body').append(settingsBg)
var settingsDiv = document.createElement("div")
settingsDiv.style.cssText = 'position: fixed; left: 25%; top: 25%; background: rgb(250, 250, 250); width: 50%; height: 50%; border-radius: 16px; z-index: 9999; box-shadow: rgb(170, 170, 170) 0px 0px 20px; font-size: 26px; display: none'
settingsDiv.id = 'jsSettings'
$('body').append(settingsDiv)
var settingsTitle = document.createElement("center")
settingsTitle.innerText = '设置'
settingsTitle.id = 'settingsTitle'
settingsTitle.style.cssText = 'margin-top: 20px;'
$('#jsSettings').append(settingsTitle)
settingsDiv.id = 'jsSettings'
var settingsList = document.createElement("ul")
settingsList.id = 'settingsList'
settingsList.style.fontSize = '20px'
settingsList.style.marginTop = '28px'
$('#settingsTitle').append(settingsList)
var settingsOpt1 = document.createElement("li")
settingsOpt1.style.marginTop = '11px'
$('#settingsList').append(settingsOpt1)
var SettingsOpt1Title = document.createElement("span")
SettingsOpt1Title.innerText = '显示“同时应用摘要和标签”按钮'
$('#settingsList li:nth-of-type(1)').append(SettingsOpt1Title)
var SettingsOpt1Button = document.createElement("button")
GM_addStyle('#settingsList li:nth-of-type(1) button{margin-left: 15px;font-size: 16px}')
if (window.localStorage.showBtns == 'true') SettingsOpt1Button.innerText = '点击关闭'
else SettingsOpt1Button.innerText = '点击开启'
SettingsOpt1Button.onclick = function(){
if(window.localStorage.showBtns == 'true')
{
window.localStorage.showBtns = 'false'
SettingsOpt1Button.innerText = '点击开启'
smryAndTagsBtn.style.display = 'none'
}
else
{
window.localStorage.showBtns = 'true'
SettingsOpt1Button.innerText = '点击关闭'
smryAndTagsBtn.style.display = 'inline'
}
}
$('#settingsList li:nth-of-type(1)').append(SettingsOpt1Button)
var settingsOpt2 = document.createElement("li")
settingsOpt2.style.marginTop = '11px'
$('#settingsList').append(settingsOpt2)
var SettingsOpt2Title = document.createElement("span")
SettingsOpt2Title.innerText = '在新标签页打开搜索结果'
$('#settingsList li:nth-of-type(2)').append(SettingsOpt2Title)
var SettingsOpt2Button = document.createElement("button")
GM_addStyle('#settingsList li:nth-of-type(2) button{margin-left: 15px;font-size: 16px}')
if (window.localStorage.showSearchResultInNewTab == 'true') SettingsOpt2Button.innerText = '点击关闭'
else SettingsOpt2Button.innerText = '点击开启'
SettingsOpt2Button.onclick = function(){
if (window.localStorage.showSearchResultInNewTab == 'true')
{
window.localStorage.showSearchResultInNewTab = 'false'
SettingsOpt2Button.innerText = '点击开启'
if (bgmIframe.src != '') hideIframeBtn.style.display = 'inline'
}
else
{
window.localStorage.showSearchResultInNewTab = 'true'
SettingsOpt2Button.innerText = '点击关闭'
$("#bgmframe").fadeOut(250)
hideIframeBtn.style.display = 'none'
}
}
$('#settingsList li:nth-of-type(2)').append(SettingsOpt2Button)
var settingsOpt3 = document.createElement("li")
settingsOpt3.style.marginTop = '11px'
$('#settingsList').append(settingsOpt3)
var SettingsOpt3Title = document.createElement('span')
SettingsOpt3Title.innerText = '粘贴时直接应用摘要和标签'
$('#settingsList li:nth-of-type(3)').append(SettingsOpt3Title)
var SettingsOpt3Button = document.createElement("button")
GM_addStyle('#settingsList li:nth-of-type(3) button{margin-left: 15px;font-size: 16px}')
if(window.localStorage.pasteAndGetTmp == 'true') SettingsOpt3Button.innerText = '点击关闭'
else SettingsOpt3Button.innerText = '点击开启'
SettingsOpt3Button.onclick = function(){
if(window.localStorage.pasteAndGetTmp == 'true')
{
window.localStorage.pasteAndGetTmp = 'false'
SettingsOpt3Button.innerText = '点击开启'
}
else
{
window.localStorage.pasteAndGetTmp = 'true'
SettingsOpt3Button.innerText = '点击关闭'
}
}
$('#settingsList li:nth-of-type(3)').append(SettingsOpt3Button)
//console.log('[Settings] ShowButtons: ' + window.localStorage.showBtns)
settingsBtn.onclick = function()
{
$('#jsSettings').fadeIn(140)
$('#jsSettingsBg').fadeIn(140)
}
settingsBg.onclick = function()
{
$('#jsSettings').fadeOut(130)
$('#jsSettingsBg').fadeOut(130)
}
//根据内容自动添加标签
var tagBtn = document.querySelector('#link-post_tag')
tagBtn.className = 'button'
tagBtn.innerText = '从模板自动添加标签'
tagBtn.onclick = function(){getTagsFromTmp()}
//根据内容自动生成摘要,注意长度
document.querySelector("#postexcerpt .inside p").remove()
var smryBtn = document.createElement("button")
smryBtn.innerText = "从模板生成摘要"
smryBtn.className = "button"
write.parentElement.insertBefore(smryBtn, write)
smryBtn.style.cssText = 'font-size: 14px; margin-top: 10px; margin-left: 10px;'
smryBtn.onclick = function(){getSmryFromTmp()}
var smryAndTagsBtn = document.createElement("button")
smryAndTagsBtn.innerText = '同时生成摘要和标签'
smryAndTagsBtn.className = 'button'
write.parentElement.insertBefore(smryAndTagsBtn, write)
smryAndTagsBtn.style.cssText = 'font-size: 14px; margin-top: 10px; margin-left: 10px;'
smryAndTagsBtn.onclick = function(){getTagsFromTmp();getSmryFromTmp();}
if(window.localStorage.showBtns == 'false') smryAndTagsBtn.style.display = 'none'
smryBtn.parentElement.insertBefore(settingsBtn, smryBtn)
write.parentElement.insertBefore(hideIframeBtn, write)
//$('#title').keypress(function(event){if(event.which == 13) templateClick()})
document.addEventListener('paste', (ev) => {
ev.clipboardData.items[0].getAsString(text => {
//console.log(text)
if(window.localStorage.pasteAndGetTmp == 'true')
{
if(text.search('[infobox title="下载"]') != -1){
getTagsFromTmp()
getSmryFromTmp()
}
}
})
})
}
else if(url.search('from=meows') != -1)
{
GM_addStyle('#headerNeue2,#footer,#robot,#dock{display: none}')
if(url.search("/subject_search") != -1)
{
//改链接
for (var i = 1; i ; i++)
{
if (document.querySelector("#browserItemList li:nth-of-type(" + i + ")"))
{
document.querySelector("#browserItemList li:nth-of-type(" + i + ") a").href += "?from=meows"
document.querySelector("#browserItemList li:nth-of-type(" + i + ") div h3 a").href += "?from=meows"
}
else break
}
if(i == 1)
{
Toast.fire({icon: 'error', position: 'top-end', title: '搜索无结果', text: '请尝试更换关键词'})
}
else if(i == 2)
{
window.open(document.querySelector('#browserItemList li:nth-of-type(1) a').href, '_self')
}
for (var j = 1; j ; j++)
{
if (document.querySelector("#multipage div a:nth-of-type(" + j + ")"))
{
document.querySelector("#multipage div a:nth-of-type(" + j + ")").href += "?from=meows"
}
else break
}
document.querySelector("#columnSearchB").width = "80%"
document.querySelector("#columnSearchC").hidden = "true"
}
else if(url.search("bgm.tv/subject") != -1)
{
GM_addStyle('.chart_desc,panelInterestWrapper{display: none}')
document.querySelector(".subjectNav").hidden = "true"
document.querySelector("#subject_detail").style.width = "100%"
CreateBtn()
txt = ""
var cat=document.querySelector(".focus.chl").innerText
switch(cat)
{
case("动画"):
Btn.onclick = function() {ani()}
setTimeout(function(){ani()},150)
break
case("游戏"):
Btn.onclick = function() {game()}
setTimeout(function(){game()},150)
break
case("书籍"):
Btn.onclick = function() {game()}
setTimeout(function(){game()},150)
break
default: return
}
}
}
else if(url.search('bgm.tv/subject') != -1)
{
CreateBtn()
txt = ""
var cate=document.querySelector(".focus.chl").innerText
switch(cate)
{
case("动画"):
Btn.onclick = function() {ani()}
break
case("游戏"):
Btn.onclick = function() {game()}
break
case("书籍"):
Btn.onclick = function() {game()}
break
default: return
}
}
const Toast = Swal.mixin(
{
toast: true,
position: "top-end",
showConfirmButton: false,
timer: 2200,
timerProgressBar: true
})
var Btn, txt = ''
function templateClick(){
document.getElementById("post-format-0").click() //设置发帖形式
document.getElementById("category-tabs").click()
//根据标题搜索
var title = document.querySelector("#title").value
if (title == '')
{
Toast.fire({icon: "error", position: "bottom-end", title: "标题不能为空哦", text: "推荐标题格式:【分类】名称"})
return
}
var lend
if(title[0] == '[') lend = title.search(']')
else if(title[0] == '【') lend = title.search('】')
else lend = 0
var newURL
if (title.substring(1,lend).search('动漫') >= 0)
{
document.getElementById('in-category-1').click()
newURL = "https://bgm.tv/subject_search/" + title.substring(lend + 1) + "?cat=2&from=meows"
}
else if(title.substring(1,lend).search("游戏") >= 0)
{
document.getElementById("in-category-6").click()
newURL = "https://bgm.tv/subject_search/" + title.substring(lend + 1) + "?cat=4&from=meows"
}
else if(title.substring(1,lend).search("小说") >= 0)
{
document.getElementById("in-category-5").click()
newURL = "https://bgm.tv/subject_search/" + title.substring(lend + 1) + "?cat=1&from=meows"
}
else if(title.substring(1,lend).search("漫画") >= 0)
{
document.getElementById("in-category-4").click()
newURL = "https://bgm.tv/subject_search/" + title.substring(lend + 1) + "?cat=1&from=meows"
}
else newURL = "https://bgm.tv/subject_search/" + title.substring(lend) + "?from=meows"
if(window.localStorage.showSearchResultInNewTab == 'false')
{
bgmIframe.style.display = "inline"
hideIframeBtn.innerText = "隐藏搜索页"
isIframeHidden = false
hideIframeBtn.style.display = "inline"
bgmIframe.src = newURL
}
else window.open(newURL, '_blank')
}
function getTagsFromTmp()
{
var content = document.querySelector("#content").value
var starttag = content.indexOf('[infobox title="标签"]')
if (starttag == -1)
{
Toast.fire({icon: "error", position: "bottom-end", title: "在内容中未找到标签", text: "请检查模板"})
}
else
{
var endtag = content.lastIndexOf(" ")
var cnt = 0
var tagtxt = content.substring(starttag + 22, endtag + 1)
//console.log(tagtxt)
var tags = ""
for(var i = 0; i < tagtxt.length && tagtxt[i] != '\n'; i++)
{
if(tagtxt[i] == " ")
{
cnt++
if(cnt % 2)
{
document.querySelector("#new-tag-post_tag").value = tags
document.querySelector(".button.tagadd").click()
//console.log(tags)
}
tags = ""
}
else tags += tagtxt[i]
}
Toast.fire({icon: "success", position: "bottom-end", title: "应用标签成功", text: "共添加了" + parseInt(cnt / 2) + "个标签"})
}
}
function getSmryFromTmp()
{
var content = document.querySelector("#content").value
var startsmry = content.indexOf('[infobox title="简介"]')
if (startsmry == -1)
{
Toast.fire({icon: "error", position: "bottom-end", title: "在内容中未找到简介", text: "请检查模板"})
return
}
var endsmry = content.substring(startsmry + 22).indexOf("[")
var smry = content.substring(startsmry + 22, startsmry + 22 + endsmry - 2)
//console.log(smry)
if(isJapanese(smry))
{
Toast.fire({icon: "error", position: "bottom-end", title: "未能生成摘要", text: "检测到语言可能是日语"})
}
else
{
if(smry.length > 240){
document.querySelector("#excerpt").value = smry.substr(0,215) + "……"
Toast.fire({icon: "success", position: "bottom-end", title: "生成摘要成功", text: "内容过长已缩减"})
}
else{
document.querySelector("#excerpt").value = smry
Toast.fire({icon: "success", position: "bottom-end", title: "生成摘要成功"})
}
}
}
function CreateBtn()
{
var btnbg = document.querySelector(".nameSingle")
btnbg.className = "nameSingle swal2-actions"
btnbg.style.display = "block"
Btn = document.createElement("button")
Btn.className = "swal2-confirm swal2-styled"
Btn.innerText = "复制模板"
Btn.style.cssText = 'font-size: 16px; min-height: 35px; min-width: 100px; margin-left: 20px; margin-bottom: 10px; border-radius: 5px;'
btnbg.append(Btn)
}
function ani()
{
txt = ""
Pic()
Name()
Smry()
Tag()
Info()
DownloadAni()
GM_setClipboard(txt, 'text')
//bgBlur()
Toast.fire({icon: "success", title: "复制成功"})
}
function game()
{
txt = ""
Pic()
Name()
Smry()
Tag()
InfoAll()
Download()
GM_setClipboard(txt, 'text')
Toast.fire({icon: "success", title: "复制成功"})
}
function Pic()
{
if (document.querySelector(".thickbox.cover"))
{
txt += '<img class="aligncenter" src=" ' + document.querySelector(".thickbox.cover").href + ' "width="720">\n'
}
}
function Name()
{
var name1 = document.querySelector("#infobox li:nth-of-type(1)")
var name2 = document.querySelector(".nameSingle a")
if(name1.innerText.search("名") >= 0 && name2)
{
if(name1.innerText.substring(5) != name2.innerHTML)
{
txt += '<p style="text-align: center"><span style="font-size: 14pt"><strong>' + name1.innerText.substring(5) + ' / ' + name2.innerHTML + '</strong></span></p>\n'
}
else
{
txt += '<p style="text-align: center"><span style="font-size: 14pt"><strong>' + name2.innerHTML + '</strong></span></p>\n'
}
return
}
if(name2) txt += '<p style="text-align: center"><span style="font-size: 14pt"><strong>' + name2.innerHTML + '</strong></span></p>\n'
txt += '<p style="text-align: center"><span style="font-size: 14pt"><strong>' + name1?name1.innerText.substring(5):name2.innerHTML + '</strong></span></p>\n'
}
function Smry()
{
var smry = document.querySelector("#subject_summary")
if(smry)
{
txt += '[infobox title="简介"]\n\n' + smry.innerText + '\n\n[/infobox]\n\n'
}
}
function Tag()
{
var tag = document.querySelector(".subject_tag_section .inner")
if(!tag) return
var str = ""
for (var n = 1; n <= 8; n++)
{
if (document.querySelector(".inner .l:nth-of-type(" + n + ") span"))
{
var q = document.querySelector(".inner .l:nth-of-type(" + n + ") span").innerText
if (q != "漫改" && q != "轻改")
{
var tagi = document.querySelector(".inner .l:nth-of-type(" + n + ") span").innerText
str += tagi + " "
}
}else break
}
txt += '[infobox title="标签"]\n\n' + str + '\n\n[/infobox]\n\n'
}
function Info()
{
var str = ""
for (var i = 1; i < 50; i++)
{
if (document.querySelector("#infobox li:nth-of-type(" + i + ")"))
{
var tmp = document.querySelector("#infobox li:nth-of-type(" + i + ")").innerText + "\n\n"
if (tmp.search("中文名")=='0' || !tmp.search("别名") || !tmp.search("话数") || !tmp.search("原作") || !tmp.search("导演")
|| !tmp.search("动画制作") || !tmp.search("放送开始"))
{
str += tmp
}
else if (!tmp.search("官方网站") || !tmp.search("播放结束")) break
}
else break
}
str = str.replace( /: /g, ":")
txt += '[infobox title="详情"]\n\n' + str + '[/infobox]\n\n'
}
function InfoAll()
{
var str = ""
for (var i = 1; i < 50; i++)
{
if (document.querySelector("#infobox li:nth-of-type(" + i + ")"))
{
var tmp = document.querySelector("#infobox li:nth-of-type(" + i + ")").innerText + "\n\n"
str += tmp
} else break
}
str = str.replace( /: /g, ":")
txt += '[infobox title="详情"]\n\n' + str + '[/infobox]\n\n'
}
function DownloadAni()
{
txt += '[infobox title="下载"]\n\n'
txt += "<strong>【字幕组】</strong>\n\n"
txt += "合集\n\n"
txt += "[ypbtn]【网盘链接】[/ypbtn]"
txt += "\n\n[/infobox]"
}
function Download()
{
txt += '[infobox title="下载"]\n\n[ypbtn]【网盘链接】[/ypbtn]\n\n[/infobox]'
}
function isJapanese(temp)
{
if(/[^\u0800-\u4e00]/.test(temp)) return false
return true
}