原神玩家指示器

B站评论区自动标注原神玩家,依据是动态里是否有原神相关内容(0.6一些小的修改)

< Feedback on 原神玩家指示器

Review: Good - script works

§
Posted: 2022-09-11

自己改了改,我的代码可以通过关注查询成分了,但是会和通过动态查询的结果共同显示在一起,所以不是最优解:


(function () {
    'use strict';
    const unknown = new Set()
    const yuanyou = new Set()
    const no_yuanyou = new Set()
    const keyword = "原神" // 可以自行修改,如"#原神","明日方舟"
    const keyword1 = "#绝区零#"
    const keyword2 = "#崩坏3#"
    const keyword3 = "#米哈游#"
    const keyword4 = "互动抽奖 #原神#"
    const tag = " |原神玩家|"
    const tag2 = " |设置隐私|"
    const blog = 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?&host_mid='
    const follow = 'https://api.bilibili.com/x/relation/followings?vmid='
    const pageNumInHttp = "&pn="
    let pageNum = 1
    //页数取最大值(可设可不设)
    const pageSizeNum = 50
    const pageSize = '&ps=' + pageSizeNum
    //要检测的被关注账号id,该变量亦可用set实现
    const scan_follow = [27534330, 401742377]
    let is_yuanyou = false;
    const is_new = document.getElementsByClassName('item goback').length != 0 // 检测是不是新版

    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 (yuanyou.has(pid)) {
                    return
                } else if (no_yuanyou.has(pid)) {
                    // do nothing
                    return
                }
                unknown.add(pid)
                //console.log(pid)
                let blogurl = blog + pid
                //查询用户的关注列表
                let followurl = follow + pid + pageNumInHttp + pageNum + pageSize
                //创建关注者列表
                let followList = [];
                // 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) || st.includes(keyword1) || st.includes(keyword2) || st.includes(keyword3) || st.includes(keyword4)) {
                                c.append(tag)
                                yuanyou.add(pid)
                                is_yuanyou = true
                            } else {
                                no_yuanyou.add(pid)
                            }
                        } else {
                            console.log('失败')
                        }
                    },
                });
                //发送跨域请求
                GM_xmlhttpRequest({
                    method: "get",
                    url: followurl,
                    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) {
                        //console.log(is_yuanyou)
                        //转换为json格式方便判断
                        let st = JSON.parse(res.response)
                        let totalPage = 1
                        if (st.code == 0) {
                            //计算共有多少页,B站限制最多查询前250个关注
                            let totalPage = st.data.total / pageSizeNum > 5 ? 5 : Math.ceil(st.data.total / pageSizeNum);
                            //console.log('页数'+totalPage)
                            //将结果存入数组
                            followList = st.data.list
                            //判断身份
                            is_yuanyou = yuanyou.has(pid)
                            //console.log(yuanyou)
                            //遍历json数据
                            if (!is_yuanyou) {
                                for (let i = 0; i < scan_follow.length; i++) {
                                    for (let j = 0; j < followList.length; j++) {
                                        if (scan_follow[i] == followList[j].mid) {
                                            // console.log(followList[j].mid)
                                            c.append(tag)
                                            yuanyou.add(pid)
                                            is_yuanyou = true
                                            break
                                        }
                                    }
                                    if (is_yuanyou) {
                                        break
                                    }
                                }
                            }
                            if (!is_yuanyou) {
                                //向后翻页
                                for (let i = 2; i < totalPage; i++) {
                                    let temp_followurl = follow + pid + pageNumInHttp + i + pageSize
                                    GM_xmlhttpRequest({
                                        method: "get",
                                        url: temp_followurl,
                                        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) {
                                            let st = JSON.parse(res.response)
                                            if (st.code == 0) {
                                                //将结果存入数组
                                                followList = st.data.list
                                                //遍历json数据
                                                for (let i = 0; i < scan_follow.length; i++) {
                                                    for (let j = 0; j < followList.length; j++) {
                                                        if (scan_follow[i] == followList[j].mid) {
                                                            c.append(tag)
                                                            yuanyou.add(pid)
                                                            is_yuanyou = true
                                                            break
                                                        }
                                                    }
                                                    if (is_yuanyou) {
                                                        break
                                                    }
                                                }
                                            }
                                        }
                                    })
                                    if (is_yuanyou) {
                                        break
                                    }
                                }
                            }
                            if (!is_yuanyou) {
                                no_yuanyou.add(pid)
                            }
                            //console.log(followList)
                        } else {
                            c.append(tag2)
                            //console.log(pid + '设置了隐私')
                        }
                    },
                });
                //关注星瞳_offical送溜溜梅 关注星瞳_offical送溜溜梅 https://space.bilibili.com/401315430
            });
        }
    }, 4000)})();

Post reply

Sign in to post a reply.