V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Telegram
V2EX  ›  问与答

请教前段牛,如何劫持 window.onblur 事件?

  •  
  •   Telegram · 2017-11-09 14:45:28 +08:00 · 6000 次点击
    这是一个创建于 2331 天前的主题,其中的信息可能已经有所发展或是发生改变。
    老妹是个注册会计,每年都要在 chinahrt.com 听一些无聊的东西,刷满 18 学时。
    它的播放页是个 flash,听课时,只要该页面失去焦点,播放就暂停,也就无法计时了。



    我就想能不能用 Tamperm onkey 把 window. onblur 事件劫持了,不要运行后面的暂停函数。
    38 条回复    2017-11-29 18:26:40 +08:00
    hatw
        1
    hatw  
       2017-11-09 14:50:55 +08:00
    开个虚拟机在里边让它自己播?在外边操作应该不影响虚拟机里边的浏览器焦点吧?
    Telegram
        2
    Telegram  
    OP
       2017-11-09 14:53:29 +08:00
    @hatw #1 这个方案我是考虑过滴,算是备选的,不够优雅。哈哈
    safedogcc
        3
    safedogcc  
       2017-11-09 14:54:20 +08:00
    不用“劫持”,直接把 window.onblur 设置为 null,或者把 blurStop 函数设置为 null 即可(如果全局):

    ``` js
    window.onblur = null;
    blurStop = () => null;
    ```
    a342191555
        4
    a342191555  
       2017-11-09 14:54:58 +08:00
    不知道直接 window.onblur=null 是否可以
    Telegram
        5
    Telegram  
    OP
       2017-11-09 14:59:22 +08:00
    @safedogcc #3
    @a342191555 #4
    let me have a try
    m939594960
        6
    m939594960  
       2017-11-09 15:01:04 +08:00
    你劫持 blurStop() 为啥要劫持 onblur
    Telegram
        7
    Telegram  
    OP
       2017-11-09 15:02:28 +08:00
    @m939594960 #6 应该是我表述问题,哈哈,就是不让 blurStop()执行
    Telegram
        8
    Telegram  
    OP
       2017-11-09 15:22:55 +08:00
    @safedogcc #3
    @a342191555 #4
    试了下,不行。看来没有辣么简单。

    要是哪个大侠有兴趣帮忙看看,感激不尽了

    我先去下个虚拟机先应付一下。
    https://gist.github.com/anonymous/5576f83076d645fca4a9bdfea68b5e84
    Sypher
        9
    Sypher  
       2017-11-09 15:25:00 +08:00
    注册会计,厉害了
    safedogcc
        10
    safedogcc  
       2017-11-09 15:26:06 +08:00
    @Telegram #8
    其实可以换个角度,不用在 blurStop 上下功夫,模拟一下 onfocus 呢~~
    ``` js
    setInterval(window.focus, 1000)
    ```
    Telegram
        11
    Telegram  
    OP
       2017-11-09 15:29:24 +08:00
    @Sypher #9 这个,不带这么嘲讽的,小哥
    m939594960
        12
    m939594960  
       2017-11-09 15:39:27 +08:00
    http://guajibao.me/ 一块钱一天。 100 块解决这个问题?
    ysc3839
        13
    ysc3839  
       2017-11-09 15:52:59 +08:00 via Android
    我们学校也有类似的任务要完成,我的做法是虚拟机
    Telegram
        14
    Telegram  
    OP
       2017-11-09 16:03:17 +08:00
    @ysc3839 #13
    这是另外一个需要学习的,那个系统比较简单,定时弹出知识点让你做题,同时播放暂停。只要把相应的弹出框隐藏,然后执行继续播放就行
    Telegram
        15
    Telegram  
    OP
       2017-11-09 16:04:11 +08:00
    @m939594960 #12 我看了下,没那么便宜,还不如我的虚拟机
    Telegram
        16
    Telegram  
    OP
       2017-11-09 16:05:21 +08:00
    @safedogcc #10 没那么简单,获得焦点不会触发继续播放,需要手动去点击播放按钮的,这后面可能涉及好几个操作,比如开始计时这些
    hatw
        17
    hatw  
       2017-11-09 16:05:35 +08:00
    @Telegram #2 简单嘛。。。系统再怎么改进反作弊都不怕。。。除非摄像头活人人脸识别了,哈哈哈
    xavierskip
        18
    xavierskip  
       2017-11-09 16:20:28 +08:00
    我有经验,弄过。先清除 onfocus 和 onblur,然后去掉所有的定时器,最后自己实现 ajax 发送请求。
    不知道适不适合你的课程。

    https://gist.github.com/xavierskip/8f4dd9d593dfe8ea1565f5753cdcdf4a
    shyling
        19
    shyling  
       2017-11-09 16:26:49 +08:00
    我以前的做法是用 charles 过滤那段脚本,把对应代码删掉。。。这方法应该靠谱
    begoingtodo
        20
    begoingtodo  
       2017-11-09 16:29:06 +08:00
    whistle 或者 fiddler 工具会用么,本地替换线上代码,随你修改
    Telegram
        21
    Telegram  
    OP
       2017-11-09 16:31:11 +08:00
    @xavierskip #18 你这个好像很彻底,不过感觉我那个网站流程比较复杂,不然我都打算自己写个客户端发请求了。
    Telegram
        22
    Telegram  
    OP
       2017-11-09 16:31:46 +08:00
    @shyling #19
    @begoingtodo #20
    这 2 个思路不错,么么哒
    xavierskip
        23
    xavierskip  
       2017-11-09 16:43:14 +08:00
    @Telegramyun.chinahrt.com 这上面的课程吗?应该都是差不多的。会在服务端验证你的播放时间的,貌似绕不过去,专门的客户端也就没什么意义了,就在页面上修改脚本就可以了。
    jin5354
        24
    jin5354  
       2017-11-09 17:07:39 +08:00
    charles map-remote 再也不用考虑本地 hack 了
    Telegram
        25
    Telegram  
    OP
       2017-11-09 18:12:46 +08:00
    @xavierskip #23 对,就是 yun.chinahrt.com 的课程, 我到家仔细看了下,你的代码,确实应该一样的。我也看了下他的请求,貌似就是隔几秒一个请求,发送播放到的时间点 reqLessonLocation
    Telegram
        26
    Telegram  
    OP
       2017-11-09 19:37:38 +08:00
    问题大概解决了,和大家分享一下:
    这个页面有 2 个 iframe,根据 @xavierskip #18 提示,在 console 中选择 context,执行
    window.onblur = function(){console.log('onblur')};
    把 onblur 事件触发暂停给替换掉,然后就可以不触发暂停了。

    然后看 network 发现,计时其实很简单,一开始太高看他了,就是每 30 秒一个请求而已。

    这样的话,就可以直接写个程序开始脱机挂机了。懒得搞,用网页挂也可以。
    Telegram
        27
    Telegram  
    OP
       2017-11-09 20:03:56 +08:00
    @xavierskip #23 然后我尝试了一下,服务端根本没做限制,我的天,可以一个请求秒杀。


    直接改其中的 reqLessonLocation 就行了。这个就是播放进度,单位是秒。直接提交视频总时长的秒数,就直接学习完了。。。
    xavierskip
        28
    xavierskip  
       2017-11-09 22:34:00 +08:00
    @Telegram #27 好样的,不过我今年的学完了。留着明年看看还有没有用!
    yingfengi
        29
    yingfengi  
       2017-11-09 23:35:54 +08:00 via Android
    虚拟机,出
    ysc3839
        30
    ysc3839  
       2017-11-10 04:42:37 +08:00 via Android
    @Telegram 要感谢一下你,我去看了一下我学校的那个网站,发现也是 onblur 暂停。现在的方法是把 pauseMovie 改成 playMovie,最小化之后自动播放。
    sypopo
        31
    sypopo  
       2017-11-29 13:59:11 +08:00
    @Telegram 具体怎么改呀
    Telegram
        32
    Telegram  
    OP
       2017-11-29 15:02:05 +08:00 via iPhone
    @sypopo #31 同一个听课网站?
    sypopo
        33
    sypopo  
       2017-11-29 16:32:46 +08:00 via Android
    同一个网站,失去焦点暂停播放搞定了,那个进度时间不知道怎么改。
    sypopo
        34
    sypopo  
       2017-11-29 16:33:32 +08:00 via Android
    @Telegram 是的,同一个。
    Telegram
        35
    Telegram  
    OP
       2017-11-29 17:31:40 +08:00 via iPhone
    @sypopo #34 改进度太暴力,就怕后台能看出来
    Telegram
        36
    Telegram  
    OP
       2017-11-29 17:34:36 +08:00 via iPhone
    @sypopo #34 看我 27 楼那个图片,听课时抓个包,然后修改其中 reqLessonLocation 的值,然后发送这个包就行了。
    sypopo
        37
    sypopo  
       2017-11-29 18:23:30 +08:00 via Android
    @Telegram 已经搞定学完了。
    Telegram
        38
    Telegram  
    OP
       2017-11-29 18:26:40 +08:00
    @sypopo #37 真暴力,祝你好运
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2650 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:49 · PVG 23:49 · LAX 08:49 · JFK 11:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.