B站笔记快捷键←↓→

在B站笔记中:打开笔记快捷键:Ctrl+Shift+↑,关闭笔记快捷键:Ctrl+Shift+↓,笔记窗口切换到视频窗口:Ctrl+Shift+←,视频窗口切换到笔记窗口:Ctrl+Shift+→,截图+时间戳快捷键:Ctrl+↓,时间戳+截图快捷键:Ctrl+↑,时间戳快捷键:Ctrl+←,截图快捷键:Ctrl+→,下载视频笔记Ctrl+Shift+S

目前為 2022-12-29 提交的版本,檢視 最新版本

// ==UserScript==
// @name         B站笔记快捷键←↓→
// @namespace    https://space.bilibili.com/1208812226
// @version      2.7
// @description  在B站笔记中:打开笔记快捷键:Ctrl+Shift+↑,关闭笔记快捷键:Ctrl+Shift+↓,笔记窗口切换到视频窗口:Ctrl+Shift+←,视频窗口切换到笔记窗口:Ctrl+Shift+→,截图+时间戳快捷键:Ctrl+↓,时间戳+截图快捷键:Ctrl+↑,时间戳快捷键:Ctrl+←,截图快捷键:Ctrl+→,下载视频笔记Ctrl+Shift+S
// @author       大王鹅鹅鹅
// @match        http*://www.bilibili.com/video/*
// @match        https://www.bilibili.com/medialist/*
// @icon         https://static.hdslb.com/images/favicon.ico
// @grant        none
// @license      AGPL License
// ==/UserScript==

(function () {
    "use strict";
    // JS监听键盘快捷键事件
    document.addEventListener("keydown", function (event) {
      if (event.shiftKey && event.keyCode == 38) {//打开笔记——快捷键:Ctrl+Shift+↑
        if (event.ctrlKey) {
          document.querySelector("div.note-btn.note-btn__blue").click();
          document
            .querySelector(".operation-desc")
            .click();
          var count = 2;
          var timeId = setInterval(function () {
            count--;
            if (count <= 0) {
              clearInterval(timeId);
            }
            initFocusDown();

          }, 600);
            //固定笔记
              var myresize = document.querySelector(".resizable-component");
              myresize.style.position = 'fixed';
              myresize.style.setProperty('position', 'fixed', 'important');
        }
      }

      if (event.shiftKey && event.keyCode == 40) {//关闭笔记——快捷键:Ctrl+Shift+↓
        if (event.ctrlKey) {
          document
            .querySelector(".close-note")
            .click();
        }
      }

      if (event.shiftKey && event.keyCode == 37) {//回到视频——快捷键:Ctrl+Shift+←
        if (event.ctrlKey) {
          var pNodel = document.querySelector(
            "div.editor-innter.ql-container.ql-snow > div.ql-editor"
          );
          pNodel.blur();
        }
      }
      if (event.shiftKey && event.keyCode == 39) {//回到笔记——快捷键:Ctrl+Shift+→
        if (event.ctrlKey) {
          var el = document.querySelector(
            "div.editor-innter.ql-container.ql-snow > div.ql-editor"
          );
          var scrollHeight = el.scrollHeight;
          el.scrollTo(0, scrollHeight);
          el.focus();
          if (
            typeof window.getSelection != "undefined" &&
            typeof document.createRange != "undefined"
          ) {
            var range = document.createRange();
            range.selectNodeContents(el);
            range.collapse(false);
            var sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
          } else if (typeof document.body.createTextRange != "undefined") {
            var textRange = document.body.createTextRange();
            textRange.moveToElementText(el);
            textRange.collapse(false);
            textRange.select();
          }
        }
      }

      if (event.ctrlKey && event.keyCode == 37) {//时间戳——快捷键:Ctrl+←
        if (!event.shiftKey) {
          document.querySelector("i.bili-note-iconfont.iconicon_flag_L").click();
          setTimeout(function () {
            document
              .querySelector(
                "div.dialog-btn.tag-dialog__btn--confirm:nth-child(2)"
              )
              .click();
          }, 5 * 100);
        }
      }

      if (event.ctrlKey && event.keyCode == 38) {//时间戳+截图——快捷键:Ctrl+↑
        if (!event.shiftKey) {
            imageAfterTime();
        }
      }

      if (event.ctrlKey && event.keyCode == 39) {//截图——快捷键:Ctrl+→
        if (!event.shiftKey) {
          document.querySelector("i.bili-note-iconfont.iconcapture-app").click();
          setTimeout(function () {
            var parentNode = document.querySelector(
              "div.editor-innter.ql-container.ql-snow > div.ql-editor"
            );
            var scrollHeight = parentNode.scrollHeight;
            parentNode.scrollTo(0, scrollHeight);
            parentNode.focus();
          }, 500);
        }
      }

      if (event.ctrlKey && event.keyCode == 40) {//截图+时间戳——快捷键:Ctrl+↓
        if (!event.shiftKey) {
         timeAfterImage();
        }
      }

     if (event.shiftKey && event.keyCode == 83) {//下载笔记为markdown格式——快捷键:Ctrl+Shift+S
        if (event.ctrlKey) {
          openNote();
        }
      }

    });



    function initFocusDown() {
      document.querySelector("div.note-btn.note-btn__blue:nth-child(2)").click();
      document.querySelector("div.note-list-footer > div.note-list-btn").click();
      var el = document.querySelector(
        "div.editor-innter.ql-container.ql-snow > div.ql-editor"
      );
      var scrollHeight = el.scrollHeight;
      el.scrollTo(0, scrollHeight);
      el.focus();
      if (
        typeof window.getSelection != "undefined" &&
        typeof document.createRange != "undefined"
      ) {
        var range = document.createRange();
        range.selectNodeContents(el);
        range.collapse(false);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
      } else if (typeof document.body.createTextRange != "undefined") {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(false);
        textRange.select();
      }
    }

    function openNote() {
      const editor = document.querySelector(".ql-editor")
        ? document.querySelector(".ql-editor")
        : null;
        if(!editor){alert("请先打开视频笔记,快捷键:Ctrl+Shift+↑");return;}
      const isBlank = editor && !editor.classList.contains("ql-blank");

      if (isBlank) {
        const noteContent = getNoteContent(editor);
        downloadMD(noteContent);
      } else {
        alert("笔记为空,无法下载");
      }
    }

    function getNoteContent(editor) {
      if (
        editor.nodeType === 1 &&
        editor.childNodes &&
        editor.childNodes.length > 0
      ) {
        return getNodes2Array(editor.childNodes);
      }
      return "";
    }

    function getNodes2Array(nodes) {
      const contents = [];
      for (let i = 0; i < nodes.length; i++) {
        const node = nodes[i];
        if (node.nodeType == 1) {
          if (node.nodeName == "P") {
              if (node.querySelector('div') || node.querySelector('span') || node.querySelector('strong') || node.querySelector('u') || node.querySelector('s')) {
                   contents.push(node2string(node));
              }else{
                   contents.push(node.innerHTML.replace(/src="(?!https:)(.*?)"/g, 'src="https:$1"').replace(/<br\s*\/?>/gi, "\n"));
              }
            
          } else if (node.nodeName == "OL" || node.nodeName == "UL") {
            contents.push(getLiContent(node));
          } else if (node.nodeName == "DIV") {
            contents.push(divImgContent(node));
          } else {
            contents.push(node.textContent);
          }
        }
      }
      return contents;
    }

    function getLiContent(node) {
      let allLiContent = "";
      let nodeName = node.nodeName;
      let liNodes = node.childNodes;
      let indentLevels = {};

      if (liNodes && liNodes.length > 0) {
        for (let li of liNodes) {
          let liclass = li.getAttribute("class");
          let indentLevel = 0;
          if (liclass) {
            let match = liclass.match(/ql-indent-(\d+)/);
            if (match) {
              indentLevel = parseInt(match[1]);
            }
          }

          indentLevels[indentLevel] = (indentLevels[indentLevel] || 0) + 1;

          let indent = "";
          for (let i = 0; i < indentLevel; i++) {
            indent += "\t";
          }

          allLiContent +=
            indent +
            (nodeName == "OL" ? indentLevels[indentLevel] + ". " : "- ") +
            node2string(li) +
            "\n";
        }
      }

      return allLiContent;
    }

    function divImgContent(node) {
      if (!node.classList || !node.classList.contains("ql-image-preview")) {
        return;
      }

      let img = node.querySelector("img");
      let src = img ? "https:" + img.getAttribute("src") : "";
      if (!src.includes("http")) {
        return;
      }

      let content = src ? src : "";
      if (!content.match(/api.bilibili.com\/x\/note\/image/g)) {
        content = "![](" + content + ")";
      }
      return content;
    }

    function node2string(node) {
debugger;
      let nodes = node.childNodes;
      if (!nodes || nodes.length <= 0) return "";
      let line = "";

      for (let i = 0; i < nodes.length; i++) {
        let child = nodes[i];
        let tag = child.nodeName;
        let myContents = "";

        if (
          (child.classList && child.classList.contains("ql-tag-blot")) ||
          tag === "DIV"
        ) {
          //时间戳
          let timeText = child.querySelector(".time-tag-item__text");
          let desc = child.querySelector(".time-tag-item__desc");
          let p = child.getAttribute("data-index");
          let second = child.getAttribute("data-seconds");
          let pUrl = window.location.href;
          let match = pUrl.match(
            /(https\:\/\/www.bilibili.com\/video\/)(BV|av)[a-zA-Z0-9]+(?=[\/\?])?/g
          );
          pUrl = match ? match[0] : pUrl;

          let title =
            "🚩" +
            timeText.firstChild.textContent +
            (desc ? " " + desc.textContent : "");
          let time = `${pUrl}?p=${p}&t=${second}`;

          myContents += `[${title}](${time})`;
        } else {
          if (!child.children || child.children.length == 0) {
              myContents += child.textContent;
          } else {
            myContents += node2string(child);
          }

          //针对文字ql-bg
          let className = "";
          if (child.classList) {
            let myClassList = child.classList;
            for (let a = 0; a < myClassList.length; a++) {
              if (myClassList[a].match(/ql-bg/)) {
                className += "background-color:" + myClassList[a].slice(-7) + ";";
              }
              if (myClassList[a].match(/ql-color/)) {
                className += "color:" + myClassList[a].slice(-7) + ";";
              }
              if (myClassList[a].match(/ql-size/)) {
                className +=
                  "font-size:" +
                  myClassList[a].slice(8, myClassList[a].length) +
                  ";";
              }
            }
          }

         if (child.children && child.querySelector('.ql-tag-blot')==null) {

          let font1 = className != "" ? "<font style='" + className + "'>" : "";
          let font2 = className != "" ? "</font>" : "";
          myContents = font1 + myContents + font2;


          if (tag == "U" || tag == "S" || tag == "STRONG") {
            myContents =
              "<" +
              tag.toLowerCase() +
              ">" +
              myContents +
              "</" +
              tag.toLowerCase() +
              ">";
          } else if (tag == "BR") {
              myContents += "\n";
          } else {
              myContents += "";
          }
         }
        }
        line += myContents;
      }
      return line;
    }
      function getNowTime(){
          var now = new Date();
          var year = now.getFullYear();
          var month = now.getMonth() + 1;
          var date = now.getDate();
          var hours = now.getHours();
          var minutes = now.getMinutes();
          var seconds = now.getSeconds();
          hours = hours < 10 ? '0' + hours : hours;
          minutes = minutes < 10 ? '0' + minutes : minutes;
          seconds = seconds < 10 ? '0' + seconds : seconds;

          var dateString = year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds;
          return dateString;
      }

      function getInfo(){
          let allContent ="";
          try{
              const username = document.querySelector(".username").firstChild.textContent.trim();
              const pudate_text = document.querySelector(".pudate-text").firstChild.textContent.trim();
              const views = document.querySelector("span.view.item").getAttribute("title");
              let pUrl = window.location.href;
              let match = pUrl.match(/(https\:\/\/www.bilibili.com\/video\/)(BV|av)[a-zA-Z0-9]+(?=[\/\?])?/g);
              pUrl = match ? match[0] : pUrl;
              allContent = "---\ntags: bilibili_note\nurl: "+pUrl+"\nup: "+username+"\nup_date: "+pudate_text+"\ndown_time: "+getNowTime()+"\nviews: "+views+"\n---\n\n";
          }catch(e){
              let pUrl = window.location.href;
              let match = pUrl.match(/(https\:\/\/www.bilibili.com\/video\/)(BV|av)[a-zA-Z0-9]+(?=[\/\?])?/g);
              pUrl = match ? match[0] : pUrl;
              allContent = "---\ntags: bilibili_note\nurl: "+pUrl+"\ndown_time: "+getNowTime()+"\n---\n\n";
          }
      return allContent;
      }

    function downloadMD(notes) {
      let allContent =getInfo();
      let bid = window.location.href.match(
        /(?<=bilibili.com\/video\/)(BV|av)[a-zA-Z0-9]+(?=[\/\?])?/g
      );

      for (var i = 0; i < notes.length; i++) {
        if (notes[i] != "") {
          let images_id = notes[i].match(
            /(?<=api.bilibili.com\/x\/note\/image\?image_id=)\d{6}/g
          );
          if (images_id) {
            allContent +=
              "![](" + bid[0] + "_" + images_id[0] + ".jpg)" + "\n";
            //下载图片
            downloadImages(notes[i], bid[0]);
          } else {
            allContent += notes[i] + "\n";
          }
        } else {
          allContent += "\n";
        }
      }
      //下载md
      let video_title = document.querySelector(".video-title");
      let v_title = video_title ? video_title.textContent : new Date().getTime();
      setTimeout(function () {
        downloadFiles("bilibili_" + v_title + ".md", allContent);
      }, 1000);
    }

    async function downloadImages(src, bid) {
      let res = await fetch(src, {
        method: "get",
        credentials: src.includes("bilibili.com") ? "include" : "omit",
      });

      if (!res.ok) return;

      let blob = await res.blob();
      let fileName = src.slice(-6);
      downloadFiles(bid + "_" + fileName + ".jpg", blob);
    }


    function downloadFiles(fileName, myblob) {
      let blob = new Blob([myblob]);
      let a = document.createElement("a");
      a.href = URL.createObjectURL(blob);
      a.download = fileName;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    }


     function imageAfterTime() {//时间戳+截图 ↑
          new Promise((resolve,reject)=>{
                  document.querySelector('i.bili-note-iconfont.iconicon_flag_L').click();
                  return resolve();
              }).then(()=>{
                  setTimeout( function(){
                      document.querySelector('div.dialog-btn.tag-dialog__btn--confirm:nth-child(2)').click();
                  },500);
              });

              new Promise((resolve,reject)=>{
                   setTimeout( function(){
                      document.querySelector('i.bili-note-iconfont.iconcapture-app').click();
                  },1000);
                  return resolve();
              }).then(()=>{
                  setTimeout( function(){
                   var parentNode=document.querySelector('div.editor-innter.ql-container.ql-snow > div.ql-editor');
                   var childN=parentNode.childNodes;
                   var scrollHeight =parentNode.scrollHeight;
                   parentNode.scrollTo(0,scrollHeight);
                   parentNode.focus();
                      for(var i=1;childN.length-1;i++){
                              if(childN[i].innerHTML=="<br>" && childN[i].previousSibling.innerHTML!="<br>" && childN[i].previousSibling.nodeName == "P" && childN[i].nextSibling.nodeName == "DIV"){
                                  childN[i].remove();
                              }

                      }

                },1100);
              });

      }

      function timeAfterImage(){//截图+时间 ↓
            document.querySelector('i.bili-note-iconfont.iconcapture-app').click();
              new Promise((resolve,reject)=>{
                  document.querySelector('i.bili-note-iconfont.iconicon_flag_L').click();
                  return resolve();
              }).then(()=>{
                  setTimeout( function(){
                      document.querySelector('div.dialog-btn.tag-dialog__btn--confirm:nth-child(2)').click();
                      var parentNode=document.querySelector('div.editor-innter.ql-container.ql-snow > div.ql-editor');
                      var childN=parentNode.childNodes;
                      for(var i=0;childN.length;i++){
                          if(childN[i].innerHTML=="<br>" && childN[i].nextSibling.innerHTML!="<br>" && childN[i].nextSibling.nodeName == "P" && childN[i].previousSibling.nodeName == "DIV"){
                             childN[i].remove();
                          }
                      }
                  },1500);
              });

      }


       function toEnd(el) {
           var scrollHeight = el.scrollHeight;
           el.scrollTo(0, scrollHeight);
           el.focus();
           if (typeof window.getSelection != "undefined" && typeof document.createRange != "undefined") {
               var range = document.createRange();
               range.selectNodeContents(el);
               range.collapse(false);
               var sel = window.getSelection();
               sel.removeAllRanges();
               sel.addRange(range);
           } else if (typeof document.body.createTextRange != "undefined") {
               var textRange = document.body.createTextRange();
               textRange.moveToElementText(el);
               textRange.collapse(false);
               textRange.select();
           }
       }




  })();


         window.onload=function(){
                  let newDiv = document.createElement('div');
                  newDiv.style.position="absolute";
                  newDiv.style.zIndex=99999999999999999999;
                  newDiv.style.cursor="pointer";
                  newDiv.setAttribute("id", "my_icon")
                  newDiv.style.display="none";
                  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
                  svg.setAttribute('version', '1.1');
                  svg.setAttribute('id', 'mu');
                  svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
                  svg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
                  svg.setAttribute('x', '0px');
                  svg.setAttribute('y', '0px');
                  svg.setAttribute('width', '40px');
                  svg.setAttribute('height', '40px');
                  svg.setAttribute('viewBox', '0 0 40 40');
                  svg.setAttribute('enable-background', 'new 0 0 40 40');
                  svg.setAttribute('xml:space', 'preserve');
                  svg.innerHTML = "<image id='image0' width='40' height='40' x='0' y='0' href='data:image/png;base64,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' />";
                  newDiv.appendChild(svg);
                  document.body.after(newDiv);

               function getSelect(){
                  let select = null, range = null;
                  let selectedText = "",selectedHtml="";

                      if(window.getSelection){
                        select = window.getSelection();
                        selectedText = select.toString();
                        //range = select.getRangeAt(0);
                        //var docFragment = range.cloneContents();
                        //var tempDiv = document.createElement("div");
                        //tempDiv.appendChild(docFragment);
                           //  获取html
                          range = select.getRangeAt(0);
                          var docFragment = range.cloneContents();
                          var tempDiv = document.createElement("div");
                          tempDiv.appendChild(docFragment);
                          selectedHtml = tempDiv.innerHTML;

                      } else if(document.selection){
                          select = document.selection;
                          range = select.createRange();
                          selectedText = range.text;
                          selectedHtml = range.htmlText;
                      }

                      return selectedHtml;
                    };

                  var currentText=null;
                  var interval = "";
                  var oBaby =document.body;
                  var oIcon = document.getElementById('my_icon');

                  oBaby.onmouseup = function (event) {
                      var ev = event || window.event;
                      var left = ev.pageX;
                      var top = ev.pageY;

                      currentText=getSelect();
                      if (currentText.length > 1) {
                          setTimeout(function () {
                              oIcon.style.display = 'block';
                              oIcon.style.left = left + 'px';
                              oIcon.style.top = top-20 + 'px';
                          }, 100);
                      } else {
                          oIcon.style.display = 'none';
                      }
                  };
                  oBaby.onclick = function (event) {
                      var ev = event || window.event;
                      ev.cancelBubble = true;
                  };
                  document.onclick = function () {
                      setTimeout(function () {
                          oIcon.style.display = 'none';
                          clearInterval(interval);
                          }, 500);
                      };

                  oIcon.onclick = function () {
                      let angle = 0;
                      interval = setInterval(() => {
                          angle += 60;
                          this.style.transformOrigin = '20px 20px';
                          this.style.transform = `rotate(${angle}deg)`;

                      }, 80);
                      const editor = document.querySelector(".ql-editor")? document.querySelector(".ql-editor"): null;
                      if(editor){
                         editor.append(getAllComment(currentText));
                         var scrollHeight = editor.scrollHeight;
                          editor.scrollTo(0, scrollHeight);

                      }else{
                          alert("请先打开视频笔记,快捷键:Ctrl+Shift+↑");
                      }
                  };

             //comment
             function getComment(htmlString){
                 var tempStr="";
                  let newspan = document.createElement('span');
                  var tStr=parserString2HTML(htmlString);

                   var leftEntry = tStr.querySelector('.left-entry');
                 if(leftEntry!=null){
                     return newspan;
                 }

                 htmlString = htmlString.replace(/<(?!img|br)[^>]*>/g, '');
                 htmlString = htmlString.replace(/<img[^>]*src="data:image[^"]*"[^>]*>/g, '');

                 htmlString = htmlString.replace(/<img[^>]+src="([^"]+)"[^>]+>/gi, function(match, p1) {
                     if (p1.endsWith('.svg')) {
                         return '';
                     }
                     return match;
                 });




                 var newHtml = htmlString.replace(/<img[^>]*>/g, function(match) {
                     var src = match.match(/src="([^"]*)"/)[1];
                     return "<img>"+src+"<img>";
                 });
                
                 tempStr=newHtml.split(/<img[^>]*>/g)
                 for(var i=0;i<tempStr.length;i++){
                     if(/png/.test(tempStr[i])){
                     let newImg = document.createElement('img');
                          newImg.setAttribute('width', '24px');
                          newImg.setAttribute('height', '24px');
                          newImg.setAttribute('src', tempStr[i]);
                          newspan.append(newImg);
                         //newspan.append("\n")
                     }else{
                      newspan.append(tempStr[i].replace(/<br>/g,"\n"))

                     }
                 }
                 return newspan;
             }

       
             function getAllComment(htmlString){

                 let newspan = document.createElement('span');
                 var tempStr=parserString2HTML(htmlString);
                 var subReplyItem = tempStr.querySelectorAll(".sub-reply-item");
                 var subUserInfo = tempStr.querySelector('.sub-user-info');
                 var replyItem = tempStr.querySelectorAll(".reply-item");
                 var userInfo = tempStr.querySelector('.user-info');
                 if(replyItem!=null && replyItem.length>0){

                     for(let i=0;i<replyItem.length;i++){
                         let rootReplyContainer = replyItem[i].querySelector('.root-reply-container');
                         if(rootReplyContainer!=null){
                         let biliAvatar = rootReplyContainer.querySelector('.root-reply-avatar .avatar .bili-avatar');

                         //主评论头像
                         if(biliAvatar!=null){
                             let imgSrc = biliAvatar.firstElementChild.getAttribute('src');
                             let newImg = document.createElement('img');
                             newImg.setAttribute('width', '24px');
                             newImg.setAttribute('height', '24px');

                             newImg.style.setProperty('border', 'none');
                             newImg.style.setProperty('border-radius', '50%');
                             newImg.style.setProperty('overflow', 'hidden');


                             newImg.setAttribute('src', imgSrc);
                             newspan.append(newImg);
                         }

                         //主评论userid和用户名
                         let userName = rootReplyContainer.querySelector('.content-warp .user-info .user-name');
                         if(userName!=null){
                             let dataUserId=userName.getAttribute('data-user-id');
                             let userNameReal=userName.textContent;
                             let newA = document.createElement('a');
                             newA.setAttribute('href', 'https://space.bilibili.com/'+dataUserId);
                             newA.textContent=userNameReal+":";
                             newspan.append(newA);
                         }

                         }

                         let noteText = replyItem[i].querySelector('.note-text-container .note-text');
                         if(noteText!=null){
                             newspan.append(getComment(noteText.firstElementChild.innerHTML))
                         }else{
                             let replyContentContainer = replyItem[i].querySelector('.root-reply .reply-content');
                             if(replyContentContainer!=null){
                                 newspan.append(getComment(replyContentContainer.innerHTML))
                             }
                         }
                         newspan.append("\n\n")

                         let sReplyItem = replyItem[i].querySelectorAll('.sub-reply-item');
                         for(let j=0;j<sReplyItem.length;j++){
                             newspan.append(avatarUserNameContent(sReplyItem[j],sReplyItem[j]));
                             newspan.append("\n\n")
                         }


                     }

                 }else if(userInfo!=null){
                       //主评论userid和用户名
                         let userName = userInfo.querySelector('.user-info .user-name');
                         if(userName!=null){
                             let dataUserId=userName.getAttribute('data-user-id');
                             let userNameReal=userName.textContent;
                             let newA = document.createElement('a');
                             newA.setAttribute('href', 'https://space.bilibili.com/'+dataUserId);
                             newA.textContent=userNameReal+":";
                             newspan.append(newA);
                         }

                         let noteText = tempStr.querySelector('.note-text-container .note-text');
                         if(noteText!=null){
                             newspan.append(getComment(noteText.firstElementChild.innerHTML))
                         }else{

                             let replyContentContainer = tempStr.querySelector('.reply-content-container .reply-content');
                             if(replyContentContainer!=null){
                                 newspan.append(getComment(replyContentContainer.innerHTML))
                             }
                         }
                         newspan.append("\n\n")

                         let sReplyItem = tempStr.querySelectorAll('.sub-reply-item');

                         for(let j=0;j<sReplyItem.length;j++){
                             newspan.append(avatarUserNameContent(sReplyItem[j],sReplyItem[j]));
                             newspan.append("\n\n")
                         }


                 }else if(subReplyItem!=null && subReplyItem.length>0){
                     let replyContentContainer = tempStr.querySelector('.root-reply .reply-content-container .reply-content');
                     if(replyContentContainer!=null){
                         newspan.append(getComment(replyContentContainer.innerHTML))
                          newspan.append("\n\n")
                     }

                  for(let i=0;i<subReplyItem.length;i++){
                     newspan.append(avatarUserNameContent(subReplyItem[i],subReplyItem[i]));
                     newspan.append("\n\n")
                  }

                 }else if(subUserInfo!=null){
                     newspan.append(avatarUserNameContent(subUserInfo,tempStr));

                 }else{
                  let isSubUserInfo = tempStr.querySelector('.sub-reply-avatar .avatar .bili-avatar');
                   if(isSubUserInfo==null){
                         newspan.append(getComment(htmlString))
                     }
                 }

                 return newspan;
             }



             function parserString2HTML(htmlString){
                 const parser = new DOMParser();
                 const htmlDoc = parser.parseFromString(htmlString, "text/html");
                 return htmlDoc;

             }

             function avatarUserNameContent(subUserInfo,tempStr){
                 let nSpan = document.createElement('span');
                 let subBiliAvatar = subUserInfo.querySelector('.sub-reply-avatar .avatar .bili-avatar');
                     //sub评论头像
                     if(subBiliAvatar!=null){
                         let subImgSrc = subBiliAvatar.firstElementChild.getAttribute('src');
                         let newImg = document.createElement('img');
                         newImg.setAttribute('width', '24px');
                         newImg.setAttribute('height', '24px');

                         newImg.style.setProperty('border', 'none');
                         newImg.style.setProperty('border-radius', '50%');
                         newImg.style.setProperty('overflow', 'hidden');


                         newImg.setAttribute('src', subImgSrc);
                         nSpan.append(newImg);
                     }

                     let subUserName = subUserInfo.querySelector('.sub-user-name');
                     if(subUserName!=null){
                         let dataUserId=subUserName.getAttribute('data-user-id');
                         let UserName=subUserName.textContent;
                          let newA = document.createElement('a');
                         newA.setAttribute('href', 'https://space.bilibili.com/'+dataUserId);
                         newA.textContent=UserName+":";
                         nSpan.append(newA);
                     }

                     let replyContentContainer = tempStr.querySelector('.reply-content-container .reply-content');
                     if(replyContentContainer!=null){
                         nSpan.append(getComment(replyContentContainer.innerHTML))
                     }
                 return nSpan;
             }
         };