上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 李恒道 - 

[脚本实战篇]分析如何自动打开对话框

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6760

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2022-5-11 00:27:49 | 显示全部楼层 | 阅读模式

    前言

    之前我们学习了如何获取GetRess返回的具体每个小节的数据
    这节课我们继续学习如何调用原网页对话框

    我们首先整理一下上节课的代码

    function InjectButtonToBody(){
        let btn=document.createElement("div");
        btn.innerHTML='<button style="position: fixed;bottom: 80vw;right: 0;z-index: 9999;height: 50px;">开始刷课</button>';
        btn.onclick=function(){
            ChapterList=[]
            ChapterList=ChapterList.concat(...document.querySelectorAll(".shareResources > .panel-group > li"))
            let ParentChapert= document.querySelectorAll(".shareResources > .panel-group > li:not(.noContent)")
            ParentChapert.forEach((item) => {
                ChapterList=ChapterList.concat(...item.querySelectorAll(".chapter-content [data-secid]"))
            });
            ChapterList= ChapterList.map((item)=>item.getAttribute("data-id")??item.getAttribute("data-secid"))
            AutoExecteChaprterMission(ChapterList)
        }
        document.body.append(btn);
    }
    InjectButtonToBody()
    

    处理出来id列表之后传给AutoExecteChaprterMission函数
    由他读取每个章的数据,然后处理章的每个内容数据
    那么可以编写代码如下

    async function AutoExecteChaprterMission(ChapterList){
        for(let index=0;index<ChapterList.length;index++){
            let CurrentChapert=ChapterList[index]//获取每个章
            let ContentList=await GetRessList(CurrentChapert)//获取该章数据
    
            for(let ContentIndex=0;ContentIndex<ContentList.length;ContentIndex++){
                let CurrentContent=ContentList[ContentIndex]//遍历内容数据列表
                await ExecteContentMission(CurrentContent)//执行内容
                return;
            }
    
        }
    }

    执行内容的话为了阻断,我们也写一个promise包装函数
    图片.png
    因为点击章节会弹出一个对话框,对话框内包含内容
    可以播放视频或者ppt
    所以我们可以先封装一个OpenOriginDialog函数,先填写这个函数内容

    async function ExecteContentMission(Contet){
        return new Promise((resolve,reject)=>{
            OpenOriginDialog(Contet)
            //执行相关内容
        })
    }

    先分析对话框的触发位置
    对body进行全局断点,准备好之后我们点击章节
    图片.png
    打错断点了
    打到iframe外了
    我们重新打一次
    图片.png
    在这里停了下来
    图片.png
    查看堆栈
    发现dialog很可疑
    图片.png
    我们点进去查看一下
    图片.png
    可以大概看到这里只是声明一个dialog,实际还在更上级
    图片.png
    再往上走一层
    找到了这里
    图片.png
    可以看到这里100%是对话框的触发位置

    url:data.url,
    companyCode:companyCode,//三方公司id
    resId:data.id,
    type:data.type,
    userId:userId,
    courseId:courseId,
    title:data.title

    我们观察一下传入的数据
    data就是我们之前获取的章节内的每个小节的各种数据
    url,资源id,标题等等
    我们还缺userID,courseId,Companycode的id等等
    可以往上翻一翻看看
    找到了这里
    图片.png
    通过define知道了这个是一个requirejs的模块代码
    我们可以通过require([模块列表],回调函数)来读取代码
    很方便
    而课程id在window上,也很方便
    图片.png
    那么理论建立完毕
    开始秒杀代码

    function OpenOriginDialog(Content){
        unsafeWindow.require(["Play"],function(Play){
            let courseId=unsafeWindow._courseId;
            let userId=unsafeWindow._userId;
            let companyCode=unsafeWindow._companyCode;
            Play.dialog({
                //唯一ID
                id:"videoBox-link",
                data:{
                    url:Content.fullResUrl,
                    companyCode:companyCode,//三方公司id
                    resId:Content.id,
                    type:Content.mediaType,
                    userId:userId,
                    courseId:courseId,
                    title:Content.title+'-李恒道破解'
                },
                //弹出框宽度
                width:"auto",
                //弹出框高度
                height:(screen.availHeight-200) + "px",
                //是否开启打点功能
                isTicker:true
            });
    
        })
    }

    测试一下
    可以发现我们已经可以通过js代码来唤起视频内容了
    图片.png
    下节课我们研究通信,以及对url进行分类
    以及videojs的注入

    结语

    撒花~

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表