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

[油猴脚本开发指南]XHR劫持代码原理解释

[复制链接]
  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 56 天

    [LV.5]常住居民I

    352

    主题

    3110

    帖子

    3115

    积分

    管理员

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

    Rank: 10Rank: 10Rank: 10

    积分
    3115

    猫咪币纪念章国庆纪念章中秋纪念章荣誉开发者家财万贯管理员

    发表于 2021-7-19 16:44:15 | 显示全部楼层 | 阅读模式

    代码可以参考https://bbs.tampermonkey.net.cn/forum.php?mod=viewthread&tid=357&highlight=xmlhttp

    这是我之前在国外论坛找到的一个小栗子

    
    function addXMLRequestCallback(callback){
        是一个劫持的函数
        var oldSend, i;
        if( XMLHttpRequest.callbacks ) {
          判断XMLHttpRequest对象下是否存在回调列表,存在就push一个回调的函数
            // we've already overridden send() so just add the callback
            XMLHttpRequest.callbacks.push( callback );
        } else {
            // create a callback queue
            XMLHttpRequest.callbacks = [callback];
            如果不存在则在xmlhttprequest函数下创建一个回调列表
            // store the native send()
            oldSend = XMLHttpRequest.prototype.send;
            获取旧xml的send函数,并对其进行劫持
            // override the native send()
            XMLHttpRequest.prototype.send = function(){
                // process the callback queue
                // the xhr instance is passed into each callback but seems pretty useless
                // you can't tell what its destination is or call abort() without an error
                // so only really good for logging that a request has happened
                // I could be wrong, I hope so...
                // EDIT: I suppose you could override the onreadystatechange handler though
                for( i = 0; i < XMLHttpRequest.callbacks.length; i++ ) {
                    XMLHttpRequest.callbacks[i]( this );
                }
                循环回调xml内的回调函数
                // call the native send()
                oldSend.apply(this, arguments);
               由于我们获取了send函数的引用,并且复写了send函数,这样我们在调用原send的函数的时候,需要对其传入引用,而arguments是传入的参数
            }
        }
    }
    
    // e.g.
    addXMLRequestCallback( function( xhr ) {
            调用劫持函数,填入一个function的回调函数
            回调函数监听了对xhr调用了监听load状态,并且在触发的时候再次调用一个function,进行一些数据的劫持以及修改
            xhr.addEventListener("load", function(){
            if ( xhr.readyState == 4 && xhr.status == 200 ) {
                console.log( xhr.responseURL );
            }
        });
    
    });
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。

    该用户从未签到

    0

    主题

    7

    帖子

    9

    积分

    助理工程师

    Rank: 1

    积分
    9

    新人报道

    发表于 2022-2-18 12:49:18 | 显示全部楼层
    真神了
    回复

    使用道具 举报

    发表回复

    本版积分规则

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