796 字
4 分钟
基于 EdgeOne Pages 函数构建免费的地理位置 API
缘起
在开发各种 Web 项目时,我们经常需要获取访问者的 IP 地址及其地理位置信息(如国家、地区、城市),以便实现语言自动切换、汇率显示、访问统计或区域内容分发等功能。
而恰好我们的 EdgeOne Pages 自带的“边缘函数(Functions)”能力,里面给我们提供了获取客户端地理位置信息的相关参数,我们只需要简单的代码,就可以利用其制作一个属于自己的、完全免费且全球加速的地理位置接口。
于是,这个小工具诞生了:EdgeOne-Pages-Functions-Geo
Waiting for api.github.com...
- 在线演示:api-geo.tianhw.top(EO海外版)
特性
- 函数直接运行在腾讯云全球边缘节点。
- 不仅提供 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 地址、地理位置及网络信息。
参数说明
| 字段名 | 类型 | 含义说明 |
|---|---|---|
ip | String | 访客的公网 IP 地址 |
asn | Number | 自治系统编号 (Autonomous System Number) |
countryName | String | 国家名称(英文) |
countryCodeAlpha2 | String | ISO 标准两位国家代码(如 CN) |
countryCodeAlpha3 | String | ISO 标准三位国家代码(如 CHN) |
countryCodeNumeric | String | ISO 标准数字国家代码 |
regionName | String | 省份/自治区名称 |
regionCode | String | 省份代码(如 CN-SD) |
cityName | String | 城市名称 |
latitude | Number | 地理位置纬度 |
longitude | Number | 地理位置经纬度 |
cisp | String | 运营商 (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/