Greasy Fork 支持简体中文。

B站大杂烩成分指示器(极简版)

自动标注成分,原:A畜3畜野狗大杂烩指示器·改,极简版,无倾向性(太nt除外eg伪史论者),侵删

目前為 2024-06-28 提交的版本,檢視 最新版本

// ==UserScript==
// @name         B站大杂烩成分指示器(极简版)
// @name:en      Bilibili_Agent_Simple
// @version      v1.0.12
// @update       cake
// @author       trychen,miayoshi,TenSin,klxf
// @license      GPLv3
// @description  自动标注成分,原:A畜3畜野狗大杂烩指示器·改,极简版,无倾向性(太nt除外eg伪史论者),侵删
// @description:en  Automatic labeling of ingredients, original: A livestock 3 animal wild dog hodgepodge indicator change, simply, no tendency,  if invasion else deletion
// @match        https://www.bilibili.com/video/*
// @match        https://www.bilibili.com/read/*
// @match        https://www.bilibili.com/opus/*
// @match        https://t.bilibili.com/*
// @match        https://space.bilibili.com/*
// @match        https://www.bilibili.com/judgement/*
// @icon          https://static.hdslb.com/images/favicon.ico
// @match        https://www.bilibili.com/v/topic/detail/*
// @icon         https://static.hdslb.com/images/favicon.ico
// @connect      bilibili.com
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js
// @namespace https://greasyfork.org/users/1110013

// ==/UserScript==

const blog = 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?&host_mid='
const followapi = 'https://api.bilibili.com/x/relation/followings?vmid='
const medalapi = 'https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall?target_id='

$(function () {
    'use strict';
    const default_checkers = [
        {
			displayName: "抽奖",
			displayIcon: "🎁",
			keywords: ["互动抽奖", "转发本条动态"],
		}
		,

        {
            displayName: "",
            displayIcon: "@600w_600h_1c_1s.webp",
            keywords: [""],
            followings: []
        }
        ,

        {
            displayName: "地平论者",//你没事吧
            displayIcon: "https://i0.hdslb.com/bfs/face/051056a87a1cbdc56cce513714aa2a3ad6490c98.jpg@600w_600h_1c_1s.webp",
            keywords: ["地平"],
            followings: [
			    563479941,//天圆地方地球骗局
				1030963504,//平坦的陆地
				//待续
				]
        }
        ,
        {
            displayName: "伪史论者",  //难绷,直接一滴血原则
            displayIcon: "https://shufa.supfree.net/k/104074.gif",
            keywords: ["神都俗人","周楚山","何新","河清"],
            followings: [
				167541240,//神都俗人
				351610385,//周楚山
				386840843,//阿波罗登月造假,原名:数学名师汇
				310877780,//何新老家伙——伪史论亚圣
				1761823456,//河清
				387542456,//驰豹_
				1543803026,//云影方寸
				2123823309,//老Q
				3546387329321268,//栖梧辨史
				3546597122116354,//老丁说文     
				3493091193391214,//孔言史语
				385959641,//历史集结号
				634980447,//我所认知的历史
				2031292544,//老雪文史
				1162474667,//程咬金说明朝故事
				5262093,//时空盒
				49623845,//范宇平LALIN先生
				668180012,//东哥说文史
				1604012612,//生民无疆
				30929648,//碎尘凡星
				2059646713,//朱恪远
				//待续
			]
        }
        ,
        {
            displayName: "阿甘",
            displayIcon: "https://i1.hdslb.com/bfs/face/787bec68454f36ebfdc78bf828a88cfdee98df2e.jpg@600w_600h_1c_1s.webp",
            keywords: ["军情阿甘"],
            followings: [3546620310326128]
        }
        ,
        {
            displayName: "赛雷",
            displayIcon: "https://i1.hdslb.com/bfs/face/4eb764b8c6afc48ad1e7aaf84b0f58db3d4dbb3f.jpg@600w_600h_1c_1s.webp",
            keywords: ["赛雷"],
            followings: [26108626,151482404,510362725]
        }
        ,
        {
            displayName: "小Q",
            displayIcon: "https://i0.hdslb.com/bfs/face/3b59fb5c73d1de935acab4447f3f000e1aa783f1.jpg@600w_600h_1c_1s.webp",
            keywords: ["小Q"],
            followings: [546189]
        }
        ,
        {
            displayName: "荷兰人",
            displayIcon: "https://i0.hdslb.com/bfs/face/0339cce3092b22d20f6cd33edc041459fd86d9fe.jpg@600w_600h_1c_1s.webp",
            keywords: ["天空飞翔荷兰人","天空的荷兰人"],
            followings: [401861362,372383049]
        }
        ,
        {
            displayName: "新华社",
            displayIcon: "https://i1.hdslb.com/bfs/face/396b93a7f619882afa711879dbf2cb98a40e7367.jpg@600w_600h_1c_1s.webp",
            keywords: ["新华网","新华社"],
            followings: [473837611]
        }
        ,
        {
            displayName: "胡律师",
            displayIcon: "https://i2.hdslb.com/bfs/face/88424e8eaeb3466fc7cf93429651f59a70c38b4d.jpg@600w_600h_1c_1s.webp",
            keywords: ["胡律师"],
            followings: [8440892]
        }
        ,
        {
            displayName: "二流媒体",
            displayIcon: "https://i2.hdslb.com/bfs/face/19a041ba0e78ed43b7a3eab35edfc998eaa7db8e.jpg@600w_600h_1c_1s.webp",
            keywords: ["人民日报","人民网"],
            followings: [1131457022,33775467]
        }
        ,
        {
            displayName: "电哥",
            displayIcon: "https://i1.hdslb.com/bfs/face/c277af542ef1ad8657dab6cff68c2744a842724c.jpg@600w_600h_1c_1s.webp",
            keywords: ["电哥"],
            followings: [2053632613,1526687911,436361773]
        }
        ,
		{
            displayName: "央视",
            displayIcon: "https://i1.hdslb.com/bfs/face/2dc9c34444ba9f8e891fdc98e6c331fa3c02d127.jpg@600w_600h_1c_1s.webp",
            keywords: ["央视"],
            followings: [456664753,222103174,433587902,451320374]
        }
		,
		{
            displayName: "黑神话",
            displayIcon: "https://i1.hdslb.com/bfs/face/5fdac7d9820175f5f0ae1b6c33968bb8f64cc82c.jpg@240w_240h_1c_1s.webp",
            keywords: ["黑神话"],
            followings: [642389251]
        }
		,
		{
            displayName: "老猫",
            displayIcon: "折腾的老猫",
            keywords: ["https://i2.hdslb.com/bfs/face/7c943a916e46c53170426f286c33bb3a116a483c.jpg@240w_240h_1c_1s.webp"],
            followings: [1175509358]
        }
		,
		{
            displayName: "七哥",
            displayIcon: "https://i1.hdslb.com/bfs/face/d862ad470125a518ddbaab50d88ffb8332de9e3d.jpg@240w_240h_1c_1s.webp",
            keywords: ["七哥"],
            followings: [323397658,3546588567833451,3546688025266313,626116668,1908575732,650014862]
        }
		,
		{
            displayName: "户晨风",
            displayIcon: "https://i1.hdslb.com/bfs/face/06f1ead2473e5af54d4f6ae35ce2baf825d31414.jpg@240w_240h_1c_1s.webp",
            keywords: ["戶晨风","户晨风"],
            followings: [9047380,49869761]
        }
		,
		{
            displayName: "峰哥",
            displayIcon: "https://i2.hdslb.com/bfs/face/ae439693d6fd79a55b1b5f935ed6474ae6fba35b.jpg@240w_240h_1c_1s.webp",
            keywords: ["峰哥"],
            followings: [35847683,476655153,322296103]
        }
		,
		{
            displayName: "胜利文绉绉",
            displayIcon: "https://i0.hdslb.com/bfs/face/2235f4376c1cc61919bbf7972a8236b59ff50409.jpg@240w_240h_1c_1s.webp",
            keywords: ["胜利文绉绉"],
            followings: [12300996]
        }
		,
		{
            displayName: "环球",
            displayIcon: "https://i0.hdslb.com/bfs/face/c8a2502a53adf1b6d309171e15c167e73beaad44.jpg@240w_240h_1c_1s.webp",
            keywords: ["环球时报","环球网"],
            followings: [10303206,483787858]
        }
		,
		{
            displayName: "夹头",
            displayIcon: "https://i2.hdslb.com/bfs/face/0b542ee82fa15dd80a722053dfd679358d793a09.jpg@240w_240h_1c_1s.webp",
            keywords: ["司马南"],
            followings: [612492134]
        }
		,
		{
            displayName: "赵灵敏",
            displayIcon: "https://i1.hdslb.com/bfs/face/6d74df8b444250f534ff75068189d78bb246ed87.jpg@240w_240h_1c_1s.webp",
            keywords: ["赵灵敏"],
            followings: [488066419]
        }
		,
		{
            displayName: "极客小冷",
            displayIcon: "https://i0.hdslb.com/bfs/face/00c0713a09ded3f5e319ad8da2c964f784b16b8d.jpg@240w_240h_1c_1s.webp",
            keywords: ["极客小冷"],
            followings: [316410045]
        }
		,
		{
            displayName: "心医",
            displayIcon: "https://i1.hdslb.com/bfs/face/560914dab69fde91b1f493deab08431395cde9db.jpg@600w_600h_1c_1s.webp",
            keywords: ["心医","林霖"],
            followings: [1482025194,492808243,1671690277,3546613272284121,385421054,3494349717375890,3546610338367633]  //分身好多
        }
		,
		{
            displayName: "素材库",
            displayIcon: "https://i0.hdslb.com/bfs/face/7bbf5c68622f61a0d33d4beebaa9bbdbfccf235d.jpg@600w_600h_1c_1s.webp",
            keywords: ["虫类素材库"],
            followings: [1456398987]
        }
		,
		{
            displayName: "章北海",
            displayIcon: "https://i1.hdslb.com/bfs/face/645f6e958a0b6bf8d34a1ae396302cf112dd1a3c.jpg@600w_600h_1c_1s.webp",
            keywords: ["章北海official"],
            followings: [570064]
        }
		,
		{
            displayName: "MHY",
            displayIcon: "https://i2.hdslb.com/bfs/face/f7e24cfec824e0aaf67fdd62c960c13026768f70.jpg@600w_600h_1c_1s.webp",
            keywords: ["MHYY"],
            followings: [199676483]
        }
		,
		{
            displayName: "水东",
            displayIcon: "https://i0.hdslb.com/bfs/face/6d4403558d95515ca3e95e296b0648c7931bef32.jpg@600w_600h_1c_1s.webp",
            keywords: ["水东揭秘"],
            followings: [486404538]
        }
		,
        {
            displayName: "异化",
            displayIcon: "https://i1.hdslb.com/bfs/face/f586d7a72b4e1d891bd46abdb2614ead33b71435.jpg@600w_600h_1c_1s.webp",
            keywords: ["灵笼","艺画"],
            followings: [3494361474009190,14328316]
        }
        ,
        {
            displayName: "HOLO",
            displayIcon: "https://i1.hdslb.com/bfs/face/52f316ed4b89f48f3fea7cc165585c04c32f32df.jpg@600w_600h_1c_1s.webp",
            keywords: ["holo"],
            followings: [286700005]
        }
        ,
        {
            displayName: "饭-wyb",
            displayIcon: "https://i0.hdslb.com/bfs/face/3621591c438b83798cf32287837a10f16c1eb5a6.jpg@600w_600h_1c_1s.webp",
            keywords: ["YIBO-OFFICIAL"],
            followings: [688694784]
        }
        ,
        {
            displayName: "饭-exo",
            displayIcon: "https://i0.hdslb.com/bfs/face/b77988a74a83ade540857045781ad9485685554d.jpg@600w_600h_1c_1s.webp",
            keywords: ["EXO"],
            followings: [3493262484572295]
        }
        ,
        {
            displayName: "饭-zyx",
            displayIcon: "https://i1.hdslb.com/bfs/face/6fda05166cc55cdeed94475e2a944427f64ec7f4.jpg@600w_600h_1c_1s.webp",
            keywords: ["张艺兴"],
            followings: [161158015]
        }
        ,
        {
            displayName: "未明子",
            displayIcon: "https://i0.hdslb.com/bfs/face/71ad8ea7787e8acc85bd2a70b554150c35fc1e57.jpg@600w_600h_1c_1s.webp",
            keywords: ["未明子"],
            followings: [23191782]
        }
        ,
        {
            displayName: "蜗牛柯基",
            displayIcon: "https://i1.hdslb.com/bfs/face/939bc84b0ff28599c31e5b274ce70121268649b4.jpg@600w_600h_1c_1s.webp",
            keywords: ["蜗牛柯基weibo"],
            followings: [153890218]
        }
        ,
        {
            displayName: "观察者",
            displayIcon: "https://i0.hdslb.com/bfs/face/3d0dba3789065512f5217387ab135a093ae10c45.jpg@600w_600h_1c_1s.webp",
            keywords: ["观察者网","观视频工作室"],
            followings: [10330740,54992199]
        }
        ,
        {
            displayName: "共青团",
            displayIcon: "https://i1.hdslb.com/bfs/face/05725218e6cd8d0916da4f27ab56ca0957545c48.jpg@600w_600h_1c_1s.webp",
            keywords: ["共青团"],
            followings: [20165629]
        }
        ,
        {
            displayName: "孤烟暮蝉",
            displayIcon: "https://i2.hdslb.com/bfs/face/b6ef567cc83c4ab09b7682c729e85a145aa0b4e2.jpg@600w_600h_1c_1s.webp",
            keywords: ["孤烟暮蝉"],
            followings: [19248926]
        }
        ,
        {
            displayName: "白话频道",
            displayIcon: "https://i0.hdslb.com/bfs/face/59156298fd2f29265cb6496a6208ca3c4c8ee89a.jpg@600w_600h_1c_1s.webp",
            keywords: ["白话频道"],
            followings: [92241267]
        }
        ,
		{
            displayName: "阿吞啊",
            displayIcon: "https://i0.hdslb.com/bfs/face/3f4964d1015329a1a548be584a0261079045c7c5.jpg@600w_600h_1c_1s.webp",
            keywords: ["阿吞啊"],
            followings: [622986240]
        }
        ,
		{
            displayName: "俄罗斯",
            displayIcon: "https://i1.hdslb.com/bfs/face/d1a491998bc767ccc5cd914f336e83fb6fed3f82.jpg@600w_600h_1c_1s.webp",
            keywords: ["RT今日俄罗斯","俄罗斯卫星通讯社官网","RT娱乐"],
            followings: [501247999,1156910727,493270535539606,3493081961728612]
        }
        ,
		{
            displayName: "杰哥",
            displayIcon: "https://i1.hdslb.com/bfs/face/1799d75c67b9d1e447973610df9842a3fc5562ea.jpg@600w_600h_1c_1s.webp",
            keywords: ["鹏城杰森"],
            followings: [664086886]
        }
		,
			{
        displayName: "欧肯",
        displayIcon: "https://i2.hdslb.com/bfs/face/6333b48c19de82716cbfe9ab4b4dcef4f48f006d.jpg@600w_600h_1c_1s.webp",
        keywords: ["欧肯视线"],
        followings: [6859997]
        }
        ,
		{
            displayName: "尼禄",
            displayIcon: "https://i2.hdslb.com/bfs/face/5423011a2b2547003fe46d354e82f35c32e5d95e.jpg@600w_600h_1c_1s.webp",
            keywords: ["神皇尼禄","装甲尼禄","装甲NERO","傲慢尼禄"],
            followings: [335504294,1058667278,368081298,3546687668750650]
        }
        ,
		{
            displayName: "马超",
            displayIcon: "https://i1.hdslb.com/bfs/face/1c56737dfc0deffffc31c78e0cefb0c3ecf7e000.jpg@600w_600h_1c_1s.webp",
            keywords: ["马督工","小黛晨读","睡前消息"],
            followings: [316568752,1556651916,59104725,64219557]
        }
        ,
		{
            displayName: "¥3000",
            displayIcon: "https://i0.hdslb.com/bfs/face/8bb0b1ea83b892a1f396bd75849d60b61a49273f.jpg@600w_600h_1c_1s.webp",
            keywords: ["陈平眉山论剑"],
            followings: [526559715]
        }
        ,
				{
            displayName: "火星方阵",
            displayIcon: "https://i1.hdslb.com/bfs/face/8699bb487e1768f3990688eec7231ea7318d7bd2.jpg@600w_600h_1c_1s.webp",
            keywords: ["火星方阵"],
            followings: [649022917]
        }
        ,
        {
            displayName: "磊哥",
            displayIcon: "https://i1.hdslb.com/bfs/face/4897372932374c750fd3999e933885af1a1d0a93.jpg@600w_600h_1c_1s.webp",
            keywords: ["磊哥聊政经"],
            followings: [303981427]
        }
        ,
        {
            displayName: "金灿荣",
            displayIcon: "https://i2.hdslb.com/bfs/face/0bf6685ac1ef31832fe141416a98a4897f716195.jpg@600w_600h_1c_1s.webp",
            keywords: ["金灿荣"],
            followings: [1488338933]
        }
        ,
        {
            displayName: "圆脸",
            displayIcon: "https://i2.hdslb.com/bfs/face/f8f0fc4114bb06a87481abe12faa006a383cbe6d.jpg@600w_600h_1c_1s.webp",
            keywords: ["波士顿圆脸"],
            followings: [346563107]
        }
        ,
        {
            displayName: "王骁",
            displayIcon: "https://i0.hdslb.com/bfs/face/4b7f791af4dec3b9017c6fd9993dcd2087da3159.jpg@600w_600h_1c_1s.webp",
            keywords: ["王骁"],
            followings: [52165725,1140672573]
        }
        ,
        {
            displayName: "Lex",
            displayIcon: "https://i2.hdslb.com/bfs/face/27e06996840a7cb3ee0fee52f6b4616cd6567def.jpg@600w_600h_1c_1s.webp",
            keywords: ["LexBurner"],
            followings: [777536]
        }
        ,
        {
            displayName: "沈逸",
            displayIcon: "https://i2.hdslb.com/bfs/face/14633072e31671d939bd49bf2c2077f64929f9e8.jpg@600w_600h_1c_1s.webp",
            keywords: ["沈逸老师","沈逸"],
            followings: [648113003]
        }
        ,
        {
            displayName: "美食王刚",
            displayIcon: "https://i1.hdslb.com/bfs/face/1463fa4ea6bffd867dc257dca87248bb1d671cde.jpg@600w_600h_1c_1s.webp",
            keywords: ["美食作家王刚R","王刚"],
            followings: [290526283]
        }
        ,
        {
            displayName: "大漠叔叔",
            displayIcon: "https://i2.hdslb.com/bfs/face/bd405797f0d4d6305b76caafff66c98ae1062a35.jpg@600w_600h_1c_1s.webp",
            keywords: ["大漠叔叔",""],
            followings: [67141499]
        }
        ,
        {
            displayName: "哈米伦的弄笛者",
            displayIcon: "https://i1.hdslb.com/bfs/face/0909d7649e770b94d4f4cfd5628ee68206018ae4.jpg@600w_600h_1c_1s.webp",
            keywords: ["哈米伦的弄笛者",""],
            followings: [11742550]
        }
        ,
        {
            displayName: "A",
            displayIcon: "https://i2.hdslb.com/bfs/face/43b21998da8e7e210340333f46d4e2ae7ec046eb.jpg@240w_240h_1c_1s.jpg",
            keywords: ["想到晚的瞬间","晚晚","嘉晚饭","乃贝","贝极星空间站","乃琳夸夸群","顶碗人","皇珈骑士","贝极星","乃宝","嘉心糖的手账本","嘉心糖","拉姐","然然","asoul","A-SOUL","水母","来点然能量","奶淇琳","珈乐","贝拉拉的717片星空"],
            followings: [703007996,672342685,672328094,672353429,672346917,351609538]
        }
        ,
        {
            displayName: "塔",
            displayIcon: "https://i1.hdslb.com/bfs/face/4907464999fbf2f2a6f9cc8b7352fceb6b3bfec3.jpg@240w_240h_1c_1s.jpg",
            keywords: ["谢谢喵","taffy","雏草姬"],
            followings: [1265680561]
        }
        ,
        {
            displayName: "莲宝",
            displayIcon: "https://i0.hdslb.com/bfs/face/ced15dc126348dc42bd5c8eefdd1de5e48bdd8e6.jpg@240w_240h_1c_1s.jpg",
            keywords: ["東雪蓮Official","东雪莲","莲宝"],
            followings: [1437582453]
        }
        ,
        {
            displayName: "T",
            displayIcon: "https://i0.hdslb.com/bfs/face/6be92dec2240b0593a40d2c696b37aa75c704ff6.jpg@240w_240h_1c_1s.jpg",
            keywords: ["小星星","瞳宝","瞳子","瞳瞳","瞳星结","星瞳"],
            followings: [401315430,2122506217]
        }
        ,
        {
            displayName: "梓",
            displayIcon: "https://i2.hdslb.com/bfs/face/ba9ce36ef60a53e24a97f54429e62bdb951530a0.jpg@240w_240h_1c_1s.jpg",
            keywords: ["阿梓从小就很可爱","阿梓","小孩梓","达达","AME"],
            followings: [7706705]
        }
        ,
        {
            displayName: "小米",
            displayIcon: "https://i0.hdslb.com/bfs/face/77feb972004154b08ded4f1d388dbc1058fad2d9.jpg@600w_600h_1c_1s.webp",
            keywords: ["小米"],
            followings: [1476167907]
        }
        ,
        {
            displayName: "华为",
            displayIcon: "https://i2.hdslb.com/bfs/face/d09290cd18c3e048ca0b2eefa3647a487ed11b77.jpg@600w_600h_1c_1s.webp",
            keywords: ["华为"],
            followings: [102999485,578227337,439499363]
        }
        ,
        {
            displayName: "荣耀",
            displayIcon: "https://i0.hdslb.com/bfs/face/0cdc6b649da44ea38e71591b0297d47d86844f0e.jpg@600w_600h_1c_1s.webp",
            keywords: ["荣耀手机"],
            followings: [99748932]
        }
        ,
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/d2a95376140fb1e5efbcbed70ef62891a3e5284f.jpg@100w_100h.webp",
			keywords: ["互动抽奖 #原神", "#原神", "#米哈游#", "#miHoYo#", "原神", "芙宁娜", "白术", "赛诺", "神里绫人", "神里绫华", "夏洛蒂", "珊瑚宫", "九条裟罗", "班尼特", "夜阑", "那维莱特", "枫原万叶", "万叶", "钟离", "纳西妲", "香菱", "八重神子", "久岐忍", "菲谢尔", "艾尔海森", "胡桃", "林尼", "达达利亚", "提纳里", "宵宫", "莫娜", "甘雨", "罗莎莉亚", "刻晴", "九条裟罗", "温迪", "阿贝多", "云堇", "芭芭拉", "可莉", "迪卢克", "烟绯", "重云", "雷泽", "凝光", "坎蒂丝", "辛焱"],
			followings: [401742377] // 原神官方号的 UID
		}
        ,
				{
			displayName: "",
			displayIcon: "https://cf.qq.com/favicon.ico",
			keywords: ["穿越火线"],
			followings: [
				315554376, // 穿越火线官方号的 UID
				204120111, // CF农哥吊打小怪兽
				1083400219, // cf孙某
				398597510, // CF教父
				456180476, // CF猫七
				33281681, // CF威廉I黑化版
				440017413, // 穿越火线兴兴
				474595618, // 穿越火线赛事
			]
		},
		{
			displayName: "",
			displayIcon: "https://dnf.qq.com/favicon.ico",
			keywords: ["地下城与勇士", "DNF"],
			followings: [
				102176172, // 地下城与勇士官方号的 UID
				90179837, // dnf老搬
				27253173, // DNF面码
				8233456, // DNF枪魂冰子
				332349, // DNF死兔子
				168090912, // 17173DNF官方
				353944511, // DNF手游假猪
				325314188
			]
		},
		{
			displayName: "",
			displayIcon: "https://pubg.qq.com/favicon.ico",
			keywords: ["绝地求生", "PUBG"],
			followings: [
				449704680, // 意识DT
				6528910, // 小贝的游戏食堂
				46708782, // 鲁大能
				50329485, // 吃鸡赛事
				552064023, // 吃鸡小表弟
			]
		},
		{
			displayName: "",
			displayIcon: "https://lol.qq.com/favicon.ico",
			keywords: ["英雄联盟", "LOL"],
			followings: [
				50329118, // 哔哩哔哩英雄联盟赛事官方号的 UID
				4895244, // LOL丶诺诺
				470840543, // LOL楠神李青
				178778949, // 英雄联盟
				50329220, // 哔哩哔哩LOL赛事直播
				302651406, // WBG英雄联盟分部
				652663378, // LOL小超梦
				23364027, // 英雄联盟-小白鸦
			]
		},
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/c4cbdafecef76836b94f2ba8832d0a04d709a499.jpg@100w_100h.webp",
			keywords: ["第五人格", "#第五人格", "互动抽奖 #第五人格"],
			followings: [
				211005705, // 网易第五人格手游官方号的 UID
				105022844, // 第五人格赛事
				452627895, // 狼队电竞第五人格分部
				1385707562, // TE溯第五人格分部
			]
		},
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/6afedb4d85ea6c4115f5548146dc8d7127886ca0.jpg@100w_100h.webp",
			keywords: ["蛋仔派对", "#蛋仔派对", "互动抽奖 #蛋仔派对"],
			followings: [
				1306451842, // 网易蛋仔派对官方号的 UID
			]
		},
        {
            displayName: "",
            displayIcon: "https://i2.hdslb.com/bfs/face/57b6e8c16b909a49bfc8d8394d946f908cabe728.jpg@240w_240h_1c_1s.jpg",
            keywords: ["互动抽奖 #崩坏星穹铁道","崩坏星穹铁道"],
            followings: [1340190821]
        }
        ,
        {
            displayName: "",
            displayIcon: "https://i0.hdslb.com/bfs/face/049b47e0e73fc5cc1564343bb0aeacce8ae8e6f8.jpg@240w_240h_1c_1s.jpg",
            keywords: ["互动抽奖 #绝区零","绝区零"],
            followings: [1636034895]
        }
        ,
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/effbafff589a27f02148d15bca7e97031a31d772.jpg@100w_100h.webp",
			keywords: ["互动抽奖 #王者荣耀", "#王者荣耀", "王者荣耀"],
			followings: [
				57863910, // 王者荣耀
				392836434, // 哔哩哔哩王者荣耀赛事
			]
		},
				{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/fe2e1a6e3dc702a6c91378e096ef37ca71bf4629.jpg@100w_100h.webp",
			keywords: ["互动抽奖 #三国杀", "#三国杀", "三国杀", "#2023三国杀"],
			followings: [1254932367] // 三国杀十周年官方号的 UID
		},
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/c5578966c447a70edf831bbf7e522b7be6090fea.jpg@100w_100h.webp",
			keywords: ["我的世界", "minecraft", "#我的世界", "我的世界拜年祭", "MCBBS", "我的世界中文论坛", "MC玩家"],
			followings: [
				43310262, // 我的世界官方号的 UID
				39914211, // 我的世界中文论坛(MCBBS)官方号的 UID
			]
		},
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/a7591e5e0278aafb76cc083b11ca5dd46f049420.jpg@100w_100h.webp",
			keywords: ["mnsj", "迷你世界", "miniworld", "#迷你世界", "迷你世界拜年祭"],
			followings: [
				470935187, // 迷你世界官方号的 UID
			]
		},
        {
            displayName: "",
            displayIcon: "https://i0.hdslb.com/bfs/face/89154378c06a5ed332c40c2ca56f50cd641c0c90.jpg@240w_240h_1c_1s.jpg",
            keywords: ["互动抽奖 #明日方舟","危机合约","《明日方舟》"],
            followings: [161775300]
        }
        ,
        {
            displayName: "",
            displayIcon: "https://i0.hdslb.com/bfs/face/764412727f7dda317f2fd7a6cbc5ab5abe71e8cc.jpg@600w_600h_1c_1s.webp",
            keywords: ["命运-冠位指定"],
            followings: [233108841]
        }
        ,
        {
            displayName: "",
            displayIcon: "https://i1.hdslb.com/bfs/face/063ffbf06d3115d94f6a5241500ee63c4cae9915.jpg@600w_600h_1c_1s.webp",
            keywords: ["战舰世界"],
            followings: [573693898]
        }
        ,
        {
            displayName: "",
            displayIcon: "https://i1.hdslb.com/bfs/face/b00fa47b1b1f6d929aca215c909928859993b5d4.jpg@600w_600h_1c_1s.webp",
            keywords: ["少女前线2","少前2"],
            followings: [697654195]
        }
        ,
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/9859fc14160795f4a7700053342494b3c71945ce.jpg@100w_100h.webp",
			keywords: ["无期迷途", "#无期迷途"],
			followings: [647409444]
		}
		,
		{
			displayName: "",
			displayIcon: "https://i1.hdslb.com/bfs/face/f2635e09fe667d4ad29229c6ed0b5f4bdea09bd1.jpg@100w_100h.webp",
			keywords: ["蔚蓝档案"],
			followings: [3493265644980448,3493282386545566]
		}
		,
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/e2a7e30399860cfa7c1ec5c958ab9e519290e181.jpg@100w_100h.webp",
			keywords: ["尘白禁区", "#尘白禁区"],
			followings: [1409863611,241036]
		}
		,
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/5ec39858e751638ad389a5412696c7efbd31c7bf.jpg@100w_100h.webp",
			keywords: ["来自星尘", "#来自星尘"],
			followings: [1883857209]
		}
		,
		{
			displayName: "",
			displayIcon: "https://i2.hdslb.com/bfs/face/0abd6b9df304334a9388e968740b5b9b7d1a84be.jpg@100w_100h.webp",
			keywords: ["鸣潮"],
			followings: [1955897084]
		}
		,
		{
			displayName: "",
			displayIcon: "https://i2.hdslb.com/bfs/face/6a1936d5cb5b315311fedbf2d4793c4d404cac83.jpg@100w_100h.webp",
			keywords: ["重返未来1999", "#重返未来1999"],
			followings: [1197454103]
		}
		,
		{
			displayName: "",
			displayIcon: "https://i0.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg@100w_100h.webp",
			keywords: ["碧蓝航线", "#碧蓝航线", "#舰船新增#"],
			followings: [
				233114659, // 碧蓝航线官方号的 UID
			]
		}
		,
        {
            displayName: "",
            displayIcon: "https://i2.hdslb.com/bfs/face/667e4b1ca39300bff0672774f1980c02c2353b11.jpg@600w_600h_1c_1s.webp",
            keywords: ["少女前线","少前"],
            followings: [32472953]
        }
        ,
        {
            displayName: " 可🌟风纪委🌟能 ",
            displayIcon: "https://i2.hdslb.com/bfs/face/5c4677f2f5c6aa4aa3ee22c5744ddc5a11dde31c.jpg@600w_600h_1c_1s.webp",
            keywords: ["风纪委","风纪委员","#风纪委员会#","B站新风纪委建议反馈收集 #风纪委","B站新风纪委建议反馈收集 #","风纪委员会调研","风纪委员会众议观点的赞和踩改为同意与不同","风纪委员会众议观点的赞和踩改为同意与不同 #","#B站新风纪委建议反馈收集","风纪委员","焱缪-猫猫兔"],
        }
    ]
    const checked = {}
    const checking = {}
    var printed = false

    // 读取保存的设置,若不存在则读取默认
    if(GM_getValue("settings") == undefined)
        GM_setValue("settings", default_checkers)
    var checkers = GM_getValue("settings")

    // 注册设置按钮
    addSettingsDialog()
    GM_registerMenuCommand('设置', openSettingsMenu);
    function openSettingsMenu() {
        $(".checkerSettings").show()
    }

    // 监听用户ID元素出现
    listenKey(".user-name", addButton);
    listenKey(".sub-user-name", addButton);
    listenKey(".user .name", addButton);
    listenKey(".h #h-name", addSpaceButton);

    // 添加查成分按钮(评论区)
    function addButton(element) {
        let node = $(`<div style="display: inline; z-index: 1;" class="composition-checkable"><div class="iBadge">
  <a class="iName">查</a>
</div></div>`)

        node.on('click', function () {
            node.find(".iName").text("检查中...")
            checktag(element, node.find(".iName"))
        })

        element.after(node)
    }
    // 添加查成分按钮(个人主页)
    function addSpaceButton(element) {
        let box = $(`<div><div class="section"><h3 class="section-title">成分查询</h3><div style="margin: 30px 0 15px; text-align: center;" class="composition-checkable"></div></div></div>`)
        let node = $(`<div class="iBadge launcher">
  <a class="iName">查</a>
</div>`)

        node.on('click', function () {
            node.find(".iName").text("检查中...")
            checktag($("div.col-2:last-child > div:first-child > div.section > div.composition-checkable"), node.find(".iName"))
        })

        $("div.col-2:last-child").prepend(box)
        $("div.col-2:last-child > div:first-child > div.section > div.composition-checkable").prepend(node)
    }

    // 添加标签
    function addtag(id, element, setting) {
        let node = $(`<div style="display: inline; z-index: 1;"><div class="iBadge">
  <a class="iName">${setting.displayName}</a>
  <img src="${setting.displayIcon}" class="iIcon">
</div></div>`)

        element.after(node)
    }

    // 检查标签
    function checktag(element, loadingElement) {
        // 用户ID
        let UID = element.attr("data-user-id") || element.attr("data-usercard-mid")
        // 用户名
        let name = element.text().charAt(0) == "@" ? element.text().substring(1) : element.text()

        // 若在主页则在个人资料取uid
        if(UID == undefined && window.location.hostname == "space.bilibili.com")
            UID = $("div.info-personal > div.info-wrap:first-child > span.info-value:last-child").text()

        if (checked[UID]) {
            // 已经缓存过了
            for(let setting of checked[UID]) {
                addtag(UID, element, setting)
            }
            loadingElement.parent().remove()
        } else if (checking[UID] != undefined) {
            // 检查中
            if (checking[UID].indexOf(element) < 0)
                checking[UID].push(element)
        } else {
            checking[UID] = [element]

            // 获取最近动态
            GM_xmlhttpRequest({
                method: "get",
                url: blog + UID,
                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: res => {
                    if(res.status === 200) {
                        // 获取关注列表
                        GM_xmlhttpRequest({
                            method: "get",
                            url: followapi + UID,
                            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: followingRes => {
                                if(followingRes.status === 200) {
                                    // 获取勋章列表
                                    GM_xmlhttpRequest({
                                        method: "get",
                                        url: medalapi + UID,
                                        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: medalRes => {
                                            if(medalRes.status === 200) {
                                                // 查询关注列表
                                                let followingData = JSON.parse(followingRes.response)
                                                // 可能无权限
                                                let following = followingData.code == 0 ? followingData.data.list.map(it => it.mid) : []

                                                // 查询并拼接动态数据
                                                let st = JSON.stringify(JSON.parse(res.response).data.items)

                                                // 获取勋章列表
                                                let medalData = JSON.parse(medalRes.response)
                                                let medals = medalData.code == 0 ? medalData.data.list.map(it => it.medal_info.target_id) : []

                                                // 找到的匹配内容
                                                let found = []
                                                for(let setting of checkers) {
                                                    // 检查动态内容
                                                    if (setting.keywords)
                                                        if (setting.keywords.find(keyword => st.includes(keyword))) {
                                                            if (found.indexOf(setting) < 0)
                                                                found.push(setting)
                                                            continue;
                                                        }

                                                    // 检查关注列表
                                                    if (setting.followings)
                                                        for(let mid of setting.followings) {
                                                            if (following.indexOf(mid) >= 0) {
                                                                if (found.indexOf(setting) < 0)
                                                                    found.push(setting)
                                                                continue;
                                                            }
                                                        }

                                                    // 检查勋章列表
                                                    if (setting.followings)
                                                        for(let target_id of setting.followings) {
                                                            if (medals.indexOf(target_id) >= 0) {
                                                                if (found.indexOf(setting) < 0)
                                                                    found.push(setting)
                                                                continue;
                                                            }
                                                        }
                                                }

                                                // 添加标签
                                                if (found.length > 0) {
                                                    if (!printed) {
                                                        // console.log(JSON.parse(res.response).data)
                                                        printed = true
                                                    }
                                                    checked[UID] = found

                                                    // 给所有用到的地方添加标签
                                                    for (let element of checking[UID]) {
                                                        for(let setting of found) {
                                                            addtag(UID, element, setting)
                                                        }
                                                    }
                                                    loadingElement.parent().remove()
                                                } else {
                                                    loadingElement.text('无')
                                                }

                                                // 小孩子瞎写着玩的,不想看到 tips 可以注释掉
                                                let tips = ""
                                                if(followingData.code != 0) tips += "无法获取" + name + "的关注列表(" + followingData.code + ": " + followingData.message + ")<br>"
                                                if(medalData.data.close_space_medal == 1) tips += "无法获取" + name + "的粉丝牌(主页显示被设为隐私)"
                                                if(tips != "") checkerTip(tips)

                                            } else {
                                                loadingElement.text('失败')
                                            }

                                            delete checking[UID]
                                        },
                                        onerror: err => {
                                            loadingElement.text('失败')
                                            delete checking[UID]
                                        }
                                    })

                                } else {
                                    loadingElement.text('失败')
                                    delete checking[UID]
                                }
                            },
                            onerror: err => {
                                loadingElement.text('失败')
                                delete checking[UID]
                            }
                        })


                    } else {
                        loadingElement.text('失败')
                        delete checking[UID]
                    }
                },
                onerror: err => {
                    loadingElement.text('失败')
                    delete checking[UID]
                }
            });
        }
    }

    addGlobalStyle(`
    .iBadge {
      display: inline-flex;
      justify-content: center;
      align-items: center;
      width: fit-content;
      background: #07beff26;
      border-radius: 10px;
      margin: -6px 0;
      margin: 0 5px;
      font-family: PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif;
    }
    .iName {
      line-height: 13px;
      font-size: 13px;
      color: #07beff;
      padding: 2px 8px;
    }
    .iIcon {
      width: 25px;
      height: 25px;
      border-radius: 50%;
      border: 2px solid white;
      margin: -6px;
      margin-right: 5px;
    }
    .user-info, .sub-user-info {
      width: max-content;
      background: #fff;
      padding: 0px 10px;
      border-radius: 6px;
      position: static;
    }
    .user-info .user-level {
      z-index: 1;
    }
    .checkerSettings {
        display: none;
        position: fixed;
        top: 10%;
        left: 10px;
        height: 80%;
        width: 400px;
        overflow-y: auto;
        background: #fff;
        z-index: 10;
        box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, .5);
    }
    .menuTab {
        position: fixed;
        background: #fff;
    }
    .menuTitle {
        margin: 10px 20px;
        width: 350px;
        padding-left: 5px;
        font-size: 24px;
        font-weight: bold;
        border-left: var(--Lb5) 5px solid;
    }
    .menuItems {
        margin: 60px 20px;
        padding-left: 5px;
    }
    .menuItems p {
        margin: 5px 0;
    }
    .checker {
        margin-bottom: 10px;
        padding: 5px;
    }
    .checker:hover {
        background: #eee;
    }
    .checker .icon {
        width: 50px;
        height: 50px;
        margin-right: 10px;
    }
    .checker .displayName {
        display: block;
        font-weight: bold;
        margin-bottom: 5px;
    }
    .checker .keywords {
        font-size: 14px;
        color: gray;
    }
    .checker .followings {
        font-size: 14px;
        color: blue;
    }
    .input-container {
        margin-bottom: 10px;
    }
    .input-label {
        display: block;
        margin-bottom: 5px;
    }
    .input-field {
        width: 100%;
        padding: 5px;
        margin-bottom: 10px;
    }
    .input-field:invalid {
        background-color: lightpink;
    }
    .save-button {
        padding: 10px 20px;
        background-color: #4CAF50;
        color: white;
        border: none;
        cursor: pointer;
    }
    .save-button:hover {
        background-color: #45a049;
    }
    .edit-button {
        padding: 5px 10px;
        background-color: #2196F3;
        color: white;
        border: none;
        cursor: pointer;
        margin-left: 10px;
        float: right;
    }
    .edit-button:hover {
        background-color: #0b7dda;
    }
    .delete-button {
        padding: 5px 10px;
        background-color: #f32121;
        color: white;
        border: none;
        cursor: pointer;
        margin-left: 10px;
        float: right;
    }
    .delete-button:hover {
        background-color: #da0b15;
    }
    .export-button {
        padding: 5px 10px;
        background-color: #2196f3;
        color: white;
        border: none;
        cursor: pointer;
        margin-left: 10px;
    }
    .export-button:hover {
        background-color: #0b7dda;
    }
    .import-button {
        padding: 5px 10px;
        background-color: #2196f3;
        color: white;
        border: none;
        cursor: pointer;
        margin-left: 10px;
    }
    .import-button:hover {
        background-color: #0b7dda;
    }
    #msgDisplay {
        color: lightpink;
    }
   `)

    function addGlobalStyle(css) {
        var head, style;
        head = document.getElementsByTagName('head')[0];
        if (!head) { return; }
        style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = css;
        head.appendChild(style);
    }

    // 添加设置窗口
    function addSettingsDialog() {
        let menu = `<div class="checkerSettings">
    <div class="menuTab"><div class="menuTitle">设置菜单<span onClick="this.parentNode.parentNode.parentNode.style.display = 'none'" style="float: right; font-size: 14px;">关闭</span></div></div>
    <div class="menuItems">
            <div class="input-container">
            <label class="input-label" for="displayNameInput">展示名称:</label>
            <input id="displayNameInput" class="input-field" type="text">
        </div>
        <div class="input-container">
            <label class="input-label" for="displayIconInput">展示图标链接:</label>
            <input id="displayIconInput" class="input-field" type="text" placeholder="以https://或http://开头" pattern="^((http://)|(https://)).*$">
        </div>
        <div class="input-container">
            <label class="input-label" for="keywordsInput">关键词:</label>
            <input id="keywordsInput" class="input-field" type="text" placeholder="(可选)可输入多个,使用英文逗号分割">
        </div>
        <div class="input-container">
            <label class="input-label" for="followingsInput">UID:</label>
            <input id="followingsInput" class="input-field" type="text" placeholder="(可选)可输入多个,使用英文逗号分割" pattern="^[0-9, ]+$">
        </div>
        <button id="saveButton" class="save-button">保存</button>
        <div id="checkersContainer"></div>
        <button id="exportButton" class="export-button">导出到剪切板</button>
        <button id="importButton" class="import-button">从剪切板导入</button>
        <div id="msgDisplay"></div>

        <script>
            var checker_list = ` + JSON.stringify(GM_getValue("settings")) + `;

            var checkersContainer = document.getElementById("checkersContainer");
            var displayNameInput = document.getElementById("displayNameInput");
            var displayIconInput = document.getElementById("displayIconInput");
            var keywordsInput = document.getElementById("keywordsInput");
            var followingsInput = document.getElementById("followingsInput");
            var saveButton = document.getElementById("saveButton");

            var update_token = 0;

            saveButton.addEventListener("click", function() {
                var displayName = displayNameInput.value;
                var displayIcon = displayIconInput.value;
                var keywords = keywordsInput.value.split(",").map(function(keyword) {
                    return keyword.trim();
                });
                var followings = followingsInput.value.split(",").map(function(following) {
                    return parseInt(following.trim());
                });

                if (displayName && displayIcon && keywords.length > 0 && followings.length > 0) {
                    var existingChecker = findChecker(displayName);

                    if (existingChecker) {
                        // Update the properties of the existing checker
                        existingChecker.displayIcon = displayIcon;
                        existingChecker.keywords = keywords;
                        existingChecker.followings = followings;
                    } else {
                        // Create a new checker and add it to the checkers array
                        var newChecker = {
                            displayName: displayName,
                            displayIcon: displayIcon,
                            keywords: keywords,
                            followings: followings
                        };

                        checker_list.push(newChecker);
                    }

                    renderCheckers();
                    clearInputs();
                }
                
                update_token = 1;
            });

            function findChecker(displayName) {
                for (var i = 0; i < checker_list.length; i++) {
                    if (checker_list[i].displayName === displayName) {
                        return checker_list[i];
                    }
                }
                return null;
            }

            function renderCheckers() {
                checkersContainer.innerHTML = "";

                checker_list.forEach(function(checker, index) {
                    var checkerElement = document.createElement("div");
                    checkerElement.className = "checker";

                    var iconElement = document.createElement("img");
                    iconElement.className = "icon";
                    iconElement.src = checker.displayIcon;

                    var displayNameElement = document.createElement("span");
                    displayNameElement.className = "displayName";
                    displayNameElement.textContent = checker.displayName;

                    var keywordsElement = document.createElement("p");
                    keywordsElement.className = "keywords";
                    keywordsElement.textContent = checker.keywords.join(", ");

                    var followingsElement = document.createElement("p");
                    followingsElement.className = "followings";
                    followingsElement.textContent = checker.followings.join(", ");

                    var editButton = document.createElement("button");
                    editButton.className = "edit-button";
                    editButton.textContent = "编";
                    editButton.addEventListener("click", function() {
                        fillInputs(checker);
                        document.getElementsByClassName("checkerSettings")[0].scrollTo({top: 0,behavior: "smooth"});
                    });

                    var deleteButton = document.createElement("button");
                    deleteButton.className = "delete-button";
                    deleteButton.textContent = "删";
                    deleteButton.addEventListener("click", createDeleteHandler(checker.displayName));

                    checkerElement.appendChild(displayNameElement);
                    checkerElement.appendChild(iconElement);
                    checkerElement.appendChild(deleteButton);
                    checkerElement.appendChild(editButton);
                    checkerElement.appendChild(keywordsElement);
                    checkerElement.appendChild(followingsElement);

                    checkersContainer.appendChild(checkerElement);
                });
            }

            function createDeleteHandler(displayName) {
                return function() {
                    deleteChecker(displayName);
                };
            }

            function deleteChecker(displayName) {
                for (var i = 0; i < checker_list.length; i++) {
                    if (checker_list[i].displayName === displayName) {
                        checker_list.splice(i, 1);
                        break;
                    }
                }

                update_token = 1;

                renderCheckers();
            }

            function fillInputs(checker) {
                displayNameInput.value = checker.displayName;
                displayIconInput.value = checker.displayIcon;
                keywordsInput.value = checker.keywords.join(", ");
                followingsInput.value = checker.followings.join(", ");
            }

            function clearInputs() {
                displayNameInput.value = "";
                displayIconInput.value = "";
                keywordsInput.value = "";
                followingsInput.value = "";
            }
            
			var msgDisplay = document.getElementById("msgDisplay");
            var exportButton = document.getElementById("exportButton");
            exportButton.addEventListener("click", function() {
                exportCheckers();
            });
			
            var importButton = document.getElementById("importButton");
            importButton.addEventListener("click", function() {
                importCheckers();
            });
			
            function exportCheckers() {
                var checkersText = JSON.stringify(checker_list, null, 2);
                navigator.clipboard.writeText(checkersText)
                    .then(function() {
                        msgDisplay.textContent = "规则导出成功";
                    })
                    .catch(function(error) {
                        msgDisplay.textContent = "导出失败: " + error;
                    });
            }
            function importCheckers() {
                navigator.clipboard.readText()
                    .then(function(text) {
                        var importedCheckers = JSON.parse(text);
                        if (validateCheckers(importedCheckers)) {
                            checker_list = importedCheckers;
                            renderCheckers();
                            msgDisplay.textContent = "规则导入成功";
                            update_token = 1;
                        } else {
                            msgDisplay.textContent = "导入失败: 剪切板内容无效或不完整";
                        }
                    })
                    .catch(function(error) {
                        msgDisplay.textContent = "导入失败: " + error;
                    });
            }


            function validateCheckers(checkers) {
                if (!Array.isArray(checkers)) {
                    return false;
                }

                for (var i = 0; i < checkers.length; i++) {
                    var checker = checkers[i];
                    if (typeof checker !== "object" ||
                        !checker.hasOwnProperty("displayIcon") ||
                        !checker.hasOwnProperty("displayName") ||
                        !checker.hasOwnProperty("followings") ||
                        !checker.hasOwnProperty("keywords")) {
                        return false;
                    }
                }

                return true;
            }

            renderCheckers();
        </script>
    </div>
</div>
        `
        $("body").append(menu)
    }

    // 创建提示
    function checkerTip(msg) {
        // 创建个元素
        var element = document.createElement('div');

        // 设置显示的文本(HTML)
        element.innerHTML = msg;

        // 设置元素的样式
        element.style.position = 'fixed';
        element.style.top = '50%';
        element.style.left = '50%';
        element.style.transform = 'translate(-50%, -50%)';
        element.style.backgroundColor = 'blue';
        element.style.position = 'fixed';
        element.style.zIndex = '12000';
        element.style.padding = '15px 30px';
        element.style.color = '#fff';
        element.style.fontSize = '14px';
        element.style.textAlign = 'center';
        element.style.borderRadius = '4px';
        element.style.boxShadow = '0 2px 4px rgba(0,0,0,.14)';
        element.style.backgroundColor = 'rgba(0,0,0,.8)';
        element.style.transition = 'all .5s';

        document.body.appendChild(element);

        element.style.opacity = '1';
        setTimeout(function() {
            element.style.opacity = '0';
            setTimeout(function() {
                document.body.removeChild(element);
            }, 500);
        }, 3000);
    }

    function listenKey(selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
        var targetNodes, btargetsFound;

        if (typeof iframeSelector == "undefined")
            targetNodes = $(selectorTxt);
        else
            targetNodes = $(iframeSelector).contents ()
                .find (selectorTxt);

        if (targetNodes && targetNodes.length > 0) {
            btargetsFound = true;
            targetNodes.each ( function () {
                var jThis  = $(this);
                var alreadyFound = jThis.data ('alreadyFound')  ||  false;

                if (!alreadyFound) {
                    //--- Call the payload function.
                    var cancelFound = actionFunction (jThis);
                    if (cancelFound) btargetsFound = false;
                    else jThis.data ('alreadyFound', true);
                }
            } );
        } else {
            btargetsFound = false;
        }

        var controlObj = listenKey.controlObj  ||  {};
        var controlKey = selectorTxt.replace (/[^\w]/g, "_");
        var timeControl = controlObj [controlKey];

        //--- Now set or clear the timer as appropriate.
        if (btargetsFound && bWaitOnce && timeControl) {
            clearInterval (timeControl);
            delete controlObj [controlKey]
        } else {
            //设置定时器
            if ( ! timeControl) {
                timeControl = setInterval ( function () {
                    listenKey(selectorTxt,actionFunction,bWaitOnce,iframeSelector);
                    if(update_token == 1) {
                        console.log("更新")
                        GM_setValue("settings", checker_list)
                        update_token = 0
                    }
                    checkers = GM_getValue("settings")
                }, 300);
                controlObj [controlKey] = timeControl;
            }
        }
        listenKey.controlObj = controlObj;
    }
})