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

关于监听后的劫持

[复制链接]
  • TA的每日心情
    慵懒
    2022-12-15 18:02
  • 签到天数: 2 天

    [LV.1]初来乍到

    3

    主题

    9

    帖子

    14

    积分

    助理工程师

    Rank: 1

    积分
    14
    发表于 2023-1-20 22:02:08 | 显示全部楼层 | 阅读模式
    10油猫币

    大佬们好,还是在折腾网课培训的中年小白又来了。

    上个月我在https://bbs.tampermonkey.net.cn/thread-3874-1-1.html
    发了一个提问。实际上这个培训早就结束了,但我现在放假有空仍在折腾。
    当时提的几个问题有的已经搞清楚了。

    现在还有一个问题搞懂了一小半。
    就是关于页面不在最前时,视频会停止播放的问题。

    我看到大佬回复用addeventlistener劫持。于是也看了一些关于addeventlistener的视频和实例,但似乎跟我要求的都不太一样。我写了一段监听的(其实都是半抄半写的)

    document.addEventListener("visibilitychange", function () { if (document.hidden) { console.log("隐藏"); } else{ console.log("显示") } });

    现在只能输出 状态。又写了一段关于定时器强行播放的

    setInterval(function () { var current_video = document.getElementsByTagName('video')[0] current_video.play()}, 500)//无视最小化,但放完会重头放

    这个虽然可以播放下去,但是不利于 后面跳到下一课。
    之后我发现原网页中本来就监听了且打印出来
    snap_screen_20230120160708.png

    所以我第一段代码其实没什么用,跟原网页是重复的。我只监听了页面状态变化,却无法改变视频停止的状态。因为当页面恢复visible时,视频仍然是停止的,要点一下播放才会继续。

    那我要怎么劫持原网页的监听呢?
    我看了道哥B站的第三十一讲 addEventListener介绍与劫持
    用了
    EventTarget.prototype.addEventListener=function(){ console.log('我被劫持了') }
    这下把所有的监听都劫持了,油猴跑不了了,连视频播放前的弹窗都点不下去。
    还是说,我也监听视频播放的状态,每当发现停止,就去点击播放?这样似乎跟强行播放没什么区别?
    请大神们指点一二,我已经查过好多资料了,还是没有找到比较有用的,可能我使用的关系字不对。

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    21

    主题

    624

    帖子

    1080

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    1080

    卓越贡献活跃会员热心会员突出贡献三好学生荣誉开发者喜迎中秋油中2周年

    发表于 2023-1-20 22:28:01 | 显示全部楼层
    这个不叫劫持,addEventListener是正常的添加监听事件,劫持是对原有事件做修改。setInterval可以通过clearInterval停止,所以你的问题可以在视频播放完毕后clearInterval,然后跳转下一页,不过这个方案也不够好,因为浏览器会在网页休眠期间调大定时器的时间间隔,可能造成视频播放断断续续,最好是直接监听暂停事件:
    1. const video = document.querySelector('video');
    2. // 监听暂停事件
    3. video.addEventListener('pause', e => {
    4.     video.play();
    5. });
    6. // 监听播放完毕事件
    7. video.addEventListener('ended', e => {
    8.     // 这里写跳转下一页的代码
    9. });
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 23:59
  • 签到天数: 170 天

    [LV.7]常住居民III

    470

    主题

    4281

    帖子

    4322

    积分

    管理员

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

    Rank: 10Rank: 10Rank: 10

    积分
    4322

    喜迎中秋国庆纪念章荣誉开发者管理员油中2周年

    发表于 2023-1-20 23:25:50 | 显示全部楼层
    c大答得差不多了

    我就补一个小问题吧
    结束事件实测会有一些bug
    有些视频好像因为编码问题会卡在最后一秒
    比如2分51秒只能播放到2分50秒
    最后一秒虽然在播放但是永远播放不完
    目前找到比较好的一点方案是禁止掉暂停按钮之后
    监听视频的播放进度
    如果达到一定的百分比或时间不改变了就跳
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-12-15 18:02
  • 签到天数: 2 天

    [LV.1]初来乍到

    3

    主题

    9

    帖子

    14

    积分

    助理工程师

    Rank: 1

    积分
    14
    发表于 2023-1-25 16:48:41 | 显示全部楼层
    cxxjackie 发表于 2023-1-20 22:28
    这个不叫劫持,addEventListener是正常的添加监听事件,劫持是对原有事件做修改。setInterval可以通过clear ...

    感谢二位大佬的回答。

    那这是对暂停后的继续播放。这样可能会卡顿。
    有没有办法劫持原网页的监听,使它不知道处于hidden状态
    也就不会暂停。

    应该怎么实现呢?
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 23:59
  • 签到天数: 170 天

    [LV.7]常住居民III

    470

    主题

    4281

    帖子

    4322

    积分

    管理员

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

    Rank: 10Rank: 10Rank: 10

    积分
    4322

    喜迎中秋国庆纪念章荣誉开发者管理员油中2周年

    发表于 2023-1-25 17:12:43 | 显示全部楼层
    thediy 发表于 2023-1-25 16:48
    感谢二位大佬的回答。

    那这是对暂停后的继续播放。这样可能会卡顿。

    https://bbs.tampermonkey.net.cn/ ... ;highlight=addevent
    过滤掉对应的事件监听器
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 23:59
  • 签到天数: 170 天

    [LV.7]常住居民III

    470

    主题

    4281

    帖子

    4322

    积分

    管理员

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

    Rank: 10Rank: 10Rank: 10

    积分
    4322

    喜迎中秋国庆纪念章荣誉开发者管理员油中2周年

    发表于 2023-1-25 18:26:02 | 显示全部楼层
    thediy 发表于 2023-1-25 16:48
    感谢二位大佬的回答。

    那这是对暂停后的继续播放。这样可能会卡顿。

    对了
    即使你过滤掉了最小化的问题
    浏览器页面被隐藏后会进行性能处理
    类似于问题参考
    https://bbs.tampermonkey.net.cn/ ... thread&tid=1987
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    21

    主题

    624

    帖子

    1080

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    1080

    卓越贡献活跃会员热心会员突出贡献三好学生荣誉开发者喜迎中秋油中2周年

    发表于 2023-1-25 22:54:25 | 显示全部楼层
    thediy 发表于 2023-1-25 16:48
    感谢二位大佬的回答。

    那这是对暂停后的继续播放。这样可能会卡顿。

    这个卡顿很小的,你都挂后台了,小卡一下应该无所谓吧。阻止暂停有很多种思路,具体要看他代码怎么实现的,除了移除对应监听器(这个是最麻烦的),如果代码读取的是document.hidden的状态,可以对hidden的读取做劫持:
    1. Object.defineProperty(document, 'hidden', {
    2.     get: () => false
    3. });
    复制代码

    更简单粗暴的是把视频的暂停方法弄没:
    1. video.pause = () => {};
    复制代码
    回复

    使用道具 举报

    发表回复

    本版积分规则

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