##微博显示用户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) === -1let 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)}})}//mobileif (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)}})}}})();