IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Chrome(谷歌)插件开发 监听网站的异步请求 -> 正文阅读

[JavaScript知识库]Chrome(谷歌)插件开发 监听网站的异步请求

作者:recommend-item-box type_blog clearfix

为什么要开发这样的一个插件:微信小程序用户反馈 不能知道那些问题是被回复了以及回复了什么内容,所以需要去监听这个网站的回复内容。由于它的客服系统获取聊天信息都是异步的,可以通过监听网站的异步请求 获取到参数、响应结果,用于处理这块的业务信息。

插件下载

谷歌插件学习监听网络请求-Javascript文档类资源-CSDN下载

业务流程?

?监听ajax请求的核心代码

main.js

;(function () {
  if ( typeof window.CustomEvent === "function" ) return false;
 
  function CustomEvent ( event, params ) {
      params = params || { bubbles: false, cancelable: false, detail: undefined };
      var evt = document.createEvent( 'CustomEvent' );
      evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
      return evt;
  }   
  CustomEvent.prototype = window.Event.prototype;   
  window.CustomEvent = CustomEvent;
})();
;(function () {
  function ajaxEventTrigger(event) {
      var ajaxEvent = new CustomEvent(event, 
        { 
          detail: {
                    readyState:this.readyState,
                    responseURL:this.responseURL,
                    status:this.status,
                    response:this.response,
                    orignUrl:this.orignUrl,
                    body:this.body,
                    method:this.method
                  } 
         });
      window.dispatchEvent(ajaxEvent);
  }
  
  var oldXHR = window.XMLHttpRequest;
 
  function newXHR() {
      var realXHR = new oldXHR();

      realXHR.addEventListener('abort', function () { ajaxEventTrigger.call(this, 'ajaxAbort'); }, false);
      realXHR.addEventListener('error', function () { ajaxEventTrigger.call(this, 'ajaxError'); }, false);
      realXHR.addEventListener('load', function () { ajaxEventTrigger.call(this, 'ajaxLoad'); }, false);
      realXHR.addEventListener('loadstart', function () { ajaxEventTrigger.call(this, 'ajaxLoadStart'); }, false);
      realXHR.addEventListener('progress', function () { ajaxEventTrigger.call(this, 'ajaxProgress'); }, false);
      realXHR.addEventListener('timeout', function () { ajaxEventTrigger.call(this, 'ajaxTimeout'); }, false);
      realXHR.addEventListener('loadend', function () { ajaxEventTrigger.call(this, 'ajaxLoadEnd'); }, false);
      realXHR.addEventListener('readystatechange', function() { ajaxEventTrigger.call(this, 'ajaxReadyStateChange'); }, false);

      let send = realXHR.send;
      realXHR.send = function(...arg){
          send.apply(realXHR,arg);
          realXHR.body = arg[0];
          ajaxEventTrigger.call(realXHR, 'ajaxSend');
      }

      let open = realXHR.open;
      realXHR.open = function(...arg){
          open.apply(realXHR,arg)
          realXHR.method = arg[0];
          realXHR.orignUrl = arg[1];
          realXHR.async = arg[2];
          ajaxEventTrigger.call(realXHR, 'ajaxOpen');
      }

      let setRequestHeader = realXHR.setRequestHeader;
      realXHR.requestHeader = {};
      realXHR.setRequestHeader = function(name, value){
          realXHR.requestHeader[name] = value;
          setRequestHeader.call(realXHR,name,value)
      }
      return realXHR;
  }
 
   window.XMLHttpRequest = newXHR;
})();

manifest.json

{
  "manifest_version": 3,

  "name": "采集助手",
  "description": "xxxxxx",
  "version": "1.0",

  "action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "tabs",
    "activeTab",
    "storage",
    "webRequest"
  ],
  "host_permissions": [
    "*://*/*",
    "http://*/*",
    "https://*/*",
    "https://back.welife001.com/"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "content_scripts": [    
    {
      "matches": ["https://xxxx/*"], //替换自己需要监听的网站地址   
      "js": ["auto.js","jquery-2.0.0.min.js"],		
      "run_at": "document_start"
    }
  ],
  "web_accessible_resources": [
    { 
      "resources": ["pageScripts/defaultSettings.js","pageScripts/main.js"],
      "matches": ["https://xxxx/*"] //替换自己需要监听的网站地址
    }
  ]
}

auto.js



// 在页面上插入代码

const script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', chrome.runtime.getURL('pageScripts/main.js'));
document.documentElement.appendChild(script);

script.addEventListener('load', () => {
    // postMessage({type: 'ajaxInterceptor', to: 'pageScript', key: 'ajaxInterceptor_switchOn', value: true});
    // postMessage({type: 'ajaxInterceptor', to: 'pageScript', key: 'ajaxInterceptor_rules', value: ['action=get_room_msg']});
    const meta = document.createElement('meta');
    meta.setAttribute('http-equiv', 'Content-Security-Policy');
    meta.setAttribute('content', 'upgrade-insecure-requests');
    document.getElementsByTagName('head')[0].prepend(meta);
    console.log('jiazai')
});


//写自己的业务逻辑代码
window.addEventListener("ajaxReadyStateChange",function(e){
    let xhr = e.detail;
    if(xhr && xhr.readyState == 4 && xhr.status == 200){
        // xhr.getAllResponseHeaders()  响应头信息
        // xhr.requestHeader            请求头信息
        // xhr.responseURL              请求的地址
        // xhr.responseText             响应内容
        // xhr.orignUrl                 请求的原始参数地址
        // xhr.body                     post参数,(get参数在url上面)

        //判断请求分别是什么动作
        if(xhr.orignUrl.includes('get_room_info')){ //获取用户聊天室详情
            dealChatInfo(xhr.response)
        }else if(xhr.orignUrl.includes('get_room_msg')){ //获取用户聊天列表
            //解析请求的参数 用来判断是刷新请求还是 获取历史聊天
            let param  = JSON.parse(xhr.body)
            if(param.op == 0){//获取历史聊天
                dealChatResponse(xhr.response,param.op)
            }else if(param.op == 1){//刷新请求
                if(xhr.response.list.length>0){//有聊天内容 才去同步
                    dealChatResponse(xhr.response,param.op)
                }
            }

        }else if(xhr.orignUrl.includes('send_room_msg')){ //客服回复内容
            dealChatSend(xhr.response,xhr.body)
        }
        // console.log(xhr);
    }
});
/**
 * 同步聊天信息
 * @param {*} response 
 * @param {*} op 
 */
function dealChatResponse(response,op){
    // console.log('聊天列表',response)
    chrome.storage.local.get(['room_attr'], function(result) {
        if(result){
            let user_head_img = result.room_attr.user_head_img
            let list = response.list
            // console.log(user_head_img)
            $.ajax({
                url: "xxx",
                type: "post",
                data:{list:list,op:op,head_url:user_head_img},
                dataType: "json"
            }).done(function(msg) {
                console.log( '同步消息成功',msg)
            }).fail(function(jqXHR, textStatus) {
                console.log( '同步消息失败')
            });
        }
    });
    
}

/**
 * 获取聊天室详情,需要将客服的信息保存起来
 * @param {*} response 
 */
function dealChatInfo(response){
    // console.log('聊天室详情',response)
    //保存聊天室详情
    chrome.storage.local.set({'room_attr': response.room_attr}, function() {});
}
/**
 * 处理客服发送消息
 * @param {*} response 
 * @param {*} body 
 */
function dealChatSend(response,body){
    // console.log('发送消息',JSON.parse(body))
    let json_body = JSON.parse(body);
    chrome.storage.local.get(['room_attr'], function(result) {
        if(result){
            let extra_info = json_body.extra_info
            let msg_content = json_body.msg_content
            let user_head_img = result.room_attr.user_head_img
            let msg_type = json_body.msg_type
            $.ajax({
                url: "xxx",
                type: "post",
                data:{extra_info:extra_info,msg_content:msg_content,head_url:user_head_img,msg_type:msg_type},
                dataType: "json"
            }).done(function(msg) {
                console.log( '发送消息成功',msg)
            }).fail(function(jqXHR, textStatus) {
                console.log( '发送消息失败')
            });
        }
    });
}

参考

  • https://www.cnblogs.com/fbj333/p/15709444.html
  • https://blog.csdn.net/joy1793/article/details/109364821
  • https://blog.csdn.net/Nieyigo/article/details/116482585

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:48:02  更:2022-05-10 11:48:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 2:42:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码