796 字
4 分钟

基于 EdgeOne Pages 函数构建免费的地理位置 API

gemini-aiAI 摘要

缘起#

在开发各种 Web 项目时,我们经常需要获取访问者的 IP 地址及其地理位置信息(如国家、地区、城市),以便实现语言自动切换、汇率显示、访问统计或区域内容分发等功能。

而恰好我们的 EdgeOne Pages 自带的“边缘函数(Functions)”能力,里面给我们提供了获取客户端地理位置信息的相关参数,我们只需要简单的代码,就可以利用其制作一个属于自己的、完全免费且全球加速的地理位置接口。

于是,这个小工具诞生了:EdgeOne-Pages-Functions-Geo

H2O-ME
/
EdgeOne-Pages-Functions-Geo
Waiting for api.github.com...
00K
0K
0K
Waiting...

特性#

  • 函数直接运行在腾讯云全球边缘节点。
  • 不仅提供 IP 地址,还涵盖了国家/地区、省份、城市、ASN 信息、经纬度、运营商等。
  • EdgeOne 每月提供免费请求额度,CPU 消耗几乎为零。
  • 支持 CORS 跨域请求,前端 JavaScript 可以直接 fetch 调用。
  • 提供标准的 JSON 格式输出。

技术实现#

传统的 IP 定位需要维护一个大型的 IP 数据库。而在 EdgeOne Pages 函数环境中,这些复杂的工作腾讯云已经通过运行时环境直接提供给了我们。

在 EdgeOne Pages 中,所有的地理位置和网络信息都已经封装在 context.request.eo 对象中。我们只需编写极简的代码将其提取并返回:

export function onRequest(context) {
const { request } = context;
// 提取 EdgeOne 提供的元数据
const eo = request.eo || {};
const geo = eo.geo || {};
// 根据调试信息,IP 存储在 eo.clientIp 中
const ip = eo.clientIp ||
request.headers.get('eo-client-ip') ||
request.headers.get('x-real-ip') ||
request.headers.get('cf-connecting-ip') ||
request.headers.get('x-forwarded-for')?.split(',')[0].trim() ||
'127.0.0.1';
const responseData = {
ip: ip,
asn: geo.asn || null,
countryName: geo.countryName || 'unknown',
countryCodeAlpha2: geo.countryCodeAlpha2 || 'unknown',
countryCodeAlpha3: geo.countryCodeAlpha3 || 'unknown',
countryCodeNumeric: geo.countryCodeNumeric || 'unknown',
regionName: geo.regionName || 'unknown',
regionCode: geo.regionCode || 'unknown',
cityName: geo.cityName || 'unknown',
latitude: geo.latitude || null,
longitude: geo.longitude || null,
cisp: geo.cisp || 'unknown'
};
// 处理 OPTIONS 请求(CORS 预检)
if (request.method === 'OPTIONS') {
return new Response(null, {
status: 204,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Max-Age': '86400',
},
});
}
// 返回地理位置信息并设置 CORS 头部
return new Response(JSON.stringify(responseData), {
headers: {
'Content-Type': 'application/json;charset=UTF-8',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
},
});
}

处理流程#

Loading Mermaid...

响应参数#

接口返回标准的 JSON 格式数据,包含访客的 IP 地址、地理位置及网络信息。

参数说明#

字段名类型含义说明
ipString访客的公网 IP 地址
asnNumber自治系统编号 (Autonomous System Number)
countryNameString国家名称(英文)
countryCodeAlpha2StringISO 标准两位国家代码(如 CN)
countryCodeAlpha3StringISO 标准三位国家代码(如 CHN)
countryCodeNumericStringISO 标准数字国家代码
regionNameString省份/自治区名称
regionCodeString省份代码(如 CN-SD)
cityNameString城市名称
latitudeNumber地理位置纬度
longitudeNumber地理位置经纬度
cispString运营商 (ISP) 名称

示例响应#

{
"ip": "45.221.98.10",
"asn": 140869,
"countryName": "United States of America",
"countryCodeAlpha2": "US",
"countryCodeAlpha3": "USA",
"countryCodeNumeric": "840",
"regionName": "California",
"regionCode": "US-CA",
"cityName": "Los Angeles",
"latitude": 34.05223083496094,
"longitude": -118.24368286132812,
"cisp": "Turing Group Limited"
}
基于 EdgeOne Pages 函数构建免费的地理位置 API
https://blog.tianhw.top/posts/edgeone-pages-functions-geo/
作者
THW
发布于
2026-02-13
许可协议
CC BY-NC-SA 4.0