Skip to content

测试IP来源

webdesc
curl

Python

纯Python

python
import json
from http.server import BaseHTTPRequestHandler, HTTPServer
import socket
import urllib.parse
import ipaddress 
import http.client
from urllib.parse import urlparse

def native_get_request(url):
    # 解析 URL
    parsed_url = urlparse(url)
    host = parsed_url.netloc
    path = parsed_url.path or "/"
    if parsed_url.query:
        path += f"?{parsed_url.query}"

    # 创建 HTTP 连接(HTTPS 需改用 http.client.HTTPSConnection)
    conn = http.client.HTTPConnection(host)
    
    try:
        # 发送 GET 请求
        conn.request("GET", path)
        response = conn.getresponse()
        
        # 读取响应内容
        data = response.read().decode("utf-8")
        
        return {
            "status": response.status,
            "reason": response.reason,
            "headers": dict(response.getheaders()),
            "data": data
        }
    finally:
        conn.close()

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.handle_request("GET")

    def do_POST(self):
        self.handle_request("POST")

    def do_PUT(self):
        self.handle_request("PUT")

    def do_DELETE(self):
        self.handle_request("DELETE")

    def do_PATCH(self):
        self.handle_request("PATCH")

    def get_ip_geolocation(self,ip):
        """获取 IP 归属地信息(使用免费 API)"""
        try:
            response = native_get_request(f"http://ip-api.com/json/{ip}?fields=country,regionName,city,isp")
            return json.loads(response['data'])
        except:
            return {"error": "无法获取 IP 归属地"}

    def handle_request(self, method):
        # 1. 解析请求路径和查询参数
        parsed_path = urllib.parse.urlparse(self.path)
        query_params = urllib.parse.parse_qs(parsed_path.query)

        # 2. 解析请求体(仅处理 application/x-www-form-urlencoded 和 plain text)
        content_length = int(self.headers.get("Content-Length", 0))
        post_data = self.rfile.read(content_length).decode("utf-8")
        try:
            post_data = urllib.parse.parse_qs(post_data)  # 尝试解析 Form-Data
        except:
            pass  # 保留原始数据(如 JSON 或纯文本)

        # 3. 获取客户端 IP 和代理 IP
        client_ip = self.client_address[0]
        proxy_ip = self.headers.get("X-Forwarded-For", None)  # 代理场景

        # 4. 获取 IP 归属地(纯本地模拟,无第三方 API)
        ip_geolocation = self.get_ip_geolocation(client_ip)

        # 5. 构造响应数据
        response_data = {
            "client_ip": client_ip,
            "proxy_ip": proxy_ip,
            "ip_geolocation": ip_geolocation,
            "request_method": method,
            "path": self.path,
            "query_params": query_params,
            "post_data": post_data,
            "headers": dict(self.headers),
        }

        print('------------------------------------------------------------------')
        
        # 6. 返回 JSON 响应
        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.end_headers()
        self.wfile.write(json.dumps(response_data, indent=2).encode("utf-8"))
        print(f"client_ip: {client_ip}, proxy_ip: {proxy_ip}, ip_geolocation: {json.dumps(ip_geolocation)}")

    

if __name__ == "__main__":
    host = "0.0.0.0"
    port = 80
    server = HTTPServer((host, port), RequestHandler)
    print(f"Server running on http://{host}:{port}")
    server.serve_forever()

引用第三方库实现

python
# pip install flask requests -i https://mirrors.aliyun.com/pypi/simple/


from flask import Flask, request, jsonify
import requests
import ipaddress

app = Flask(__name__)

def get_ip_geolocation(ip):
    """获取 IP 归属地信息(使用免费 API)"""
    try:
        response = requests.get(f"http://ip-api.com/json/{ip}?fields=country,regionName,city,isp")
        return response.json()
    except:
        return {"error": "无法获取 IP 归属地"}

def get_client_ip():
    """获取客户端真实 IP(考虑代理情况)"""
    if request.headers.getlist("X-Forwarded-For"):
        # 如果经过代理,X-Forwarded-For 会包含客户端 IP 和代理 IP
        proxy_ips = request.headers.getlist("X-Forwarded-For")
        client_ip = proxy_ips[0]  # 第一个 IP 是客户端 IP
        proxy_ip = proxy_ips[-1] if len(proxy_ips) > 1 else None
    else:
        client_ip = request.remote_addr
        proxy_ip = None
    return client_ip, proxy_ip

@app.route('/', methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])
def handle_request():
    # 1. 获取客户端 IP 和代理 IP
    client_ip, proxy_ip = get_client_ip()

    # 2. 获取 IP 归属地
    ip_geolocation = get_ip_geolocation(client_ip)

    # 3. 获取请求数据(JSON / Form-Data / Query String)
    request_data = None
    if request.is_json:
        request_data = request.json
    elif request.form:
        request_data = request.form.to_dict()
    else:
        request_data = request.args.to_dict()

    # 4. 构造返回数据
    response_data = {
        "client_ip": client_ip,
        "proxy_ip": proxy_ip,
        "ip_geolocation": ip_geolocation,
        "request_method": request.method,
        "request_data": request_data,
        "headers": dict(request.headers),
    }

    return jsonify(response_data)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)

请求

py
from urllib.request import Request, urlopen
import urllib.parse

# POST 请求
url = 'http://49.232.53.251/'
data = {'key1': 'value1', 'key2': 'value2'}
data = urllib.parse.urlencode(data).encode('utf-8')

headers = {
    'User-Agent': 'Mozilla/5.0',
    'Accept': 'text/html',
    'session': 'loveagri',
}

req = Request(url, data=data, method='POST',headers=headers)
with urlopen(req) as response:
    print(response.read().decode('utf-8'))

系统信息

python
import os
import platform
import sys
import time
import re

def get_system_info():
    print("========== 系统信息 ==========")
    
    # 操作系统信息
    print(f"操作系统: {platform.system()} {platform.release()}")
    print(f"系统版本: {platform.version()}")
    print(f"系统架构: {platform.machine()}")
    print(f"主机名: {platform.node()}")
    print(f"Python版本: {sys.version.split()[0]}")
    
    # Linux发行版信息
    if platform.system() == "Linux":
        try:
            with open("/etc/os-release") as f:
                content = f.read()
                if "PRETTY_NAME" in content:
                    distro = re.search(r'PRETTY_NAME="(.+?)"', content).group(1)
                    print(f"Linux发行版: {distro}")
        except FileNotFoundError:
            pass
    
    # CPU信息
    print("\n========== CPU信息 ==========")
    print(f"处理器: {platform.processor()}")
    
    if platform.system() == "Windows":
        print(f"CPU核心数: {os.cpu_count()}")
    elif platform.system() == "Linux":
        try:
            with open("/proc/cpuinfo") as f:
                cpuinfo = f.read()
                model_names = re.findall(r'model name\s*:\s*(.+?)\n', cpuinfo)
                if model_names:
                    print(f"CPU型号: {model_names[0]}")
                    print(f"CPU核心数: {len(model_names)}")
        except FileNotFoundError:
            pass
    
    # 内存信息
    print("\n========== 内存信息 ==========")
    if platform.system() == "Windows":
        import ctypes
        kernel32 = ctypes.windll.kernel32
        mem_status = ctypes.create_string_buffer(64)
        if kernel32.GlobalMemoryStatusEx(mem_status):
            total_mem = int.from_bytes(mem_status[8:16], byteorder='little')
            avail_mem = int.from_bytes(mem_status[16:24], byteorder='little')
            print(f"总内存: {total_mem / (1024**3):.2f} GB")
            print(f"可用内存: {avail_mem / (1024**3):.2f} GB")
            print(f"内存使用率: {(1 - avail_mem/total_mem)*100:.2f}%")
    elif platform.system() == "Linux":
        try:
            with open("/proc/meminfo") as f:
                meminfo = f.read()
                total = int(re.search(r'MemTotal:\s+(\d+) kB', meminfo).group(1))
                free = int(re.search(r'MemFree:\s+(\d+) kB', meminfo).group(1))
                available = int(re.search(r'MemAvailable:\s+(\d+) kB', meminfo).group(1))
                print(f"总内存: {total / 1024:.2f} MB")
                print(f"可用内存: {available / 1024:.2f} MB")
                print(f"内存使用率: {(1 - available/total)*100:.2f}%")
        except (FileNotFoundError, AttributeError):
            pass
    
    # 当前目录信息
    print("\n========== 目录信息 ==========")
    print(f"当前工作目录: {os.getcwd()}")
    print(f"脚本所在目录: {os.path.dirname(os.path.abspath(__file__))}")
    print(f"脚本文件名: {os.path.basename(__file__)}")
    
    # 系统运行时间
    if platform.system() == "Linux":
        try:
            with open("/proc/uptime") as f:
                uptime_seconds = float(f.read().split()[0])
                uptime = time.strftime("%H:%M:%S", time.gmtime(uptime_seconds))
                print(f"\n系统运行时间: {uptime}")
        except FileNotFoundError:
            pass

if __name__ == "__main__":
    get_system_info()

更详细系统信息

py
import os
import platform
import sys
import time
import re
import socket
import getpass
from datetime import datetime

def print_header(title):
    print("\n" + "=" * 60)
    print(f" {title.upper()} ".center(60, '='))
    print("=" * 60)

def get_os_info():
    print_header("操作系统信息")
    info = {
        "系统类型": f"{platform.system()} {platform.release()}",
        "系统版本": platform.version(),
        "系统架构": platform.machine(),
        "主机名": platform.node(),
        "Python版本": sys.version.split()[0]
    }
    
    if platform.system() == "Linux":
        try:
            with open("/etc/os-release") as f:
                content = f.read()
                if "PRETTY_NAME" in content:
                    distro = re.search(r'PRETTY_NAME="(.+?)"', content).group(1)
                    info["Linux发行版"] = distro
        except FileNotFoundError:
            pass
    
    for key, value in info.items():
        print(f"{key:>15}: {value}")

def get_cpu_info():
    print_header("CPU信息")
    info = {
        "处理器": platform.processor(),
        "逻辑核心数": os.cpu_count()
    }
    
    if platform.system() == "Linux":
        try:
            with open("/proc/cpuinfo") as f:
                cpuinfo = f.read()
                model_names = re.findall(r'model name\s*:\s*(.+?)\n', cpuinfo)
                if model_names:
                    info["CPU型号"] = model_names[0]
                    info["物理核心数"] = len(set(re.findall(r'physical id\s*:\s*(\d+)', cpuinfo)))
        except FileNotFoundError:
            pass
    
    for key, value in info.items():
        print(f"{key:>15}: {value}")

def get_memory_info():
    print_header("内存信息")
    
    if platform.system() == "Windows":
        import ctypes
        kernel32 = ctypes.windll.kernel32
        mem_status = ctypes.create_string_buffer(64)
        if kernel32.GlobalMemoryStatusEx(mem_status):
            total_mem = int.from_bytes(mem_status[8:16], byteorder='little') / (1024**3)
            avail_mem = int.from_bytes(mem_status[16:24], byteorder='little') / (1024**3)
            usage = (1 - avail_mem/total_mem) * 100
            print(f"{'总内存':>15}: {total_mem:.2f} GB")
            print(f"{'可用内存':>15}: {avail_mem:.2f} GB")
            print(f"{'内存使用率':>15}: {usage:.2f}%")
    
    elif platform.system() == "Linux":
        try:
            with open("/proc/meminfo") as f:
                meminfo = f.read()
                total = int(re.search(r'MemTotal:\s+(\d+) kB', meminfo).group(1)) / 1024
                available = int(re.search(r'MemAvailable:\s+(\d+) kB', meminfo).group(1)) / 1024
                usage = (1 - available/total) * 100
                print(f"{'总内存':>15}: {total:.2f} MB")
                print(f"{'可用内存':>15}: {available:.2f} MB")
                print(f"{'内存使用率':>15}: {usage:.2f}%")
        except (FileNotFoundError, AttributeError):
            print("无法获取内存信息")

def get_disk_info():
    print_header("磁盘信息")
    
    if platform.system() == "Windows":
        import ctypes
        import string
        
        kernel32 = ctypes.windll.kernel32
        GetDiskFreeSpaceEx = kernel32.GetDiskFreeSpaceExW
        
        for drive in string.ascii_uppercase:
            drive_path = f"{drive}:\\"
            if os.path.exists(drive_path):
                total_bytes = ctypes.c_ulonglong(0)
                free_bytes = ctypes.c_ulonglong(0)
                
                if GetDiskFreeSpaceEx(drive_path, None, ctypes.byref(total_bytes), ctypes.byref(free_bytes)):
                    total = total_bytes.value / (1024**3)
                    free = free_bytes.value / (1024**3)
                    used = total - free
                    usage = (used / total) * 100
                    print(f"{drive}盘:")
                    print(f"{'总容量':>18}: {total:.2f} GB")
                    print(f"{'已用空间':>18}: {used:.2f} GB")
                    print(f"{'可用空间':>18}: {free:.2f} GB")
                    print(f"{'使用率':>18}: {usage:.2f}%")
                    print("-" * 40)
    
    elif platform.system() == "Linux":
        try:
            with open("/proc/mounts") as f:
                for line in f:
                    if line.startswith('/dev/'):
                        parts = line.split()
                        try:
                            stat = os.statvfs(parts[1])
                            total = stat.f_blocks * stat.f_frsize / (1024**3)
                            free = stat.f_bfree * stat.f_frsize / (1024**3)
                            used = total - free
                            usage = (used / total) * 100
                            print(f"挂载点 {parts[1]}:")
                            print(f"{'总容量':>18}: {total:.2f} GB")
                            print(f"{'已用空间':>18}: {used:.2f} GB")
                            print(f"{'可用空间':>18}: {free:.2f} GB")
                            print(f"{'使用率':>18}: {usage:.2f}%")
                            print("-" * 40)
                        except OSError:
                            continue
        except FileNotFoundError:
            print("无法获取磁盘信息")

def get_network_info():
    print_header("网络信息")
    
    try:
        hostname = socket.gethostname()
        local_ip = socket.gethostbyname(hostname)
        print(f"{'主机名':>15}: {hostname}")
        print(f"{'本地IP':>15}: {local_ip}")
        
        if platform.system() == "Linux":
            try:
                with open("/proc/net/dev") as f:
                    print("\n网络接口统计:")
                    print(f.read())
            except FileNotFoundError:
                pass
    except socket.error:
        print("无法获取网络信息")

def get_user_info():
    print_header("用户信息")
    print(f"{'当前用户':>15}: {getpass.getuser()}")
    print(f"{'用户家目录':>15}: {os.path.expanduser('~')}")

def get_directory_info():
    print_header("目录信息")
    print(f"{'当前工作目录':>15}: {os.getcwd()}")


def get_uptime():
    if platform.system() == "Linux":
        print_header("系统运行时间")
        try:
            with open("/proc/uptime") as f:
                uptime_seconds = float(f.read().split()[0])
                days = int(uptime_seconds // 86400)
                hours = int((uptime_seconds % 86400) // 3600)
                minutes = int((uptime_seconds % 3600) // 60)
                print(f"{'运行时间':>15}: {days}{hours}小时 {minutes}分钟")
        except FileNotFoundError:
            pass

def main():
    print(f"\n{' 系统信息报告 ':=^60}")
    print(f"{' 生成时间: ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S') :^60}")
    print(f"{'='*60}\n")
    
    get_os_info()
    get_cpu_info()
    get_memory_info()
    get_disk_info()
    get_network_info()
    get_user_info()
    get_directory_info()
    get_uptime()
    
    print("\n" + "=" * 60)
    print(f"{' 报告结束 ':=^60}")
    print("=" * 60)

if __name__ == "__main__":
    main()

Nodejs

原生

js
const http = require('http');
const url = require('url');
const https = require('https');
const { StringDecoder } = require('string_decoder');

const fs = require('fs');
// 将两个证书文件读取放到options对象中
// 使用readFileSync()方法,顺序地执行读文件和启动服务操作
const options = {    
key: fs.readFileSync('/etc/nginx/test.dotohi.com_nginx/test.dotohi.com.key'),
cert: fs.readFileSync('/etc/nginx/test.dotohi.com_nginx/test.dotohi.com_bundle.crt')
};


// HTTP 服务器 (80端口)
const httpServer = http.createServer((req, res) => {
  // 重定向所有HTTP请求到HTTPS
  res.writeHead(301, {
    'Location': `https://${req.headers.host}${req.url}`
  });
  res.end();
});



function getIpGeo(ip) {
  console.log(ip)
  return new Promise((resolve, reject) => {
    const url = `http://ip-api.com/json/${ip}?fields=country,regionName,city,isp,status,query`;
    
    http.get(url, (res) => {
      let data = '';
      res.on('data', (chunk) => data += chunk);
      res.on('end', () => {
        try {
          const entries = data.slice(1, -1).split(',').map(pair => {
            const [key, value] = pair.split(':').map(s => s.trim().replace(/"/g, ''));
            return [key, value];
          });

          const obj = Object.fromEntries(entries);

          if (obj.status === 'success') {
            resolve(obj);
          } else {
            reject(new Error(obj.message || 'IP 查询失败'));
          }
        } catch (err) {
          reject(err);
        }
      });
    }).on('error', reject);
  });
}

// 创建 HTTP 服务器
const httpsServer = https.createServer(options, async (req, res) => {
  // 1. 解析请求路径和查询参数
  const parsedUrl = url.parse(req.url, true);
  const path = parsedUrl.pathname;
  const query = parsedUrl.query;

  // 2. 获取请求方法(GET/POST/PUT/DELETE/PATCH 等)
  const method = req.method.toUpperCase();

  // 3. 获取客户端 IP 和代理 IP(如果有)
  const clientIp = req.socket.remoteAddress || req.connection.remoteAddress;
  const proxyIps = req.headers['x-forwarded-for']; // 代理服务器传递的原始 IP

  // 4. 模拟 IP 归属地查询(实际需接入第三方 API 或本地数据库)
  const ipGeolocation = await getIpGeolocation(clientIp.replace("::ffff:", ""));

  // 5. 获取请求头
  const headers = req.headers;

  // 6. 处理请求体数据(非 GET 请求)
  let body = {};
  const decoder = new StringDecoder('utf-8');
  let rawBody = '';

  req.on('data', (chunk) => {
    rawBody += decoder.write(chunk);
  });

  req.on('end', () => {
    rawBody += decoder.end();

    // 尝试解析 JSON 或 Form-Data
    if (rawBody) {
      try {
        body = JSON.parse(rawBody);
      } catch (e) {
        // 如果不是 JSON,按 Form-Data 处理(简化版)
        body = rawBody.split('&').reduce((acc, pair) => {
          const [key, value] = pair.split('=');
          acc[key] = value;
          return acc;
        }, {});
      }
    }

    // 7. 构造响应数据
    const responseData = {
      clientIp:clientIp.replace("::ffff:", ""),
      proxyIps: proxyIps ? proxyIps.split(',') : null,
      ipGeolocation,
      method,
      path,
      query,
      headers,
      body: Object.keys(body).length ? body : null,
    };

    // 8. 返回 JSON 响应
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify(responseData, null, 2));
  });
});

// 模拟 IP 归属地查询(实际需替换为真实逻辑)
async function getIpGeolocation(ip) {
  // 示例:简单判断 IPv4/IPv6 和本地 IP
  if (ip === '::1' || ip === '127.0.0.1') {
    return { type: 'local', country: 'Localhost' };
  } 

  try {
    const result = await getIpGeo(ip); // Google DNS
    console.log('IP 归属地:', {
      ip: result.query,
      country: result.country,
      region: result.regionName,
      city: result.city,
      isp: result.isp,
    });
    console.log('-----------------------------------------------------------')
    return {
      ip: result.query,
      country: result.country,
      region: result.regionName,
      city: result.city,
      isp: result.isp,
    }
  } catch (err) {
    console.error('Error:', err.message);
  }
}

// 启动服务器
const PORT80 = 80;
httpServer.listen(PORT80, () => {
  console.log(`Server running on port: ${PORT80}`);
});
const PORT443 = 443;
httpsServer.listen(PORT443, () => {
  console.log(`Server running on port: ${PORT443}`);
});

显示系统信息

js
const os = require('os');
const process = require('process');
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

function printSection(title) {
  console.log(`\n${'='.repeat(50)}`);
  console.log(` ${title.toUpperCase()} `.padStart(25 + title.length/2, '=').padEnd(50, '='));
  console.log(`${'='.repeat(50)}\n`);
}

// 1. 操作系统信息
function getOSInfo() {
  printSection('操作系统信息');
  
  const info = {
    '系统类型': os.type(),
    '系统平台': os.platform(),
    '系统架构': os.arch(),
    '系统版本': os.release(),
    '主机名': os.hostname(),
    'Node.js版本': process.version
  };

  // Linux发行版信息
  if (os.platform() === 'linux') {
    try {
      const release = fs.readFileSync('/etc/os-release', 'utf8');
      const prettyName = release.match(/PRETTY_NAME="(.+)"/);
      if (prettyName) {
        info['Linux发行版'] = prettyName[1];
      }
    } catch (e) {
      // 忽略错误
    }
  }

  for (const [key, value] of Object.entries(info)) {
    console.log(`${key.padEnd(15)}: ${value}`);
  }
}

// 2. CPU信息
function getCPUInfo() {
  printSection('CPU信息');
  
  const cpus = os.cpus();
  const info = {
    'CPU型号': cpus[0].model,
    'CPU核心数': `${cpus.length} (${new Set(cpus.map(cpu => cpu.speed)).size}种频率)`,
    'CPU架构': os.arch(),
    '系统负载': os.loadavg().map(v => v.toFixed(2)).join(', ')
  };

  if (os.platform() === 'linux') {
    try {
      const cpuinfo = fs.readFileSync('/proc/cpuinfo', 'utf8');
      const physicalIds = new Set();
      const matches = cpuinfo.matchAll(/physical id\s*:\s*(\d+)/g);
      for (const match of matches) {
        physicalIds.add(match[1]);
      }
      info['物理核心数'] = physicalIds.size;
    } catch (e) {
      // 忽略错误
    }
  }

  for (const [key, value] of Object.entries(info)) {
    console.log(`${key.padEnd(15)}: ${value}`);
  }
}

// 3. 内存信息
function getMemoryInfo() {
  printSection('内存信息');
  
  const totalMem = os.totalmem();
  const freeMem = os.freemem();
  const usedMem = totalMem - freeMem;
  const usagePercent = (usedMem / totalMem * 100).toFixed(2);
  
  const format = (bytes) => {
    const gb = bytes / (1024 ** 3);
    return `${gb.toFixed(2)} GB`;
  };

  console.log(`总内存: ${format(totalMem)}`);
  console.log(`已使用: ${format(usedMem)} (${usagePercent}%)`);
  console.log(`空闲内存: ${format(freeMem)}`);
}

// 4. 磁盘信息
function getDiskInfo() {
  printSection('磁盘信息');
  
  if (os.platform() === 'linux') {
    try {
      const dfOutput = execSync('df -h').toString();
      console.log(dfOutput);
    } catch (e) {
      console.log('无法获取磁盘信息:', e.message);
    }
  } else if (os.platform() === 'win32') {
    try {
      const wmicOutput = execSync('wmic logicaldisk get size,freespace,caption').toString();
      console.log(wmicOutput);
    } catch (e) {
      console.log('无法获取磁盘信息:', e.message);
    }
  } else {
    console.log('当前系统不支持自动获取磁盘信息');
  }
}

// 5. 网络信息
function getNetworkInfo() {
  printSection('网络信息');
  
  const interfaces = os.networkInterfaces();
  for (const [name, addrs] of Object.entries(interfaces)) {
    console.log(`接口: ${name}`);
    for (const addr of addrs) {
      if (addr.family === 'IPv4' && !addr.internal) {
        console.log(`  IPv4地址: ${addr.address}`);
        console.log(`  子网掩码: ${addr.netmask}`);
        console.log(`  MAC地址: ${addr.mac || 'N/A'}`);
      }
    }
  }
}

// 6. 用户和目录信息
function getUserAndDirInfo() {
  printSection('用户和目录信息');
  
  console.log(`当前用户: ${os.userInfo().username}`);
  console.log(`用户家目录: ${os.homedir()}`);
  console.log(`当前工作目录: ${process.cwd()}`);
  console.log(`脚本所在目录: ${path.dirname(__filename)}`);
  console.log(`脚本文件名: ${path.basename(__filename)}`);
}

// 7. 系统运行时间
function getUptime() {
  printSection('系统运行时间');
  
  const uptime = os.uptime();
  const days = Math.floor(uptime / 86400);
  const hours = Math.floor((uptime % 86400) / 3600);
  const minutes = Math.floor((uptime % 3600) / 60);
  
  console.log(`系统已运行: ${days}${hours}小时 ${minutes}分钟`);
}

// 主函数
function main() {
  console.log(`\n${' 系统信息报告 '.padStart(30, '=').padEnd(60, '=')}`);
  console.log(` 生成时间: ${new Date().toLocaleString()} `.padStart(40, ' ').padEnd(60, ' '));
  console.log(`${'='.repeat(60)}\n`);
  
  getOSInfo();
  getCPUInfo();
  getMemoryInfo();
  getDiskInfo();
  getNetworkInfo();
  getUserAndDirInfo();
  getUptime();
  
  console.log(`\n${'='.repeat(60)}`);
  console.log(` ${' 报告结束 '.padStart(30, '=').padEnd(60, '=')}`);
  console.log(`${'='.repeat(60)}`);
}

main();

PHP

原生

php
<?php
// 设置响应头为 JSON 格式
header('Content-Type: application/json');

// 1. 获取请求方法
$method = $_SERVER['REQUEST_METHOD'];

// 2. 获取客户端 IP 和代理 IP
$clientIp = $_SERVER['REMOTE_ADDR'] ?? 'Unknown';
$proxyIps = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? null; // 代理服务器传递的原始 IP

// 3. 获取 IP 归属地(调用免费 API,需网络)
function getIpGeo($ip) {
    $url = "http://ip-api.com/json/{$ip}?fields=status,country,regionName,city,isp";
    $response = @file_get_contents($url); // 忽略警告
    return $response ? json_decode($response, true) : ['error' => 'API 请求失败'];
}

$ipGeo = getIpGeo($clientIp);

// 4. 解析请求数据
$requestData = [];
if ($method === 'GET') {
    $requestData = $_GET;
} else {
    // 处理非 GET 请求的原始数据(JSON/Form-Data)
    $rawInput = file_get_contents('php://input');
    if (strpos($_SERVER['CONTENT_TYPE'] ?? '', 'application/json') !== false) {
        $requestData = json_decode($rawInput, true) ?? [];
    } else {
        parse_str($rawInput, $requestData); // 解析 Form-Data
    }
}

// 5. 构造响应数据
$response = [
    'meta' => [
        'method' => $method,
        'client_ip' => $clientIp,
        'proxy_ips' => $proxyIps ? explode(',', $proxyIps) : null,
        'ip_geolocation' => $ipGeo,
    ],
    'data' => $requestData,
    'headers' => getallheaders(),
];

// 6. 返回 JSON 响应
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

调用

sh
sudo php -S 0.0.0.0:80 pure.php

请求测试

php
<?php
$url = 'http://49.232.53.251/';
$data = ['name' => 'John', 'age' => 30];

$jsonData = json_encode($data);

$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: application/json\r\n" .
                    "Content-Length: " . strlen($jsonData),
        'content' => $jsonData,
    ],
]);

$result = file_get_contents($url, false, $context);
echo $result;