Greasy Fork is available in English.

咪咕自动巡检脚本工具

咪咕视频自动巡检脚本工具

// ==UserScript==
// @name         咪咕自动巡检脚本工具
// @namespace    http://tampermonkey.net/
// @version      2.2
// @description  咪咕视频自动巡检脚本工具
// @author       AI数据标注猿
// @match        https://oes-coss.miguvideo.com:1443/oes-csas-web/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=firefoxchina.cn
// @grant         GM_xmlhttpRequest
// @license      MIT
// ==/UserScript==

(async function() {
    'use strict';
     //存放通道连接地址
     var authenticationAisleList = [];
     //媒资ID
     var assetId;
    //账号ID
    var author;
    //通道地址
     var aisleId;
    //存储全量查询AI
    var url = 'https://oes-coss.miguvideo.com:1443/oes-csas-manage/content/queryList';
    //存储判断是否有违规词
    var titleContainsChineseWordResult = false;
     //存放待查询人员名单(每行10个账号)
    var auditorList = ['zbs003yaomingwei'];

    //开始查询时间
    var startTime = '';
    //查询结束时间
    var endTime = '';

    //查询结果记录在csv中的表头,violationDescription(违规说明)
    const queryData = [
            ['auditor1', 'assetId1','author', 'assetName1','auditStatusStr1','labelName1','auditRemark1','aisleTime1','violationDescription1'], // 表头行
        ];

    //记录当前查询数据
    var auditor = '';
   //存放违禁词
    var searchWordLibrary = ['随刻','腾讯视频','好看视频','优酷','土豆','搜狐','乐视','西瓜视频','秒拍','抖音','快手','火山','最右','微博视频号','梨视频','皮这一下','皮皮虾','爱奇艺','小红书','直播吧','今日头条','百度视频','网易视频','哔哩哔哩','bilibili','西瓜体育','头条体育','爱奇艺体育','火山官方','火山美食','搜狐体育','头条',
                             '我的英雄学院','逃学威龙','头文字','大时代','地球停转之日','罪恶之城','巫师3','隐入尘烟','死亡笔记','暗杀教室','恶搞之家','辛普森一家','瑞奇和莫迪','一九四二','猫汤','我推的孩子','伊拉克恶狼谷','娜珍之交','禁忌女孩','有多卑微',
                             '黑白校园','疾速追杀','天龙八部','宁安如梦','人体蜈蚣','进击巨人','刃艾伦','阿尔敏','少林足球','奇幻潮','终极一班','全民目击','山河令','叶问大战约翰威克','澳门风云','相爱十年','剑雨','风云','隐如尘烟','情深深雨蒙蒙','康斯坦丁','大盗','黑客帝国','小时代','上海滩','欢乐今宵',
                             '徐濠萦','王全安','谭小环','罗志祥','翟天临','吴启明','林建明','叶德娴','李易峰','毛宁','张默','林夕','胡瓜','陈冠希','黄秋生','赵薇','张耀扬','薇娅','李云迪','李铁','范冰冰','炎亚纶','赵立新','孙兴','李易峰','柯震东','张元','高虎','邓伦','唐诗咏','张哲瀚','黄海波','高晓松','周峻纬','朴明秀',
                             '钙片','烟酰胺','鱼油','维生素','益生菌','护肝片','叶黄素','保健品推广','上海养老金', '康士坦丁','大佛普拉斯','里维斯','乐火团队','维尼熊','谢文东','绣春刀','特警新人类','虚竹','乔峰','段誉','鸠摩智','撒旦','夜神月','殷桃疑似恋情','陈奕迅最难唱的一首歌',
                             '特朗普','俄乌','美俄','老拜','拜登','泽连斯基','逃学威龙','城管','动漫推荐','头文字','AE86','缅北','鬼灭之刃','鸭脖','小萝莉','人生若如初见','我的英雄学院','人面鱼','李诞','香蜜沉沉烬如霜','珂珂动漫','岸田','香蜜','十月围城','为什么赵丽颖能大火',
                             '一口气看完','无间道','红色按钮','bbc','增肌粉','steam','战地','问诊','黑金','旺角监狱','阳光普照','梁家辉','那年那兔','太保','上海人寿','民国','中华民国','民国纪年','狂赌之渊','小清河','断桥','围栏','护城河','洪水','倪岳峰','晴雅集','楚乔传','白鹿原','封神',
                             '徐若瑄','达叔','娱乐圈','电锯人','梅根','博彩','丁蟹','以爱为名','光刻机','佩洛西','温州','祠堂','鹰酱','爱神','我唾弃你的坟墓','进击的巨人','情深深雨蒙蒙','talk','兔瓦斯','梅塔塔','江浩','爱神巧克力','周子瑜','瑞克和莫蒂','瑞克','车祸模拟器','一千零一夜','台湾名嘴','化工厂',
                             '我赌5包辣条','双男','↗️↘️↗️','房地产','刘亚仁','思悼','刘丞以','破坏之王','新知创作人','森美','练成了','韩剧双男','泰剧双男','同性','中国新说唱','聂小凤','雪花神剑','兄妹恋','天盛长歌','twice','以你的心诠释我的爱','中国最后一个太监','吕不韦','嬴异人','陷入通缩','负增长','中国有嘻哈',
                             '大碗宽面','青簪行','爵迹','我叫白小飞','尸兄','小李飞刀','北京欢迎你','我的小尾巴','生死时速','终极一班','黄致列','见面吧就现在','遇见你之后','还珠格格','网红直播','儿童睡前故事','康熙来了','埃塞俄比亚','中埃','赖清德','柬埔寨','重案六组','男儿本色',
                             '千机变','马小龙','罗小贝','门第','疯狂熊孩子','急诊室故事','失恋33天','梨花泪','雾里看花','永不磨灭的番号','地狱公使','六龙飞天','思悼','格斗yulao少年','不名誉的一家','我们没有明天','不能说的夏天','我和僵尸有个约会','四大名捕','二胎奖','中国影史上的美人',
                             '翻越','高墙','式神','东京暗鸦','黑白森林','壮志凌云','吴倩莲','2day1夜','奇葩说第4季','九五至尊','封神榜','傅艺伟','妲己','旺达寻亲记','奇异博士2','Talk That Talk','氰化欢乐秀','哥布林','沙雕动画','生化危机','使徒行者','红警','红色警戒','疯狂的多元宇宙',
                             '囚禁','诺贝尔','牙医','放映厅','沈世','浙江卫视','李明','郑爽','活跳尸','段云','纵横四海','大富豪','太白金星','小鱼儿与花无缺','铁心兰','安石海','名侦探学院','社内相亲','安孝燮','女作家','骨瘦如柴','镜双城','宋冬野','极限挑战','赵氏孤儿','如懿传',
                             '黄飞鸿','痞子老师','民兵葛二蛋','萧峰','芈月传','苏州河','极限男团',' 桃色交易','乱世三义','唐子义','斗音','小燕子','吴亦凡','关于我和鬼','缠爱之根','陈羽凡','曹达华','使命召唤','无耻之徒','第七段','快讯','快报','时政','早知道','军事','楚乔终于',
                             '7纳米','搭载新型','两个怪异女孩','只要不进密逃','电锯惊魂','阴声','天津大爷','汉朝帝王图鉴','陈戌源','食人魔','下水道的美人鱼','禁忌之恋','夕阳天使','这就是街舞','职业球队','月里青山淡如画','以谁之名','绝路','慈禧','活着','古装男神','天赋都用来损人',
                             '杨钰莹','喀秋莎','王芳','乌鸦哥','海清','孝文','洛丽塔','七日杀','刘春洋','交响乐团','元首的愤怒','小s鉴茶','恐怖蜡像馆','祝卿好','袁冰妍','老九门','褚璇玑','杨铠豪','杨幂','琉璃','将夜','倾城亦清欢','dha','核桃油','少林五祖','赵丽颖与大佬谈笑风声',
                             '台湾史诗级电影,将婚姻不堪的一面','春夏','氨糖','与凤行','拥有公司最多的12位明星','港台十大爱国明星','明星偶像包袱碎一地','“普通发”行为大赏','事业爱情双丰收的黄晓明','共闯娱圈的兄弟姐妹','千万别和专业歌手同台飙歌','张玉安&文凯_护国狂魔','玉无心为救',
                             '同样是男星穿军装','陈思诚与新欢阮巨现身约会','无缝衔接合拍,就是那么的丝滑','冷血狂宴:银尘双重身份曝光','主办方有多尴尬','放弃中国籍却在中国捞金的明星','把嫌弃写脸上谁有陈坤硬核','被镜头捕捉的明星尬死瞬间','候场暴露异性缘','不红就被冷落','咖位低就该',
                             '暴露真假社交的候场','父亲纳妾后气的原配投河自尽','男子为离世女友查真相十年不婚','华语乐坛最大的败笔','2022年最新的史诗级空战片','月老','男星谦让起来有多可怕','果然是烂片出神曲','明星喜欢冷漠全写在脸上','世界上没有真正正确的地图','父母一时冲动丢下孩子',
                             '黄晓明不再沉默','镜头捕捉到的','国家队出手','女星同台互相有多瞧不上','内地和港台女星驻颜差距','如果影视中的改装枪械有段位','大佬女儿颜值对比','以凡人之躯与众神为敌','华灯初上','候场暴露真假社交','突发时刻','一部让女主迅速走红的国产电影',
                             '嫁给富豪后破产的女星','孟丽君','为抢镜明星能有多拼','明星假唱翻车现场','多尬死','资本态度成咖位','大力女子姜南顺','写脸上的明星','包装后','落花时节又逢君','才是王道','晚节不保老戏骨','13082353318','被嫌弃如何应对','韩国歌撞调','男星红毯','疯狂往事陈意涵',
                             '潘金莲','女娲传说之灵珠','疯批太师将她困在身边','明星医美过度有多尴尬','林志玲被太子辉','明星穿衣暴露爱国情怀','整顿流量鲜肉','曾轶可唱的最惨的一首歌','群嘲林志炫','四大天王背后的女人','嫁负心汉的女星今昔','明星偶像包袱碎一地','热线','微信','13881286073',
                             '三六九等','双缝干涉实验有多可怕','确定是配音不是原声','娱乐圈离谱的谣言','意外走光都是','台湾黑帮老大张安乐','表里不一','写脸上的男星','咖位决定明星的C位','芭莎内场','恒大','候场社交暴露明星真实关系','王一博到底做了什么','次次提名次次都陪跑','明星红毯突发尴尬',
                             '记录的社死瞬间','曾风光今落魄的港姐','繁华一梦终归去','这几位原唱太厉害','女星对男星态度','当白色死神遇到蓝色','古惑仔女演员','被镜头记录的明星社交','地球班往事','选秀界五大狠人','轮回的空椅子','刻进骨子里的','自信过头的满级人类','黄晓明对不同女星的差距',
                             '明星反应','危险罗曼史','明星脱口而出','地球诺贝尔奖','火到出圈的说唱歌曲',


                            ]


    // 创建悬浮窗口
    const floatingWindow = document.createElement('div');
    floatingWindow.style.position = 'fixed';
    floatingWindow.style.top = '50%';
    floatingWindow.style.left = '50%';
    floatingWindow.style.transform = 'translate(-50%, -50%)';
    floatingWindow.style.backgroundColor = 'white';
    floatingWindow.style.padding = '10px';
    floatingWindow.style.border = '1px solid black';
    floatingWindow.style.zIndex = '9999';
    floatingWindow.style.cursor = 'move'; // 添加拖拽光标样式

    // 添加开始日期和时间输入框
    const startTimeInput = document.createElement('input');
    startTimeInput.type = 'datetime-local';
    startTimeInput.id = 'start-time';
    startTimeInput.style.marginRight = '10px';
    floatingWindow.appendChild(startTimeInput);

    // 添加结束日期和时间输入框
    const endTimeInput = document.createElement('input');
    endTimeInput.type = 'datetime-local';
    endTimeInput.id = 'end-time';
    endTimeInput.style.marginRight = '10px';
    floatingWindow.appendChild(endTimeInput);

     // 创建人员输入框
    const input = document.createElement('input');
    input.setAttribute('list', 'peopleNames');
    input.id = 'nameInput';
    input.placeholder = '输入或选择名字...';


    // 设置默认值
    // 这里我选择了列表中的第一个名字作为默认值
    input.value = 'zbs003yaomingwei';

    // 创建datalist
    const dataList = document.createElement('datalist');
    dataList.id = 'peopleNames';

    // 添加人名选项
    const peopleNames = ['zbs003yaomingwei','zbs003baiyuezhou','zbs003liuji','zbs003zhangsuya','zbs003guoshiyang','zbs003wangxiaotong','zbs003zhangwenbo','zbs003hewei','zbs003jinlong','zbs003wangli',
                      'zbs004liuyang','zbs003zhuhuayue','zbs003zhaohaibo','zbs001zhangyu','zbs003zhanxinxin','zbs003zangtianyu','zbs003xuxiaoying','zbs003xinjunda','zbs003cuishengnan','zbs003shice',
                       'zbs003dongyue','zbs003liyitong','zbs003shijian','zbs003zhangxiaochen','zbs003tianlixiang','zbs003liurongxian','zbs003wangyan','zbs003wangyunqi','zbs003yaoweibin','zbs003jiangnan',
                      'zbs003liping','zbs003dengyanhui','zbs003hongjiaxin','zbs003hanqitong','zbs003xiaochangsheng','zbs003jianglianghan','zbs002liyan','zbs003zhouxinyu','zbs003lvwentao'];

    for (const name of peopleNames) {
        const option = document.createElement('option');
        option.value = name;
        option.textContent = name;

        dataList.appendChild(option);
    }

      // 创建清除按钮
    const clearButton = document.createElement('span');
    clearButton.innerHTML = "×";
    clearButton.style.cursor = 'pointer';
    clearButton.style.position = 'absolute';
    clearButton.style.right = '30px'; // 调整此值以使其正确地对齐到输入框的右侧
    clearButton.style.top = '1px'; // 调整此值以使其垂直居中
    clearButton.onclick = function() {
        input.value = ''; // 清除输入框的值
    };

    // 将清除按钮添加到输入框的容器
    const inputWrapper = document.createElement('div');
    inputWrapper.style.position = 'relative'; // 使清除按钮相对于此容器定位
    inputWrapper.style.display = 'inline-block'; // 确保容器不占据额外的空间
    inputWrapper.appendChild(input);
    inputWrapper.appendChild(clearButton);

    floatingWindow.appendChild(inputWrapper);
    floatingWindow.appendChild(dataList);

    // 添加“自动巡检”按钮
    const inspectButton = document.createElement('button');
    inspectButton.textContent = '自动巡检';
    floatingWindow.appendChild(inspectButton);

    // 创建一个状态变量,跟踪日志文本区域的状态
    let isLogVisible = true;

    // 创建一个控制日志显示/隐藏的按钮
    const toggleLogButton = document.createElement('button');
    toggleLogButton.textContent = '隐藏日志'; // 默认状态为显示日志,所以按钮显示“隐藏日志”
    toggleLogButton.onclick = function() {
        if (isLogVisible) {
            logArea.style.display = 'none'; // 隐藏日志文本区域
            toggleLogButton.textContent = '显示日志';
            isLogVisible = false;
        } else {
            logArea.style.display = 'block'; // 显示日志文本区域
            toggleLogButton.textContent = '隐藏日志';
            isLogVisible = true;
        }
    };
    floatingWindow.appendChild(toggleLogButton);

    // 添加悬浮窗口到页面
    document.body.appendChild(floatingWindow);

    let offsetX, offsetY; // 鼠标位置和悬浮窗口位置的差值

    // 鼠标按下时记录差值
    floatingWindow.addEventListener('mousedown', (event) => {
        offsetX = event.clientX - floatingWindow.offsetLeft;
        offsetY = event.clientY - floatingWindow.offsetTop;
    });

    // 鼠标移动时更新悬浮窗口位置
    document.addEventListener('mousemove', (event) => {
        if (offsetX !== undefined && offsetY !== undefined) {
            const x = event.clientX - offsetX;
            const y = event.clientY - offsetY;
            floatingWindow.style.left = x + 'px';
            floatingWindow.style.top = y + 'px';
        }
    });

    // 鼠标释放时重置差值
    document.addEventListener('mouseup', () => {
        offsetX = undefined;
        offsetY = undefined;
    });

    // 创建一个用于显示日志的文本区域
    const logArea = document.createElement('pre');

    // 设置文本区域的最大高度为屏幕高度的50%
    const maxHeight = window.innerHeight * 0.5;
    logArea.style.maxHeight = `${maxHeight}px`;

    // 设置文本区域的最大宽度为屏幕宽度的50%
    const maxWidth = window.innerWidth * 0.5;
    logArea.style.maxWidth = `${maxWidth}px`;
    logArea.style.overflow = 'auto';
    logArea.style.borderTop = '1px solid black';
    logArea.style.marginTop = '10px';
    logArea.style.overflowY = 'auto';
    floatingWindow.appendChild(logArea);


    // 创建一个标志以确定是否捕获日志
    let shouldCaptureLogs = false;

      // 设置开始时间输入框默认值为当天
    const today = new Date();
    const startYear = today.getFullYear();
    const startMonth = String(today.getMonth() + 1).padStart(2, '0');
    const startDay = String(today.getDate()).padStart(2, '0');
    const defaultStartTime = `${startYear}-${startMonth}-${startDay} 00:00:00`;
    startTimeInput.value = defaultStartTime;

    // 设置结束时间输入框默认值为当天的23:59:59
    const defaultEndTime = `${startYear}-${startMonth}-${startDay} 23:59:59`;
    endTimeInput.value = defaultEndTime;

    // 点击“自动巡检”按钮的事件处理程序
    inspectButton.addEventListener('click',async () => {
        // 开始捕获日志
        shouldCaptureLogs = true;

        logArea.textContent = '正在巡检导出中......,请耐心等待!\n'; // 添加开始消息到文本区域

        // 获取选择的开始时间和结束时间
        startTime = formatDateTime(startTimeInput.value).replace('T', ' ');
        endTime = formatDateTime(endTimeInput.value).replace('T', ' ');
        // 获取选择的人名
        const selectedName = input.value;

        // 在这里执行查询操作,根据实际需求自行处理
        customLog('开始时间:'+ startTime);
        customLog('结束时间:'+ endTime);
        customLog('账号ID:'+ selectedName);

        // 在这里调用查询函数进行数据查询
       await performQuery(startTime, endTime,selectedName);
       
    });

    // 在这里定义查询函数
    async function performQuery(startTime, endTime,selectedName) {
        await searchAllData(startTime, endTime,selectedName);
        // 在这里执行查询操作,根据实际需求自行处理
        customLog('开始执行查询操作,开始时间:'+ startTime + ',结束时间:'+ endTime);
        // 在这里根据查询结果进行相应的处理
    }


    async function searchAllData(startTime, endTime,selectedName){
            //赋值当前数据
            auditor = selectedName;
            // 拼接JSON对象
            var jsonData = {
                "aiAuditStatus": "",
                "aisleEndTime": "",
                "aisleId": "",
                "aisleStartTime": "",
                "assetId": "",
                "auditor":auditor,
                "auditStatus": "",
                "auditType": "",
                "author": "",
                "collectEndTime": "",
                "collectStartTime": "",
                "costTime": "",
                "createTimeEndTime": "",
                "createTimeStartTime": "",
                "displayName": "",
                "endTime": endTime,
                "exclusiveKeyword": "",
                "keywords": "",
                "labelId": "",
                "location": "2",
                "MD5": "",
                "mediumStatus": "",
                "occurred": "",
                "otherKeyword": "",
                "pageNum": 1,
                "pageSize": 500,
                "riskList": [],
                "secondClassCode": "",
                "startTime": startTime,
                "thirdClassCode": "",
                "titleKeyword": "",
                "userId": "",
                "userRiskList": [],
                "videoType": ""
            };
            //查询一个人的查询数据
            await postData(jsonData);

    }


    // 提交数据
    async function postData(jsonData) {

            // 将 JSON 数据转换为字符串
            var jsonString = JSON.stringify(jsonData);
            // 创建 XMLHttpRequest 对象
            var xhr = new XMLHttpRequest();
            // 设置请求信息
            // 替换为目标服务器的URL
            xhr.open('POST', url, true);
            xhr.setRequestHeader('Content-Type', 'application/json');

            // 设置回调函数
            xhr.onreadystatechange =async function() {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    var response = JSON.parse(xhr.responseText);

                    await checkData(response);

                } else {
                  //alert('提交失败,请手动提交!');

                }
            };

            // 发送请求
            xhr.send(jsonString);
    }

    //查询解析数据
   async function checkData(response){
        var searchResultData = response.data;
        var pageSize = searchResultData.pageSize;
        var pages = searchResultData.pages;


       customLog('本次自动巡检共导出:'+searchResultData.total + '条数据,共分'+ pages + '页导出,每页'+pageSize+'条数据。');

        //页循环
        for(var i = 1; i < pages + 1; i++){
            //存放违禁词
            var prohibitedWord = '';
            //判断视频内容是否违规
            var result = '';

            if(i === 1){
                //每一页数据循环查询
                for(var j = 0; j < searchResultData.dataList.length; j++){
                    var data = searchResultData.dataList[j];
                    //媒资ID
                    var assetId = data.assetId;
                    //标题
                    var assetName = data.assetName;
                    //审核结果
                    var auditStatusStr = data.auditStatusStr;
                    //违规处置标签
                    var labelName = data.labelName;
                    //备注
                    var auditRemark = data.auditRemark;
                    //进入通道时间
                    var aisleTime = data.aisleTime;
                    //AI审核通过结果
                    var aiAuditStatus = data.aiAuditStatus;
                    //上传用户ID
                    var author = data.author;


                    //标题敏感词审核
                    //判断标题和简介是否有违禁词
                    //存放违禁词
                    prohibitedWord = await titleContainsChineseWord(assetName);

                    if(aiAuditStatus !== '1' || aiAuditStatus !== 1){
                        //判断视频内容是否违规
                        result = await searchInferiorArtistOrProhibitedWord(assetId);
                        customLog(assetId + ',AI提示视频内容文字部分存在违禁词:'+prohibitedWord + result);
                    }
                    

                    //写入csv
                    const auditor1 = auditor;
                    const assetId1 = assetId;
                    const assetName1 = assetName.replace(/,/g, ',');
                    const auditStatusStr1 = auditStatusStr;
                    const labelName1= labelName;
                    const auditRemark1 = auditRemark.replace(/,/g, ',');
                    const aisleTime1 = aisleTime;
                    const violationDescription1 = prohibitedWord + result;
                    await queryData.push([auditor1, assetId1, author,assetName1,auditStatusStr1,labelName1,auditRemark1,aisleTime1,violationDescription1]);
                    customLog('成功写入第'+i+'页,第' + j + '条数据');
                }
            }else{
                //从第二页起需要重新请求数据
                // 拼接JSON对象
                var jsonData1 = {
                    "aiAuditStatus": "",
                    "aisleEndTime": "",
                    "aisleId": "",
                    "aisleStartTime": "",
                    "assetId": "",
                    "auditor":auditor,
                    "auditStatus": "",
                    "auditType": "",
                    "author": "",
                    "collectEndTime": "",
                    "collectStartTime": "",
                    "costTime": "",
                    "createTimeEndTime": "",
                    "createTimeStartTime": "",
                    "displayName": "",
                    "endTime": endTime,
                    "exclusiveKeyword": "",
                    "keywords": "",
                    "labelId": "",
                    "location": "2",
                    "MD5": "",
                    "mediumStatus": "",
                    "occurred": "",
                    "otherKeyword": "",
                    "pageNum": i,
                    "pageSize": 500,
                    "riskList": [],
                    "secondClassCode": "",
                    "startTime": startTime,
                    "thirdClassCode": "",
                    "titleKeyword": "",
                    "userId": "",
                    "userRiskList": [],
                    "videoType": ""
                };



                  // 调用发送POST请求的函数,并使用then()处理结果
                await sendPostRequest(jsonData1).then(async (response) => {
                    // 在这里执行后续代码
                    var responseData = response.data;
                    customLog('POST请求成功:'+ responseData);
                    //处理每页数据
                    await makeData(responseData,i);

                }).catch((error) => {
                    // 在这里处理请求失败或错误
                    customLog.error('处理请求失败或错误:'+ error);
                    // 在这里执行后续代码
                });
            }
        }
       //写入csv中
       await saveDataAsCSV(queryData);
       //查询结果记录在csv中的表头,violationDescription(违规说明)
       // 清空 queryData 数组,只保留表头行
       queryData.length = 1; // 或 queryData.splice(1);

        // 添加完成消息到文本区域
       customLog('自动巡检导出已完成!\n');
        // 结束捕获日志
       shouldCaptureLogs = false;
    }

    //处理第二页后的每页数据
   async function makeData(responseData,i){
        //存放违禁词
        var prohibitedWord = '';
        //判断视频内容是否违规
        var result = '';
        // 在这里处理返回的数据
        //每一页数据循环查询
        for(let j = 0; j < responseData.dataList.length; j++){

            var data = responseData.dataList[j];
            //AI审核通过结果
            var aiAuditStatus = data.aiAuditStatus;

            //标题敏感词审核
            //判断标题和简介是否有违禁词
            //存放违禁词
            prohibitedWord = await titleContainsChineseWord(data.assetName);
            //通过AI返回判断是否需要查询
            if(aiAuditStatus !== '1' || aiAuditStatus !== 1){
                //判断视频内容是否违规
                result = await searchInferiorArtistOrProhibitedWord(data.assetId);
                customLog(data.assetId + ',AI提示视频内容文字部分存在违禁词:'+prohibitedWord + result);
            }
            //写入csv
            const auditor1 = auditor;
            //媒资ID
            const assetId1 = data.assetId;
            //上传用户ID
            var author = data.author;
            //标题
            const assetName1 = data.assetName.replace(/,/g, ',');
            //审核结果
            const auditStatusStr1 = data.auditStatusStr;
            //违规处置标签
            const labelName1= data.labelName;
            //备注
            const auditRemark1 = data.auditRemark.replace(/,/g, ',');
            //进入通道时间
            const aisleTime1 = data.aisleTime;
            const violationDescription1 = prohibitedWord + result;
            queryData.push([auditor1, assetId1,author, assetName1,auditStatusStr1,labelName1,auditRemark1,aisleTime1,violationDescription1]);

            customLog('成功写入第'+i+'页,' + j + '条数据!');
        }


    }

    // 发送POST请求,并返回一个Promise对象
    function sendPostRequest(jsonData1) {

        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                method: 'POST',
                url: url,
                headers: {
                    'Content-Type': 'application/json',
                },
                data: JSON.stringify(jsonData1),
                onload: function(response) {
                    if (response.status === 200) {
                        const responseData = JSON.parse(response.responseText);
                        customLog('POST请求成功:'+responseData);
                        resolve(responseData); // 请求成功,将返回的数据传递给resolve
                    } else {
                        customLog.error('POST请求失败:'+ response.status + response.statusText);
                        reject(new Error('POST请求失败')); // 请求失败,传递错误对象给reject
                    }
                },
                onerror: function(error) {
                    customLog.error('发生错误:'+ error);
                    reject(error); // 请求发生错误,传递错误对象给reject
                }
            });
        });
    }
     //判断标题和介绍中是否存在违纪词语
    function titleContainsChineseWord(mySentence){
        var searchReturnWord = '';
        for (var i = 0; i < searchWordLibrary.length; i++) {
            var searchWord = searchWordLibrary[i];
            if(containsChineseWord(mySentence, searchWord)){
                searchReturnWord += searchWord;
            }
            //console.log(searchWord + ": " + containsChineseWord(mySentence, searchWord)+'-'+titleContainsChineseWordResult);
        }
        customLog(searchReturnWord);
        return searchReturnWord;
    }

    //查询劣迹艺人或许内容有违禁词
   async function searchInferiorArtistOrProhibitedWord(assetId){
        //存放返回结果
        var result = '';
         //存放链接
        var aiUrl = 'https://oes-coss.miguvideo.com:1443/oes-csas-manage/aia-record/video/result?assetId='+assetId;
        var aiResult = await getContent2(aiUrl);

       //等待0.5秒继续执行
       await wait(500);
        // 人脸名称
        //console.log(aiResult);
        //AI质检结果及文本结果
       // 访问其中的属性
       if(aiResult.data !== null){
           var dataAI = JSON.parse(aiResult.data);
           if(dataAI.hasOwnProperty("auditReason")){
               var auditReason = dataAI.auditReason;
               var dataList = dataAI.dataList;
               var faceNameSet = 'faceNameSet';
               var textSet = 'textSet';
               //使用前清空set
               localStorage.removeItem(faceNameSet);
               localStorage.removeItem(textSet);

               if(auditReason !== '通过'){
                   for(var i = 0; i < dataList.length; i++){
                       var dataListValue = dataList[i];

                       addToSet(dataListValue.text,textSet);
                       if('faces' in dataListValue ){
                           for(var j = 0; j < dataListValue.faces.length; j++){
                               var name = dataListValue.faces[j].name;
                               if (name === null || name === undefined || name === '') {
                                   continue; // 不允许存储空值
                               }else{
                                   addToSet(dataListValue.faces[j].name,faceNameSet);
                               }
                           }
                       }
                   }
                   //判断视频内文字是否存在违禁词
                   var prohibitedWord = await titleContainsChineseWord(getSet(textSet));

                   //存放违禁词
                   if(prohibitedWord !== ''){
                       result = ',AI提示视频字幕存在违禁词:'+prohibitedWord;
                       customLog(',AI提示视频内容文字部分存在违禁词:'+prohibitedWord);
                   }

                   //判断人名是否是劣迹艺人https://oes-coss.miguvideo.com:1443/oes-csas-words/figure/learn/findByPage?current=1&size=20&name=程峰&formerName=&country=&genre=&badProblem=&bak1=&bak2
                   var searchInferiorArtistUrl = 'https://oes-coss.miguvideo.com:1443/oes-csas-words/figure/learn/findByPage?current=1&size=20&name=';
                   //违禁艺人名称
                   var searchInferiorArtistName;
                   var faceSet = getSet(faceNameSet);
                   if(faceSet.length !== 0){
                       for(var item of faceSet){
                           searchInferiorArtistUrl = searchInferiorArtistUrl + item + '&formerName=&country=&genre=&badProblem=&bak1=&bak2=';
                           var searchInferiorArtisResult = await getContent(searchInferiorArtistUrl);
                           //等待0.5秒继续执行
                           await wait(500);
                           var total = searchInferiorArtisResult.data.total;
                           if(total !== 0){
                               searchInferiorArtistName = item;
                               var records = searchInferiorArtisResult.data.records;
                               var searchResult = '';
                               for(var g = 0; g < records.length; g++){
                                   var artistName = records[g].name;
                                   var artistGenre = records[g].genre;
                                   var artistControlDescription = records[g].controlDescription;
                                   searchResult = searchResult + ',人物库查询结果:劣迹艺人名称:'+ artistName +',劣迹类型:' + artistGenre + ',管控描述:'+ artistControlDescription;
                               }
                               result += ',AI提示视频内容出现违禁艺人:'+searchInferiorArtistName + searchResult;
                               customLog('AI提示视频内容出现违禁艺人:'+searchInferiorArtistName + searchResult);
                           }
                           searchInferiorArtistUrl = 'https://oes-coss.miguvideo.com:1443/oes-csas-words/figure/learn/findByPage?current=1&size=20&name=';
                       }
                   }
               }
           }else{
               //老版本的AI结果查询
               var results = dataAI.results;
               var resultWord = '';
               for(var h = 0; h < results.length; h ++){

                  resultWord = resultWord + '违禁内容提示:' + results[h].label + ',' + results[h].scene;
               }
               //场景结果存储
               result = resultWord;

           }
       }
           

        return result;

    }

        // 判断中文语句中是否包含特定中文词语
    function containsChineseWord(sentence, word) {
        // 使用 "u" 标志启用 Unicode 正则匹配
        var regex = new RegExp(word, 'u');
        return regex.test(sentence);
    }

    // 发起 GET 请求获取通用方法
    async function getContent(url) {
        return new Promise(await function(resolve, reject) {
            fetch(url)
                .then(function(response) {
                return response.json();
            })
                .then(function(data) {
                resolve(data);
            })
                .catch(function(error) {
                reject(error);
            });
        });
    }
    // 发起 GET 请求获取腾讯文档内容
    async function getContent2(url) {
        return await new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                method: 'GET',
                url: url,
                onload: function(response) {
                    if (response.status === 200) {
                        const responseData = JSON.parse(response.responseText);
                        //customLog.log('GET请求成功:', responseData);
                        resolve(responseData); // 请求成功,将返回的数据传递给resolve
                    } else {
                        console.error('GET请求失败:', response.status, response.statusText);
                        reject(new Error('GET请求失败')); // 请求失败,传递错误对象给reject
                    }
                },
                onerror: function(error) {
                    console.error('发生错误:', error);
                    reject(error); // 请求发生错误,传递错误对象给reject
                }
            });
        });
    }

     // 函数:添加元素到Set
    function addToSet(value,setName) {
         if (value === null || value === undefined || value === '') {
            return; // 不允许存储空值
        }
        var set = getSet(setName);
        if (!set.includes(value)) {
            set.push(value);
            saveSet(set,setName);
        }
    }

        // 函数:从Set中移除元素
    function removeFromSet(value,setName) {
        var set = getSet(setName);
        var index = set.indexOf(value);
        if (index !== -1) {
            set.splice(index, 1);
            saveSet(set,setName);
        }
    }

    // 函数:获取Set
    function getSet(setName) {
        var setString = localStorage.getItem(setName);
        if (setString) {
            return JSON.parse(setString);
        } else {
            return [];
        }
    }

    // 函数:保存Set
    function saveSet(set,setName) {
        localStorage.setItem(setName, JSON.stringify(set));
    }


    // 示例数据
    //const dynamicData = [
    //    ['Name', 'Age', 'Email'], // 表头行
    //    ['John', 30, 'john@example.com'],
    //    ['Jane', 25, 'jane@example.com']
    //];

    // 生成CSV格式数据
    function convertToCSV(data) {
        const csv = data.map(row => row.join(',')).join('\n');
        return csv;
    }

    // 创建并下载CSV文件
    function downloadCSV(csvContent, filename) {
        const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    }

    // 保存数据为CSV文件
    function saveDataAsCSV(data) {
        const csvContent = convertToCSV(data);
        const filename = 'data.csv';
        downloadCSV(csvContent, filename);
    }

    // 在需要的时候调用 saveDataAsCSV 函数来保存数据为CSV文件
    // 替换为实际的动态数据
    //saveDataAsCSV(dynamicData);


    // 格式化时间函数
    function formatDateTime(dateTimeStr) {
        const dateTime = new Date(dateTimeStr);
        const year = dateTime.getFullYear();
        const month = String(dateTime.getMonth() + 1).padStart(2, '0');
        const day = String(dateTime.getDate()).padStart(2, '0');
        const hours = String(dateTime.getHours()).padStart(2, '0');
        const minutes = String(dateTime.getMinutes()).padStart(2, '0');
        const seconds = String(dateTime.getSeconds()).padStart(2, '0');

        return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
    }

    //等待方法
    function wait(ms) {
        return new Promise((resolve) => setTimeout(resolve, ms));
    }

        // 无法重写log方法,就重新构建一个方法
    function customLog(message) {
        // 将消息发送到原始的console.log
        console.log(message);

        // 检查是否需要捕获日志,并在需要时将其添加到文本区域
        if (shouldCaptureLogs) {
            logArea.textContent += message + '\n';
            // 自动滚动到底部
            logArea.scrollTop = logArea.scrollHeight;
        }
    }


})();