// ==UserScript== // @name ip-checker // @namespace http://tampermonkey.net/ // @version 1.0 // @description 显示当前使用的公网IP地址,并带有折叠展开功能和刷新功能,以及IP风险查询功能 // @author https://linux.do/u/snaily // @match http://*/* // @match https://*/* // @grant GM_xmlhttpRequest // @connect api.ipify.org // @connect ip-api.com // @connect scamalytics.com // @connect ping0.cc // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 使用api.ipify.org服务查询当前的公网IP function fetchCurrentIP() { console.log('Fetching current IP...'); const refreshButton = document.getElementById('refreshIpInfo'); if (refreshButton) { refreshButton.disabled = true; refreshButton.innerHTML = '正在刷新...'; } GM_xmlhttpRequest({ method: "GET", url: "https://api.ipify.org?format=json", onload: function(response) { console.log('IP fetched:', response.responseText); const ipInfo = JSON.parse(response.responseText); fetchIPDetails(ipInfo.ip); }, onerror: function(error) { console.log('Error fetching IP:', error); if (refreshButton) { refreshButton.disabled = false; refreshButton.innerHTML = '点击刷新IP信息'; } } }); } // 使用ip-api.com服务查询IP详细信息 function fetchIPDetails(ip) { console.log('Fetching IP details for:', ip); GM_xmlhttpRequest({ method: "GET", url: "http://ip-api.com/json/" + ip, onload: function(response) { console.log('IP details fetched:', response.responseText); const ipDetails = JSON.parse(response.responseText); fetchIPRisk(ip, ipDetails); }, onerror: function(error) { console.log('Error fetching IP details:', error); const refreshButton = document.getElementById('refreshIpInfo'); if (refreshButton) { refreshButton.disabled = false; refreshButton.innerHTML = '点击刷新IP信息'; } } }); } // 使用scamalytics.com服务查询IP风险信息 function fetchIPRisk(ip, details) { console.log('Fetching IP risk for:', ip); GM_xmlhttpRequest({ method: "GET", url: `https://scamalytics.com/ip/${ip}`, onload: function(response) { console.log('IP risk fetched:', response.responseText); const riskData = parseIPRisk(response.responseText); fetchPing0Risk(ip, details, riskData); }, onerror: function(error) { console.log('Error fetching IP risk:', error); displayIPDetails(details, null, null); const refreshButton = document.getElementById('refreshIpInfo'); if (refreshButton) { refreshButton.disabled = false; refreshButton.innerHTML = '点击刷新IP信息'; } } }); } // 从HTML页面中解析出IP风险信息 function parseIPRisk(html) { console.log('Parsing IP risk data...'); const scoreMatch = html.match(/"score":"(.*?)"/); const riskMatch = html.match(/"risk":"(.*?)"/); if (riskMatch) { const riskData = { score: scoreMatch[1], risk: riskMatch[1] }; console.log('Parsed risk data:', riskData); return riskData; } console.log('Failed to parse risk data.'); return null; } // 使用ping0.cc服务查询IP风控信息 function fetchPing0Risk(ip, details, riskData) { console.log('Fetching Ping0 risk for:', ip); // 第一次请求以获取 window.x 值 GM_xmlhttpRequest({ method: "GET", url: `https://ping0.cc/ip/${ip}`, headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36" }, onload: function(response) { console.log('Initial Ping0 response:', response.responseText); const windowX = parseWindowX(response.responseText); if (windowX) { console.log('Parsed window.x value:', windowX); // 第二次请求带上 cookie: jskey={windowX} GM_xmlhttpRequest({ method: "GET", url: `https://ping0.cc/ip/${ip}`, headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36", "Cookie": `jskey=${windowX}` }, onload: function(response) { console.log('Final Ping0 response:', response.responseText); const ping0Data = parsePing0Risk(response.responseText); displayIPDetails(details, riskData, ping0Data); const refreshButton = document.getElementById('refreshIpInfo'); if (refreshButton) { refreshButton.disabled = false; refreshButton.innerHTML = '点击刷新IP信息'; } }, onerror: function(error) { console.log('Error fetching final Ping0 risk:', error); displayIPDetails(details, riskData, null); const refreshButton = document.getElementById('refreshIpInfo'); if (refreshButton) { refreshButton.disabled = false; refreshButton.innerHTML = '点击刷新IP信息'; } } }); } else { console.log('Failed to retrieve window.x value.'); displayIPDetails(details, riskData, null); const refreshButton = document.getElementById('refreshIpInfo'); if (refreshButton) { refreshButton.disabled = false; refreshButton.innerHTML = '点击刷新IP信息'; } } }, onerror: function(error) { console.log('Error fetching initial Ping0 page:', error); displayIPDetails(details, riskData, null); const refreshButton = document.getElementById('refreshIpInfo'); if (refreshButton) { refreshButton.disabled = false; refreshButton.innerHTML = '点击刷新IP信息'; } } }); } // 从HTML页面中解析出 window.x 值 function parseWindowX(html) { console.log('Parsing window.x value...'); const match = html.match(/window\.x\s*=\s*'([^']+)'/); const windowX = match ? match[1] : null; console.log('Parsed window.x:', windowX); return windowX; } // 从HTML页面中解析出ping0.cc的风险信息 function parsePing0Risk(html) { console.log('Parsing Ping0 risk data...'); const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const riskValue = doc.evaluate('/html/body/div[2]/div[2]/div[1]/div[2]/div[9]/div[2]/span', doc, null, XPathResult.STRING_TYPE, null).stringValue; const ipType = doc.evaluate('/html/body/div[2]/div[2]/div[1]/div[2]/div[8]/div[2]/span', doc, null, XPathResult.STRING_TYPE, null).stringValue; const nativeIP = doc.evaluate('/html/body/div[2]/div[2]/div[1]/div[2]/div[11]/div[2]/span', doc, null, XPathResult.STRING_TYPE, null).stringValue; const ping0Data = { riskValue: riskValue.trim(), ipType: ipType.trim(), nativeIP: nativeIP.trim() }; console.log('Parsed Ping0 data:', ping0Data); return ping0Data; } // 添加一个函数来显示IP地址及详细信息,并带有折叠展开功能 function displayIPDetails(details, riskData, ping0Data) { console.log('Displaying IP details...'); var ipElement = document.getElementById('ipInfo'); if (!ipElement) { ipElement = document.createElement('div'); ipElement.id = 'ipInfo'; ipElement.style.position = 'fixed'; ipElement.style.bottom = '10px'; ipElement.style.right = '0'; ipElement.style.backgroundColor = '#fff'; ipElement.style.padding = '10px'; ipElement.style.borderRadius = '5px 0 0 5px'; // 仅左侧圆角 ipElement.style.boxShadow = '0 0 10px rgba(0,0,0,0.5)'; ipElement.style.textAlign = 'left'; ipElement.style.zIndex = '9999'; ipElement.style.color = '#004085'; // 设置深蓝色字体颜色 ipElement.style.transition = 'right 0.5s'; // 平滑过渡效果 ipElement.style.width = '250px'; // 指定宽度 ipElement.style.right = '-250px'; // 默认隐藏在屏幕边缘 ipElement.innerHTML = `