Appearance
在线客服怎么显示访客IP归属地?客户来自哪个城市一眼看到
做客服系统的都知道一个痛点:客户在对话里说"网好卡""页面打不开",客服第一反应是想知道他在哪个城市、用的什么宽带——这直接决定排查方向。让客服工作台自动显示访客的 IP 归属地,这个需求用免费接口就能实现,今天分享完整做法。
一、整体思路
流程很简单:客服系统后端在用户进入会话时拿到他的 IP → 调 IP 归属地接口 → 把结果缓存起来 → 推给前端工作台展示。
- 查当前请求方 IP:
https://ip9.com.cn/get(不传参) - 查指定 IP:
https://ip9.com.cn/get?ip=<用户IP>
免费版 60 次/分钟,一个客服会话也就查 1 次,加个缓存完全够用。
二、后端实现(FastAPI 示例)
python
from fastapi import FastAPI, Request
import requests, time
app = FastAPI()
cache = {} # 简单内存缓存:ip -> (归属地, 过期时间)
def query_ip(ip: str):
now = time.time()
hit = cache.get(ip)
if hit and hit[1] > now:
return hit[0]
r = requests.get(f"https://ip9.com.cn/get?ip={ip}", timeout=3)
data = r.json().get("data", {}) # ret=200 表示成功,结果在 data 里
addr = f"{data.get('country','')}{data.get('prov','')}{data.get('city','')}"
result = {"ip": data.get("ip", ip), "addr": addr, "isp": data.get("isp","")}
cache[ip] = (result, now + 3600) # 缓存 1 小时
return result
@app.get("/api/visitor-location")
async def visitor_location(request: Request):
# 生产环境从 X-Forwarded-For 取真实 IP,注意防伪造
ip = request.headers.get("x-real-ip") or request.client.host
return query_ip(ip)缓存 1 小时,意味着同一 IP 重复进线不会重复消耗免费额度;真到了 60 次/分钟都不够的量,再考虑升级 VIP。
三、前端工作台展示
客服工作台在会话卡片上显示归属地,用几行 JS 就能实现:
javascript
// 会话建立后拉取访客归属地
async function loadVisitorLocation(sessionId) {
const res = await fetch(`/api/visitor-location?session=${sessionId}`);
const { ip, addr, isp } = await res.json();
document.querySelector(`#session-${sessionId} .location`).textContent =
`${addr} · ${isp} · ${ip}`;
}效果就是每个会话旁边显示"中国广东深圳 · 电信 · 119.12.xx.xx",客服一眼就知道客户在哪。别小看这一行字,客户说"我打不开页面"时,客服能直接判断"深圳电信访问我们华东机房,可能是跨地域链路问题",处理效率完全不一样。
四、进阶玩法
- 按地区分配客服:查询结果里
prov/city是现成的,根据客户省份把会话路由给对应区域的客服组,减少沟通成本。 - 区域统计:把每天的查询结果落库,就能统计出客户地域分布,市场部做投放参考。
- VIP 精细化:需要显示到区县、或者想判断对方是企业宽带(BUS)还是机房(IDC)——比如识别批量注册的机器人账号——可以升级 VIP 版,接口会额外返回
area(区县)、ip_type、ip_asn字段,这些都是免费版没有的。
总结
客服系统显示访客 IP 归属地,本质就是"拿 IP → 查接口 → 展示",难点只在真实 IP 的获取和缓存设计。IP9 免费版免注册免鉴权,返回国家/省市/运营商,精准度中国城市 99.2%,客服场景绰绰有余。接口文档在 https://ip9.com.cn/get ,官网 https://www.ip9.com.cn 上也有字段说明,照着上面的代码改改就能上线。