[API] 获取客户端公网 IP 及位置

1. 接口描述

IP 库来源于网络,本站点不对结果的准确性负责,请在中国法律许可范围内使用.

接口地址: https://ipv4.ipw.cn/api/ip/locate

请求方法:GET

用途:返回客户端公网 IP 以及 IP 所在地理位置

频率限制:暂无,详见压测报告

2. 输入参数

参数名称类型描述
format(可选)String返回查询结果的格式, 可选 json,yaml,csv,例如 ?format=yaml

3. 输出参数

参数名称类型描述
resultbool查询结果, true 为成功, false 为失败
IPString客户端公网IP
Address.CountryStringIP 所属国家或地区
Address.ProvinceStringIP 所属省份
Address.CityStringIP 所属城市
ISPStringIP 所属运营商

4. 示例

4.1 cURL 获取本机公网IP及位置

输入示例

curl ipw.cn/api/ip/locate
1

通过命令行可以简写:

curl ipw.cn/l

curl ipw.cn/locate

输出示例

{
    "result":true,
    "IP":"106.224.145.147",
    "Address":{
        "Country":"中国",
        "Province":"江西",
        "City":"南昌"
    },
    "ISP":"电信"
}
1
2
3
4
5
6
7
8
9
10

4.2 Python 获取本机公网IP及位置

  • 输入示例
#!/usr/bin/python3

import json
import requests

## HTTP GET
r = requests.get('https://ipv4.ipw.cn/api/ip/locate')

##  转成 Python 字典并赋值
ip_detail = json.loads(r.text)

result = ip_detail['result']
IP = ip_detail['IP']
ISP = ip_detail['ISP']
Country = ip_detail['Address']['Country']
Province = ip_detail['Address']['Province']
City = ip_detail['Address']['City']

## 打印
print(result)
print(IP)
print(ISP)
print(Country + ',' + Province + ',' + City)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  • 输出示例
True
106.224.145.147
电信
中国,江西,南昌
1
2
3
4

4.3 Golang 获取本机公网IP及位置

  • 输入示例
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {

	type Address struct {
		Country  string `json:"Country"`
		Province string `json:"Province"`
		City     string `json:"City"`
	}

	type IPLocate struct {
		Result  bool    `json:"result"`
		IP      string  `json:"IP"`
		Address Address `json:"Address"`
		ISP     string  `json:"ISP"`
	}


	responseClient, errClient := http.Get("https://ipv4.ipw.cn/api/ip/locate") // 获取外网 IP
	if errClient != nil {
		fmt.Printf("获取外网 IP 失败,请检查网络\n")
		panic(errClient)
	}
	// 程序在使用完 response 后必须关闭 response 的主体。
	defer responseClient.Body.Close()

	body, _ := ioutil.ReadAll(responseClient.Body)

	var ipLocateResult IPLocate
	err := json.Unmarshal(body, &ipLocateResult)
	if err != nil {
		fmt.Println(err)
	}

	result := ipLocateResult.Result
	ip := ipLocateResult.IP
	country := ipLocateResult.Address.Country
	province := ipLocateResult.Address.Province
	city := ipLocateResult.Address.City
	isp := ipLocateResult.ISP

	fmt.Printf("Result: %t\n", result)
	fmt.Printf("IP: %s\n", ip)
	fmt.Printf("Addresss: %s,%s,%s\n", country, province, city)
	fmt.Printf("ISP: %s\n", isp)
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  • 输出示例
Result: true
IP: 106.224.145.147
Addresss: 中国,江西,南昌
ISP: 电信
1
2
3
4

5. 错误码

错误码描述
%s is not valid ip address.请求 IP 不是合法IP。 请求时请勿设置 X-Forwarded-For HTTP Header。