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

ajax劫持库ajaxHooker

  [复制链接]
  • TA的每日心情
    开心
    2024-7-30 00:00
  • 签到天数: 122 天

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-1-2 13:51:41 | 显示全部楼层
    Major 发表于 2023-1-1 23:56
    兄弟,你研究好了吗,能否共享你的完整代码我套用一下

    别老想着套用兄弟,情况远比想象的复杂,也是没找到能在所有网站通用的方案

    特别一些大型网站,他们自己都在互相这样玩,弄得页面卡卡的风扇都转圈了。这玩意一个不慎就会影响网络通畅。

    用过 https://github.com/wendux/Ajax-hook 库,也是问题多多,经常弄得页面白屏了也不知道因为啥

    还是等C老师看能不能解决这些眼面前的难题,毕竟最强大脑担当
    回复
    订阅

    使用道具 举报

    该用户从未签到

    16

    主题

    56

    回帖

    91

    积分

    初级工程师

    积分
    91

    新人报道

    发表于 2023-1-2 20:28:45 | 显示全部楼层

    cxxjackie 发表于 2023-1-1 22:45

    不行的,这个只是因为请求的快慢不一,AB的完成时间应该差不多,多次刷新导致B比A先完成了,所以B能改变A ...

    有没有可能劫持post,包括请求url,请求headers,还有cookies,data等全部信息。然后将这些信息发送到自己的服务器。在自己服务器模拟请求,并修改数据后,将修改的数据再返回来,传递到页面。但是具体怎么实现不太会弄,有没有这种可能

    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

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

    发表于 2023-1-2 21:03:54 | 显示全部楼层
    Major 发表于 2023-1-2 20:28
    [md]有没有可能劫持post,包括请求url,请求headers,还有cookies,data等全部信息。然后将这些信息发送到自 ...

    是可以的,这就是异步修改响应数据,你先试试我那段代码可不可行,按你的需求就是缺少headers、data等信息,这部分代码在库里面可以找到。我再看看吧,这个要加进库里的话,得做很多改动。
    回复

    使用道具 举报

    该用户从未签到

    16

    主题

    56

    回帖

    91

    积分

    初级工程师

    积分
    91

    新人报道

    发表于 2023-1-2 23:31:24 | 显示全部楼层
    本帖最后由 Major 于 2023-1-3 00:15 编辑
    cxxjackie 发表于 2023-1-2 21:03
    是可以的,这就是异步修改响应数据,你先试试我那段代码可不可行,按你的需求就是缺少headers、data等信 ...

    截获原网站post 并修改 request.url 指向(修改请求地址,到自己的服务器,在自己的服务器模拟请求),遇到跨域问题

    Access to XMLHttpRequest at 'http://127.0.0.1:16999/ylyf/api/post' from origin '原来网站,脚本工作的站点' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.


    同时cookie 好像也还没用。这样个人服务器即便接收到转发,好像也没法模拟请求
    1.     hookJson3:function(){
    2.         ajaxHooker.hook(request => {
    3.             if (request.url === '/api/show' && request.method === 'POST'){
    4.                 console.log('test:',request);
    5.                 console.log('test_url:',request.url);
    6.                 console.log('test_headers',request.headers);
    7.                 console.log('test_data',request.data);
    8.                 console.log('test_cookies',request.cookies);
    9.                 request.url = 'http://127.0.0.1:5000/ylyf/api/post'
    10.                 console.log('test:',request.url);
    11.             }

    12.         });
    13.     },
    复制代码





    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

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

    发表于 2023-1-3 12:37:54 | 显示全部楼层
    Major 发表于 2023-1-2 23:31
    截获原网站post 并修改 request.url 指向(修改请求地址,到自己的服务器,在自己的服务器模拟请求),遇 ...

    跨域可以在你服务器那边加CORS规则解决,不过cookie确实不行,浏览器限制。
    异步特性将在下个版本加入ajaxHooker库,我正在写,以后可以用GM_xhr跨域转发。
    回复

    使用道具 举报

    该用户从未签到

    16

    主题

    56

    回帖

    91

    积分

    初级工程师

    积分
    91

    新人报道

    发表于 2023-1-3 13:24:26 | 显示全部楼层
    cxxjackie 发表于 2023-1-3 12:37
    跨域可以在你服务器那边加CORS规则解决,不过cookie确实不行,浏览器限制。
    异步特性将在下个版本加入aja ...

    太好了!太好了!,等你更新!!!!
    回复

    使用道具 举报

    该用户从未签到

    16

    主题

    56

    回帖

    91

    积分

    初级工程师

    积分
    91

    新人报道

    发表于 2023-1-3 16:39:59 | 显示全部楼层
    本帖最后由 Major 于 2023-1-3 16:55 编辑

    遇到一个问题,寻求帮助。以下代码我用了两种不同的 hook方式。在 【// @match        https://fxg.jinritemai.com/ffa/mexpress/goods/storage】 这个网址,两种方式都生效。但是奇怪的是,在 【// @match        https://base.work.cainiao.com/ma ... hInventoryQuery.htm*】两种方式都不生效,也就是 a.hookJson_tm_bms_xiaoqi();   这个函数内的hook 没执行


    我看到了这个说明(但是不太会用)见下图2,如果有个完整示例,让这段代码执行就更好了:

    复制代码

    1. // ==UserScript==
    2. // [url=home.php?mod=space&uid=23356]@name[/url]         [major]简称显示
    3. // @namespace    https://bbs.tampermonkey.net.cn/
    4. // @version      0.1.0
    5. // @description  try to take over the world!
    6. // @author       You
    7. // [url=home.php?mod=space&uid=52134]@match[/url]        https://fxg.jinritemai.com/ffa/mexpress/goods/storage
    8. // @match        https://base.work.cainiao.com/manage/batch/batchInventoryQuery.htm*
    9. // @require      https://scriptcat.org/lib/637/1.0.0/ajaxHooker.js
    10. // @run-at       document-start
    11. // ==/UserScript==

    12. // 店铺库存简称显示
    13. let b = {
    14.     // 根据条形码匹配商品简称
    15.     code:{
    16.         "4004148057274":"01德大铁",
    17.         "4004148323218":"02红铁片",
    18.         "4004148047503":"03中大铁",
    19.         "4004148313547":"04绿大铁",
    20.         "4004148323768":"05绿铁片",
    21.         "4004148017537":"06钙镁锌",
    22.         "4004148057267":"08德小铁",
    23.         "4004148324741":"09德版艾儿",
    24.         "4004148322327":"10儿童铁元",
    25.         "4004148323232":"11维B族",
    26.         "4004148017223":"14德版多维",
    27.         "4004148307058":"17护肝液",
    28.         "4004148019821":"20黑莓鱼油",
    29.         "4004148017018":"23肠道卫士",
    30.         "4004148018916":"24钙片",
    31.         "4004148330599":"27软骨胶囊",
    32.         "4004148018121":"28润嗓糖",
    33.         "4004148345975":"褪黑素30片",
    34.         "4004148307478":"维B胶囊",   
    35.         "4004148349775":"05绿铁片(新)",     
    36.     },

    37.     // 铁元店 菜鸟货品ID 匹配商品名称
    38.     itemId : {
    39.         "637854584084":"01德大铁",
    40.         "638881163050":"02红铁片",
    41.         "638924845292":"03中大铁",
    42.         "638558160498":"04绿大铁",
    43.         "639596995875":"05绿铁片",
    44.         "638563752479":"07中小铁",
    45.         "638557156350":"08德小铁",
    46.         "639267098498":"10儿童铁元",
    47.         "639261274711":"12绿小铁",
    48.         "639714222006":"40女士调经茶",
    49.         "641688011698":"50德超大铁",
    50.         "643491679413":"51迷你15ml儿铁",
    51.         "652636028202":"紫锥菊唇膏",
    52.     },
    53. };

    54. let a = {

    55.     // 抖音供应链管理(hook 方式1)
    56.     hookJson_dy_gylgl:function(){
    57.         const xhrOpen = XMLHttpRequest.prototype.open;
    58.         XMLHttpRequest.prototype.open = function() {
    59.             // let url = '/shopuser/cb/wareStock/wareList'
    60.             let urlfined = /\/shopuser\/cb\/wareStock\/wareList/;
    61.             let response = 'responseText'
    62.             const xhr = this;
    63.             if (arguments[1].match(urlfined)) {
    64.                 const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, response).get;
    65.                 Object.defineProperty(xhr, response, {
    66.                     get: () => {
    67.                         let result = getter.call(xhr);
    68.                         console.log("结果类型是:",typeof(result))
    69.                         let resultDic = JSON.parse(result);
    70.                         let goodsitem = resultDic.data.list
    71.                         goodsitem.forEach((element,index) => {
    72.                             let barCode = element.wareInfo.barCode
    73.                             if(b.code[barCode]){
    74.                                 goodsitem[index].wareInfo.wareName = b.code[barCode] + '\n'
    75.                             };
    76.                         });
    77.                         //这里可以修改result
    78.                         return resultDic;
    79.                     }
    80.                 });
    81.             }
    82.             return xhrOpen.apply(xhr, arguments);
    83.         };
    84.     },
    85.     // 天猫国际BMS效期查询(hook 方式2)
    86.     hookJson_tm_bms_xiaoqi:function(){
    87.         console.log("天猫国际BMS效期查询1")
    88.         ajaxHooker.protect();  // 这一句,加 和 没加 hook 都没执行
    89.         ajaxHooker.hook(request => {
    90.             console.log("URLGET:",request.url)
    91.             if (request.url.match(/\/batch\/batchInventoryQueryJson.do/)){
    92.                 console.log('test:',request);
    93.                 console.log('test_URL:',request.url);
    94.             };
    95.         });
    96.     },

    97. };


    98. let c = {
    99.     inmain:function(){
    100.         if(document.location.pathname.match(/\/ffa\/mexpress\/goods\/storage/)){
    101.             a.hookJson_dy_gylgl();
    102.         }else if(document.location.pathname.match(/\/batch\/batchInventoryQuery.htm/)){
    103.             a.hookJson_tm_bms_xiaoqi();
    104.         };
    105.     },
    106. };

    107. (function() {
    108.     c.inmain();
    109. })();
    复制代码





    01.png
    02.png
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

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

    发表于 2023-1-3 20:29:09 | 显示全部楼层
    Major 发表于 2023-1-3 16:39
    遇到一个问题,寻求帮助。以下代码我用了两种不同的 hook方式。在 【// @match        https://fxg.jinrite ...

    我打不开第二个链接,会被重定向到商家入驻的页面,估计是你自己的账号已入驻,才能进入的管理页面。不生效我能想到两个原因:一个是你引用的库版本太旧了,1.0.0的是有一些冲突问题,换最新版本试试;另一个是请求来自iframe,在控制台抓包那里点右上角齿轮,勾选“按框架分组”再看看,是iframe问题的话修改match地址即可。如果是未知的冲突问题则比较麻烦,毕竟我进不去也没法调试。
    protect方法尽量放在代码最开始的时候执行,晚了就没效果了。
    回复

    使用道具 举报

    该用户从未签到

    16

    主题

    56

    回帖

    91

    积分

    初级工程师

    积分
    91

    新人报道

    发表于 2023-1-3 21:34:37 | 显示全部楼层
    本帖最后由 Major 于 2023-1-3 21:43 编辑
    cxxjackie 发表于 2023-1-3 20:29
    我打不开第二个链接,会被重定向到商家入驻的页面,估计是你自己的账号已入驻,才能进入的管理页面。不生 ...

    太厉害了!!!!,一下就定位到问题,果然是 iframe 问题。经验丰富啊大神,膜拜一会!!!!,厉害!!!!厉害!!!!(之前好像脚本猫会自动把 iframe 中也插入脚本,这次好像没自动加进来)。
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

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

    发表于 2023-1-4 00:05:32 | 显示全部楼层
    Major 发表于 2023-1-3 21:34
    太厉害了!!!!,一下就定位到问题,果然是 iframe 问题。经验丰富啊大神,膜拜一会!!!!,厉害!! ...

    1.2.0已发布,你试试看吧,没做太多测试,可能有bug。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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