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

[油猴脚本开发指南]addEventListener劫持

[复制链接]
  • TA的每日心情
    开心
    2023-1-30 10:43
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    17

    回帖

    18

    积分

    助理工程师

    积分
    18

    新人报道

    发表于 2021-12-29 17:27:31 | 显示全部楼层
    cxxjackie 发表于 2021-9-10 21:26
    其实只要记住一个通用的公式就好了:XXX是原函数,劫持函数的时候把这句放进去,基本错不了。 ...

    ggnb!ggnb!ggnb!
    回复
    订阅

    使用道具 举报

  • TA的每日心情
    无聊
    2023-9-5 15:56
  • 签到天数: 54 天

    [LV.5]常住居民I

    14

    主题

    75

    回帖

    112

    积分

    中级工程师

    积分
    112
    发表于 2023-4-6 22:03:46 | 显示全部楼层
    大佬能再详细讲一下吗?
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5189

    回帖

    6073

    积分

    管理员

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

    积分
    6073

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

    发表于 2023-4-6 23:05:08 | 显示全部楼层
    琦玉 发表于 2023-4-6 22:03
    大佬能再详细讲一下吗?

    具体哪部分没理解
    这个其实就是常规的hook过滤,来搞事件
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    无聊
    2023-9-5 15:56
  • 签到天数: 54 天

    [LV.5]常住居民I

    14

    主题

    75

    回帖

    112

    积分

    中级工程师

    积分
    112
    发表于 2023-4-7 15:35:14 | 显示全部楼层
    李恒道 发表于 2023-4-6 23:05
    具体哪部分没理解
    这个其实就是常规的hook过滤,来搞事件

    谢谢大佬,我自己研究了下也搞明白了。
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-1-12 12:03
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    0

    主题

    2

    回帖

    8

    积分

    助理工程师

    积分
    8
    发表于 2023-10-17 19:40:17 | 显示全部楼层
    本帖最后由 Class 于 2023-10-17 19:43 编辑

    @李恒道

    新人小白求教,首先先感谢作者大大的教程,csdn、抖音等页面成功劫持了

    但油管刷新页面,过了一段时间,检测到去广告扩展时,阻止滚动的wheel、scroll事件才开始绑定上

    阻止滚动的有两个,都在`desktop_polymer_enable_wil_icons.js`这个js中:

    1. scroll事件:

      __onCaptureScroll: function(a) {
                if (!(this.__isAnimating || 0 <= Hw(a).path.indexOf(this)))
                    switch (this.scrollAction) {
                    case "lock":
                        this.__restoreScrollPosition();
                        break;
                    case "refit":
                        this.__deraf("refit", this.refit);
                        break;
                    case "cancel":
                        this.cancel(a);
                    }
            },
    2. wheel事件:

        function _scrollInteractionHandler$$module$third_party$javascript$youtube_components$tp_yt_iron_overlay_behavior$tp_yt_iron_scroll_manager(a) {
            a.cancelable && _shouldPreventScrolling$$module$third_party$javascript$youtube_components$tp_yt_iron_overlay_behavior$tp_yt_iron_scroll_manager(a) && a.preventDefault();
            a.targetTouches && (a = a.targetTouches[0],
            hJb = a.pageX,
            iJb = a.pageY)
        }


    像这种情况该如何处理呢
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-10-17 22:34:08 | 显示全部楼层
    Class 发表于 2023-10-17 19:40
    @李恒道

    新人小白求教,首先先感谢作者大大的教程,csdn、抖音等页面成功劫持了

    跟过一段时间没关系吧,只要一直保持劫持肯定能抓到,问题主要在判断是哪个事件上了,对函数做toString处理是比较简单的,对比某些特征代码就可以筛选出来:
    1. EventTarget.prototype.addEventListener = function(...args) {
    2.     console.log(args[1].toString())
    3.     oldadd.call(this,...args)
    4. }
    复制代码

    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-1-12 12:03
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    0

    主题

    2

    回帖

    8

    积分

    助理工程师

    积分
    8
    发表于 2023-10-18 10:09:36 | 显示全部楼层
    本帖最后由 Class 于 2023-10-18 11:02 编辑
    cxxjackie 发表于 2023-10-17 22:34
    跟过一段时间没关系吧,只要一直保持劫持肯定能抓到,问题主要在判断是哪个事件上了,对函数做toString处 ...

    谢谢大佬回复❤

    依旧无法劫持,这段代码有啥问题吗
    ```js

      if (document.URL.includes('youtube.com/watch')) {
        const oldAdd = EventTarget.prototype.addEventListener;
        const targetArray = ['a.targetTouches[0]','this.__restoreScrollPosition();'];
      
        EventTarget.prototype.addEventListener = function (type, eventListener, options) {
          const eventListenerString = eventListener.toString();
          if (type === 'wheel' || type === 'scroll') {
            console.log(eventListenerString)
            if (targetArray.some(target => eventListenerString.includes(target))) {
              console.warn('劫持成功');
              return;
            }
          }
          return oldAdd.call(this, type, eventListener, options);
        };
      }

    ```
    _scrollInteractionHandler$$module$third_party$javascript$youtube_components$tp_yt_iron_overlay_behavior$tp_yt_iron_scroll_manager 函数

    __onCaptureScroll 函数


    都没有被打印出来


    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-10-19 22:35:45 | 显示全部楼层
    Class 发表于 2023-10-18 10:09
    谢谢大佬回复❤

    依旧无法劫持,这段代码有啥问题吗

    我没在油管页面测试过,要翻墙太麻烦了,这种情况我猜测可能有2个原因:
    1、绑定事件的时机过早,可能早于你的脚本执行时机,虽然跟你的描述不符,但最好还是再检查一下。
    2、存在iframe框架,事件绑在iframe内部了,而你在外部劫持所以没获取到,需要将脚本match进iframe内才能成功。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-17 18:40
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    15

    回帖

    22

    积分

    荣誉开发者

    积分
    22

    新人报道油中2周年油中3周年荣誉开发者

    发表于 2023-11-6 02:05:28 | 显示全部楼层
    wjy0 发表于 2021-9-11 10:30
    hook addeventlistener想不到有什么应用场景

    对一些用各类框架开发的网站有奇效,反正那些框架也是通过addeventlistener来实现功能,用hook直接抢在框架前干活,我的脚本就有用到。
    回复

    使用道具 举报

    123
    返回列表 发新帖

    发表回复

    本版积分规则

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