// ==UserScript==
// @name 三相之力指示器&原神玩家纯度检测
// @namespace www.cber.ltd
// @version 0.3.2
// @description B站评论区自动标注三相玩家,依据是动态里是否有三相相关内容(基于原神指示器和原三相一些小的修改)及原神玩家纯度
// @author xulaupuz & nightswan & SnhAenIgseAl
// @match https://www.bilibili.com/video/*
// @match https://t.bilibili.com/*
// @match https://space.bilibili.com/*
// @icon https://static.hdslb.com/images/favicon.ico
// @connect bilibili.com
// @grant GM_xmlhttpRequest
// @license MIT
// @run-at document-end
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
const unknown = new Set()
//成分,可自定义
const nor = new Set()
const no_nor = new Set()
const cj = new Set()
const no_cj = new Set()
const yuanyou = new Set()
const no_yuanyou = new Set()
const zhouyou = new Set()
const no_zhouyou = new Set()
const nongyou = new Set()
const no_nongyou = new Set()
const yuanzhou = new Set()
const no_yuanzhou = new Set()
const yuannong = new Set()
const no_yuannong = new Set()
const nongzhou = new Set()
const no_nongzhou = new Set()
const yuanbeng = new Set()
const no_yuanbeng = new Set()
const sanxiang = new Set()
const no_sanxiang = new Set()
//关键词,可自定义
const keyword_cj = "互动抽奖"
const keyword_yuan = "原神"
const keyword_zhou = "明日方舟"
const keyword_nong = "王者荣耀"
//贴上标签,可自定义
const tag_nor = "【 普通丨纯良 】"
const tag_cj = "【 隐藏丨动态抽奖 】"
const tag_yuan = "【 稀有丨我超,原!】"
const tag_zhou = "【 稀有丨我超,粥!】"
const tag_nong = "【 稀有丨我超,农!】"
const tag_yuanzhou = "【 史诗丨原 & 粥!】"
const tag_yuannong = "【 史诗丨原 & 农!】"
const tag_zhounong = "【 史诗丨粥 & 农!】"
const tag_sanxiang = "【 传奇丨三相之力 】"
//原神玩家纯度标签
const tag_mxz_1 = "【 米学长丨认识Mihoyo 】"
const tag_mxz_2 = "【 米学长丨腾讯打压 】"
const tag_mxz_3 = "【 米学长丨黑暗降临 】"
const tag_mxz_4 = "【 米学长丨国产之光 】"
const blog = 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?&host_mid='
const is_new = document.getElementsByClassName('item goback').length != 0 // 检测是不是新版
//标签颜色,可自定义,默认为B站会员色
const tag_nor_Inner="" + tag_nor + ""
const tag_cj_Inner="" + tag_cj + ""
const tag_yuan_Inner="" + tag_yuan + ""
const tag_zhou_Inner="" + tag_zhou + ""
const tag_nong_Inner="" + tag_nong + ""
const tag_yuanzhou_Inner="" + tag_yuanzhou + ""
const tag_yuannong_Inner="" + tag_yuannong + ""
const tag_nongzhou_Inner="" + tag_zhounong + ""
const tag_sanxiang_Inner="" + tag_sanxiang + ""
const tag_mxz_1_Inner="" + tag_mxz_1 + ""
const tag_mxz_2_Inner="" + tag_mxz_2 + ""
const tag_mxz_3_Inner="" + tag_mxz_3 + ""
const tag_mxz_4_Inner="" + tag_mxz_4 + ""
const get_pid = (c) => {
if (is_new) {
return c.dataset['userId']
} else {
return c.children[0]['href'].replace(/[^\d]/g, "")
}
}
const get_comment_list = () => {
if (is_new) {
let lst = new Set()
for (let c of document.getElementsByClassName('user-name')) {
lst.add(c)
}
for (let c of document.getElementsByClassName('sub-user-name')) {
lst.add(c)
}
return lst
} else {
return document.getElementsByClassName('user')
}
}
console.log(is_new)
console.log("正常加载")
let jiance = setInterval(()=>{
let commentlist = get_comment_list()
if (commentlist.length != 0){
// clearInterval(jiance)
commentlist.forEach(c => {
let pid = get_pid(c)
//三相标签
if (sanxiang.has(pid)) {
if (c.textContent.includes(tag_sanxiang) === false) {
c.innerHTML += tag_sanxiang_Inner
yuan_weight()
}
return
} else if (no_sanxiang.has(pid)) {
// do nothing
return
}
//原农标签
if (yuannong.has(pid)) {
if (c.textContent.includes(tag_yuannong) === false) {
c.innerHTML += tag_yuannong_Inner
yuan_weight()
}
return
} else if (no_yuannong.has(pid)) {
// do nothing
return
}
//农粥标签
if (nongzhou.has(pid)) {
if (c.textContent.includes(tag_nongzhou) === false) {
c.innerHTML += tag_nongzhou_Inner
}
return
} else if (no_nongzhou.has(pid)) {
// do nothing
return
}
//原粥标签
if (yuanzhou.has(pid)) {
if (c.textContent.includes(tag_yuanzhou) === false) {
c.innerHTML += tag_yuanzhou_Inner
yuan_weight()
}
return
} else if (no_yuanzhou.has(pid)) {
// do nothing
return
}
//原友标签
if (yuanyou.has(pid)) {
if (c.textContent.includes(tag_yuan) === false) {
c.innerHTML += tag_yuan_Inner
yuan_weight()
}
return
} else if (no_yuanyou.has(pid)) {
// do nothing
return
}
//粥友标签
if (zhouyou.has(pid)) {
if (c.textContent.includes(tag_zhou) === false) {
c.innerHTML += tag_zhou_Inner
}
return
} else if (no_zhouyou.has(pid)) {
// do nothing
return
}
//农友标签
if (nongyou.has(pid)) {
if (c.textContent.includes(tag_nong) === false) {
c.innerHTML += tag_nong_Inner
}
return
} else if (no_nongyou.has(pid)) {
// do nothing
return
}
//抽奖标签
if (cj.has(pid)) {
if (c.textContent.includes(tag_cj) === false) {
c.innerHTML += tag_cj_Inner
}
return
} else if (no_cj.has(pid)) {
// do nothing
return
}
//纯良标签
if (nor.has(pid)) {
if (c.textContent.includes(tag_nor) === false) {
c.innerHTML += tag_nor_Inner
}
return
} else if (no_nor.has(pid)) {
// do nothing
return
}
function getStrCount(scrstr, armstr) {
var count=0;
while(scrstr.indexOf(armstr) != -1 ) {
scrstr = scrstr.replace(armstr,"")
count++;
}
return count;
}
function yuan_weight() {
if (getStrCount(c, keyword_yuan) >= 1 && getStrCount(c, keyword_yuan) <= 3) {
c.innerHTML += tag_mxz_1_Inner
} else if (getStrCount(c, keyword_yuan) > 3 && getStrCount(c, keyword_yuan) <= 5) {
c.innerHTML += tag_mxz_2_Inner
} else if (getStrCount(c, keyword_yuan) > 5 && getStrCount(c, keyword_yuan) <= 10) {
c.innerHTML += tag_mxz_3_Inner
} else {
c.innerHTML += tag_mxz_4_Inner
}
}
unknown.add(pid)
//console.log(pid)
let blogurl = blog + pid
// let xhr = new XMLHttpRequest()
GM_xmlhttpRequest({
method: "get",
url: blogurl,
data: '',
headers: {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
},
onload: function(res){
if(res.status === 200){
//console.log('成功')
let st = JSON.stringify(JSON.parse(res.response).data)
unknown.delete(pid)
//三相标签
if (st.includes(keyword_nong) && st.includes(keyword_yuan) && st.includes(keyword_zhou)){
c.innerHTML += tag_sanxiang_Inner
sanxiang.add(pid)
yuan_weight()
return
} else {
no_sanxiang.add(pid)
}
//原粥标签
if (st.includes(keyword_yuan) && st.includes(keyword_zhou)){
c.innerHTML += tag_yuanzhou_Inner
yuanzhou.add(pid)
yuan_weight()
return
} else {
no_yuanzhou.add(pid)
}
//原农标签
if (st.includes(keyword_yuan) && st.includes(keyword_nong)){
c.innerHTML += tag_yuannong_Inner
yuannong.add(pid)
yuan_weight()
return
} else {
no_yuannong.add(pid)
}
//粥农标签
if (st.includes(keyword_zhou) && st.includes(keyword_nong)){
c.innerHTML += tag_nongzhou_Inner
nongzhou.add(pid)
return
} else {
no_nongzhou.add(pid)
}
//原神标签
if (st.includes(keyword_yuan)){
c.innerHTML += tag_yuan_Inner
yuanyou.add(pid)
yuan_weight()
return
} else {
no_yuanyou.add(pid)
}
//方舟标签
if (st.includes(keyword_zhou)){
c.innerHTML += tag_zhou_Inner
zhouyou.add(pid)
return
} else {
no_zhouyou.add(pid)
}
//农药标签
if (st.includes(keyword_nong)){
c.innerHTML += tag_nong_Inner
nongyou.add(pid)
return
} else {
no_nongyou.add(pid)
}
//隐藏标签,有动态抽奖不再纯良
if (st.includes(keyword_cj)){
c.innerHTML += tag_cj_Inner
cj.add(pid)
} else {
//纯良标签
no_cj.add(pid)
c.innerHTML += tag_nor_Inner
nor.add(pid)
}
function getStrCount(scrstr, armstr) {
var count=0;
while(scrstr.indexOf(armstr) != -1 ) {
scrstr = scrstr.replace(armstr,"")
count++;
}
return count;
}
function yuan_weight() {
if (getStrCount(st, keyword_yuan) >= 1 && getStrCount(st, keyword_yuan) <= 3) {
c.innerHTML += tag_mxz_1_Inner
} else if (getStrCount(st, keyword_yuan) > 3 && getStrCount(st, keyword_yuan) <= 5) {
c.innerHTML += tag_mxz_2_Inner
} else if (getStrCount(st, keyword_yuan) > 5 && getStrCount(st, keyword_yuan) <= 10) {
c.innerHTML += tag_mxz_3_Inner
} else {
c.innerHTML += tag_mxz_4_Inner
}
}
}else{
console.log('失败')
console.log(res)
}
},
});
});
}
}, 4000)
})();