Skip to content

🗂️ 命令速查

ipapi CLI 全部 9 个子命令与全局旗标的一页式速查表。一图抵千言,一表抵千行——本页是你在终端前的"翻字典"页:忘了某条命令的参数?想确认哪些命令走网络?想一眼对照退出码?都在这里。

概述

ipapi CLI 是围绕 pkg/ipapi SDK 构建的命令行工具,把 SDK 的核心能力(查 IP / 查本机 IP / 查单字段 / 查原始格式 / 列字段 / 版本 / 补全)映射成 9 个子命令。所有命令遵循同一套约定:

  • 📨 默认 JSON 信封:成功走 stdout,错误走 stderr——stdout 永远纯净,可以放心 | jq 或管道串联。
  • 🧭 统一配置来源:旗标 > 环境变量 > ~/.ipapi.json > 默认值。
  • 🔢 语义化退出码0 成功,2 用法错误,3-12 各类业务错误,70 内部错误——便于脚本判断。
  • 🧩 --human 双形态:机器读 JSON,人类读对齐表格 / 纯值行。

🚀 一行装好

bash
go install github.com/cyberspacesec/ipapi.co-skills/cmd/ipapi@latest

📋 子命令总表(9 条)

下表列出全部 9 个子命令。"需网络"列标注该命令是否会发起 HTTP 请求到 ipapi.co

命令用途参数示例需网络
ipapi info <ip>查指定 IP 的完整信息,返回 28 字段 JSON 信封<ip>(必填)ipapi info 8.8.8.8
ipapi me查本机公网 IP 的完整信息ipapi me
ipapi field <ip> <field>查指定 IP 的单个字段,返回 {field,value}<ip> <field>(均必填)ipapi field 8.8.8.8 country
ipapi me-field <field>查本机 IP 的单个字段<field>(必填)ipapi me-field country
ipapi raw <ip> -f <fmt>查指定 IP 的原始格式,直出原始字节到 stdout<ip> -f json|jsonp|xml|csv|yamlipapi raw 8.8.8.8 -f csv
ipapi me-raw -f <fmt>查本机 IP 的原始格式,直出原始字节-f <fmt>(必填)ipapi me-raw -f yaml
ipapi fields列出 28 个可查字段(本地、无网络)[--group X] [--json]ipapi fields --group geo
ipapi version打印版本信息[--json]ipapi version --json
ipapi completion <shell>生成 shell 补全脚本<bash|zsh|fish|powershell>ipapi completion bash
🔍 为什么 fields / version / completion 不走网络?

这 3 条命令是纯本地操作:fields 的字段清单硬编码在二进制里,version 读构建时注入的版本号,completion 由 cobra 本地生成补全脚本。它们即便断网、即便没有 API Key 也能跑——所以最适合用来验证安装是否成功。

命令分组一图流


🎛️ 全局旗标速查

下列旗标对所有子命令生效(cobra PersistentFlags),可在任意子命令前/后穿插使用。

旗标类型默认值环境变量说明
--api-keystringIPAPI_API_KEYAPI 密钥,留空走匿名(受限)调用
--api-key-modestringheaderIPAPI_API_KEY_MODE密钥传递方式:header(请求头)或 query(URL 参数)
-f / --formatstringjsonIPAPI_FORMAT原始格式输出格式:json / jsonp / xml / csv / yaml
--base-urlstringhttps://ipapi.co/IPAPI_BASE_URLAPI 基址,可指向代理或自建镜像
--user-agentstringipapi-cli/0.1.0自定义 User-Agent
--retriesint2重试次数,总请求数 = retries + 1
--timeoutduration10s单次请求超时,支持 30s / 2m 等 Go duration 写法
-H / --humanboolfalse人类可读输出(默认 JSON 信封)
--configstring~/.ipapi.json配置文件路径
--callbackstringJSONP 回调名,仅 raw / me-raw + jsonp 格式生效

⚠️ info--format 只认 json

info 子命令默认且仅支持 JSON 信封输出。若要拿到 xml / csv / yaml / jsonp原始字节,请改用 raw <ip> -f <fmt>——raw 才是"原始格式直出"的入口。

🧠 配置优先级记忆口诀

旗标 > 环境变量 > 配置文件 > 默认值——越靠近命令行,优先级越高。想在 CI 里临时覆盖某个值?用旗标;想在所有终端永久生效?写进 ~/.ipapi.json;想让脚本可移植?用环境变量。

配置文件示例

~/.ipapi.json 是普通 JSON,字段名用下划线:

json
{
  "api_key": "sk-xxxxxxxxxxxx",
  "api_key_mode": "header",
  "format": "json",
  "base_url": "https://ipapi.co/",
  "user_agent": "ipapi-cli/0.1.0",
  "retries": 2,
  "timeout": "10s",
  "callback": "handleResponse"
}
📝 timeout 在配置文件里是字符串

JSON 没有原生 duration 类型,所以配置文件里 timeout 写成 "10s" / "30s" / "2m" 这样的字符串,CLI 内部用 Go 的 time.ParseDuration 解析。旗标 --timeout 10s 同理。


📤 输出形态对照

不同命令、不同 --human 设置会产出不同形态的 stdout。下表帮你一眼选对组合。

目标推荐命令stdout 形态适合谁
机器解析完整信息ipapi info 8.8.8.8JSON 信封(含 data 28 字段)jq、脚本
人类看完整信息ipapi info 8.8.8.8 --human对齐表格终端肉眼
取单字段喂管道ipapi field 8.8.8.8 country --human纯值一行(如 USbash 管道、xargs
取单字段结构化ipapi field 8.8.8.8 country{"field":"country","value":"US"} 信封程序
拿 XML/CSV/YAML 原文ipapi raw 8.8.8.8 -f csv原始字节,无信封数据落盘、下游系统
拿 JSONP(前端用)ipapi raw 8.8.8.8 -f jsonp --callback cbcb({...})<script> 注入
列字段清单ipapi fields分组人类可读查字段名
列字段给脚本ipapi fields --jsonJSON 数组自动化

field --human 纯值示例

bash
$ ipapi field 8.8.8.8 country --human
US

一行纯值,可以直接接管道:

bash
# 批量取一批 IP 的国家码
for ip in 8.8.8.8 1.1.1.1 9.9.9.9; do
  printf "%s\t" "$ip"
  ipapi field "$ip" country --human
done

info 默认 JSON 信封示例

bash
$ ipapi info 8.8.8.8
json
{
  "ok": true,
  "command": "info",
  "args": { "ip": "8.8.8.8", "format": "json" },
  "data": {
    "ip": "8.8.8.8",
    "network": "8.8.8.0/23",
    "version": "IPv4",
    "city": "Mountain View",
    "region": "California",
    "country": "US",
    "country_name": "United States",
    "country_code": "US",
    "latitude": 37.4056,
    "longitude": -122.0775,
    "timezone": "America/Los_Angeles",
    "org": "GOOGLE",
    "asn": "AS15169"
  },
  "meta": {
    "format": "json",
    "durationMs": 312,
    "retrievedAt": "2026-07-04T10:01:22Z"
  }
}

📌 data 里其实是 28 个字段

上面示例为节省篇幅只展示了部分字段。完整 28 字段清单用 ipapi fields 查看,分组见下文。


🚦 退出码速查

脚本里 echo $? 判断结果时对这张表。

含义可重试典型场景
0成功正常返回
2USAGE 用法错误参数缺失、子命令拼错
3INVALID_IPipapi info 999.1.1.1
4INVALID_FIELD字段名拼错
5INVALID_FORMATraw -f txt(不支持)
6RATE_LIMITED触发限流,稍后重试
7RESERVED_IP私有/保留地址段
8NOT_FOUND查不到结果
9SERVER_ERROR上游 5xx
10METHOD_NOT_ALLOWEDHTTP 方法错误
11INVALID_KEYAPI Key 无效
12UNEXPECTED_DATA返回数据解析失败
70INTERNAL内部异常

🔁 区分"可重试"与"不可重试"

退出码 6 / 8 / 9 标记为 retryable: true——这类错误多半是瞬时性的(限流、上游抖动),脚本里配合 --retries 与退避重试是合理策略。其余码(3/4/5/7/11/12 等)是确定性错误,重试也是同样结果,应直接修正输入。

错误信封示例(stderr)

bash
$ ipapi info 999.1.1.1
# stdout: 空
# stderr:
json
{
  "ok": false,
  "command": "info",
  "args": { "ip": "999.1.1.1" },
  "error": {
    "code": "INVALID_IP",
    "message": "invalid IP address: 999.1.1.1",
    "sentinel": "ErrInvalidIP",
    "retryable": false
  }
}

🔁 命令调用流程图

ipapi info 8.8.8.8 为例,看清一条命令从"回车"到"打印"经历了什么。

🧩 CLI 与 SDK 的关系

CLI 是 SDK 的薄封装:info 对应 Client.GetIPInfome 对应 Client.GetClientIPInfofield 对应 Client.GetFieldraw 对应 Client.GetIPInfoRawme-raw 对应 Client.GetClientIPInfoRawme-field 对应 Client.GetClientField。CLI 负责参数解析、配置合并、信封封装、退出码映射;SDK 负责真正的 HTTP 调用与数据结构。脚本里用 CLI,程序里用 SDK——同一套底层,两种入口。

错误处理决策树


🗂️ 28 字段分组速查

ipapi fields 列出的 28 个可查字段按主题分 7 组:

字段
🆔 identityip network version hostname
🌍 geocity region region_code country country_name country_code country_code_iso3 country_capital country_tld continent_code in_eu postal latitude longitude latlong
⏰ timetimezone utc_offset
📡 networkasn org
🗣️ culturelanguages country_calling_code
💰 economycurrency currency_name
📊 statscountry_area country_population

🔎 按组列字段

bash
# 只看 geo 组
ipapi fields --group geo

# 拿到 JSON 给脚本消费
ipapi fields --json

fields 命令本地无网络,字段清单与 SDK 的 IPInfo 结构体一一对应。


🧪 常见组合速用

首次安装自检

bash
# 不联网、不要 Key 也能跑——验证安装
ipapi version
ipapi fields --group identity

匿名查本机公网 IP

bash
# 没配 Key 也能查(匿名有独立限流)
ipapi me --human

带 Key 查指定 IP 的国家

bash
export IPAPI_API_KEY=sk-xxxxxxxxxxxx
ipapi field 8.8.8.8 country --human
# => US

导出 CSV 落盘

bash
# raw 直出原始字节,重定向到文件
ipapi raw 8.8.8.8 -f csv > 8.8.8.8.csv

脚本里判断结果

bash
if ipapi info 8.8.8.8 > /dev/null 2>&1; then
  echo "查询成功"
else
  rc=$?
  echo "失败 退出码=$rc" >&2
fi

⚠️ raw 的错误也走 stderr

raw / me-raw 成功时 stdout 是原始字节(无信封),但失败时错误仍然走 stderr 信封——所以脚本里要 2> 单独捕获错误,不要把 stderr 混进 stdout 的原始数据。


⚙️ 配置优先级可视化


📖 想深入每条命令?

本页是速查表。每条子命令的详细参数、旗标、输出示例、退出码语义、与 SDK 方法的对应关系,见各命令专页:

  • info · me · field · me-field · raw · me-raw · fields · version · completion

下一步

对应 SDK 方法

ipapi CLI 是 pkg/ipapi SDK 的命令行封装。子命令与 SDK 方法的对应关系:

子命令SDK 方法文档
info <ip>Client.GetIPInfo/api/get-ip-info
meClient.GetClientIPInfo/api/get-client-ip-info
field <ip> <field>Client.GetField/api/get-field
me-field <field>Client.GetClientField/api/get-client-field
raw <ip> -f <fmt>Client.GetIPInfoRaw/api/get-ip-info-raw
me-raw -f <fmt>Client.GetClientIPInfoRaw/api/get-client-ip-info-raw
fieldsIPInfo 结构体字段/api/fields
version
completion <shell>

🔗 源码

CLI 入口与命令定义见仓库 cmd/ipapi/ 目录。

基于 MIT 许可证发布