// ==UserScript== // @name B站评论区开盒 // @namespace mscststs // @version 0.1 // @description B站评论区直接展示 ip 属地 // @author mscststs // @match *://*.bilibili.com/* // @license ISC // @icon https://www.google.com/s2/favicons?sz=64&domain=bilibili.com // @run-at body // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; hackEle(document.querySelector("head"), "insertBefore", hack) hackEle(document.querySelector("head"), "appendChild", hack) function hackEle(ele, func, callback){ const ori = ele[func]; ele[func] = function(...args){ callback(ori.bind(this), ...args) } }; function hack(origin, ...args){ const [ele, target] = [...args]; const src = ele.src; if( ele.src && ~src.indexOf("/x/v2/reply/")){ // 确定是评论类型,执行额外流程 let url = new URL(src); let oldName = url.searchParams.get("callback"); // 旧名称 let newName = `JSONP_FAKE_${Date.now()}_${Math.random()}`.replace(/\./g,""); // 新名称 url.searchParams.set("callback", newName); ele.src = url.href; window[newName] = function(obj){ // 处理数据 function addReplyLocation (reply){ if(reply.reply_control && reply.reply_control.location){ reply.member.uname = `${reply.member.uname} [${reply.reply_control.location}]` } if(reply.replies && reply.replies.length){ reply.replies.forEach(addReplyLocation) } } if(obj.code === 0 && obj.data && obj.data.replies.length){ obj.data.replies.forEach(addReplyLocation) } window[oldName](obj); delete window[newName]; } } origin(...args) } })();