Greasy Fork is available in English.
##微博显示用户ip属地
// ==UserScript== // @name 微博ip属地显示助手 // @name:zh 微博ip属地显示助手 // @name:zh-CN 微博ip属地显示助手 // @description ##微博显示用户ip属地 // @description:zh ##微博显示用户ip属地 // @description:zh-CN ##微博显示用户ip属地 // @version 1.3 // @author NiaoBlush // @license GPL // @namespace https://github.com/NiaoBlush/weibo-ip-location // @homepageURL https://github.com/NiaoBlush/weibo-ip-location // @supportURL https://github.com/NiaoBlush/weibo-ip-location/issues // @match https://weibo.com/* // @match https://m.weibo.cn/* // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js // @grant GM.xmlHttpRequest // @connect weibo.com // ==/UserScript== (function () { "use strict"; function getRegion(uid) { return new Promise((resolve, reject) => { $.get(`https://weibo.com/ajax/profile/detail?uid=${uid}`, function (res) { if (res.data && res.data.ip_location) { const regionFull = res.data.ip_location; console.debug("[weibo-ip-location] info", uid, regionFull); const array = /IP属地:(.+)/.exec(regionFull); if (array != null) { resolve(array[1]); } else { resolve("") } } else { resolve("") } }) }) } function getRegionGM(uid) { return new Promise(((resolve, reject) => { GM.xmlHttpRequest({ url: `https://weibo.com/ajax/profile/detail?uid=${uid}`, method: "GET", onload: function (xhr) { const res = JSON.parse(xhr.responseText) if (res.data && res.data.ip_location) { const regionFull = res.data.ip_location; console.debug("[weibo-ip-location] info", uid, regionFull); const array = /IP属地:(.+)/.exec(regionFull); if (array != null) { resolve(array[1]); } else { resolve("") } } else { resolve("") } } }); })) } const district = ["北#", "天津", "河北", "山西", "内蒙古", "辽宁", "吉林", "黑龙江", "上海", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北", "湖南", "广东", "广西", "海南", "重庆", "四川", "贵州", "云南", "##", "陕西", "甘肃", "青海", "宁夏", "##", "##", "####", "#门"]; const mark = ($obj, region) => { const markedClass = "weibo-ip-marked"; if (!region || ($obj.hasClass(markedClass))) { return; } $obj.addClass(markedClass); const foreign = region && district.indexOf(region) === -1 let html; if (foreign) { html = `<span style="background-color: red;color: #FFF;margin-left: 5px;font-weight: bold;border-radius: 8px;padding: 2px 5px;">${region}</span>`; } else { html = `<span style="color: #00d0ff;margin-left: 5px;font-weight: normal;border-radius: 8px;padding: 2px 5px;">(${region})</span>`; } $obj.append(html); } console.log("[weibo ip region] $.fn.jquery", $.fn.jquery); const regionMap = {} //v6 $(".WB_main").bind("DOMNodeInserted", function (e) { const $e = $(e.target); if ($e.attr("id") === "v6_pl_content_homefeed") { $(".WB_main").unbind(); console.log("$e.html()", $e.html()); $e.bind("DOMNodeInserted", function (ev) { processList($(ev.target)) }) } }) //v7 $("[class^='Home_feed']").bind("DOMNodeInserted", function (e) { const ele = $(e.target) processList(ele) }) function processList($ele) { const list = $ele.find("a[class^='ALink_default']:not([aria-label]),.WB_info>a[usercard]") list.each(async function () { const href = $(this).attr("href"); const array = /\/u\/(\d+)/.exec(href) if (array != null) { const uid = array[1]; let region = regionMap[uid] if (region === undefined) { region = await getRegion(uid); regionMap[uid] = region; } mark($(this), region) } }) } //mobile if (location.host === "m.weibo.cn") { $("#app").bind("DOMNodeInserted", function (appE) { const appChild = $(appE.target) if (appChild.hasClass("main-wrap")) { $("#app").unbind("DOMNodeInserted"); appChild.bind("DOMNodeInserted", function (mainE) { const mainChild = $(mainE.target) if (mainChild.is("div") && mainChild.attr("class") === undefined) { appChild.unbind("DOMNodeInserted"); processMobileList(mainChild); $(".pannelwrap").bind("DOMNodeInserted", function (pE) { processMobileList($(pE.target)); }) } }) } }) function processMobileList($ele) { const list = $ele.find(".weibo-top .m-text-box > a, .weibo-text > span > a:not([data-hide])") list.each(async function () { let $target = $(this); const href = $target.attr("href"); const array = /\/profile\/(\d+)/.exec(href); if ($(this).parent().hasClass("m-text-box")) { $target = $target.find("h3").first(); } if (array != null) { const uid = array[1]; let region = regionMap[uid] if (region === undefined) { region = await getRegionGM(uid); regionMap[uid] = region; } mark($target, region) } }) } } })();