IPGeolocation/node-red-contrib-ipgeolocation

GitHub: IPGeolocation/node-red-contrib-ipgeolocation

为 Node-RED 提供 IPGeolocation.io API 的全套集成节点,涵盖 IP 地理定位、威胁情报、ASN 查询、时区、天文学及 User-Agent 解析。

Stars: 1 | Forks: 0

# node-red-contrib-ipgeolocation 用于 [IPGeolocation.io](https://ipgeolocation.io) v3 API 的 Node-RED 节点:IP 地理定位、安全和威胁情报、VPN 和代理检测、滥用联系人、ASN 查询、批量 IP 处理、时区和天文学,以及 user-agent 解析。 [![npm version](https://img.shields.io/npm/v/node-red-contrib-ipgeolocation.svg)](https://www.npmjs.com/package/node-red-contrib-ipgeolocation) [![npm downloads](https://img.shields.io/npm/dm/node-red-contrib-ipgeolocation.svg)](https://www.npmjs.com/package/node-red-contrib-ipgeolocation) [![Node-RED](https://img.shields.io/badge/Node--RED-%3E%3D2.0-8F0000.svg)](https://nodered.org) [![Node.js](https://img.shields.io/badge/node-%3E%3D14-43853d.svg)](https://nodejs.org) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) 一套完整且可用于生产环境的 **Node-RED IP 地理定位节点**。在低代码 Node-RED 流程中查询任何 IP 地址或域名的国家、城市、纬度和经度,对 IP 的代理、VPN、TOR 和机器人风险进行评分,解析 ASN 和滥用联系人数据,解析 user-agent 字符串,以及获取时区和天文学数据。 ## 目录 - [功能](#features) - [快速开始](#quick-start) - [环境要求](#requirements) - [安装](#installation) - [配置:API key](#configuration-api-key) - [节点工作原理](#how-the-nodes-work) - [节点参考](#node-reference) - [消息属性](#message-properties) - [错误处理和重试](#error-handling-and-retries) - [示例流程](#example-flows) - [实践方案](#recipes) - [API 额度](#api-credits) - [开发和测试](#development-and-testing) - [常见问题](#faq) - [许可证](#license) - [链接](#links) ## 功能 - **单一 IP 地理定位:**解析任何 IPv4、IPv6 或域名的国家、地区、城市、纬度、经度、货币和时区。 - **批量 IP 地理定位:**在一个请求中处理多达 50,000 个 IP 地址。 - **IP 安全和威胁情报:**检测代理、VPN、TOR、机器人和威胁评分,用于欺诈预防和访问控制。 - **批量安全查询:**在单次调用中对大型 IP 列表进行评分。 - **滥用联系人查询:**检索 IP 的滥用电子邮件、电话和所属组织。 - **ASN 查询:**通过 IP 或 AS 编号解析自治系统(Autonomous System)详细信息。 - **时区 API:**通过名称、IP、坐标、城市、IATA 代码、ICAO 代码或 UN/LOCODE 获取时区数据。 - **天文学 API:**通过坐标、地址或 IP 获取日出、日落、月出、月落、晨昏蒙影阶段、月相以及日月位置。 - **User-agent 解析器:**从 user-agent 字符串中识别浏览器、设备、操作系统和引擎。 - **开发者友好:**支持动态输入 `msg`、`flow` 和 `global`,可选的专用错误输出,带指数退避的自动重试,安全的凭证存储以及按请求的额度报告。 ## 快速开始 ``` # 在你的 Node-RED 用户目录中(通常是 ~/.node-red) npm install node-red-contrib-ipgeolocation ``` 1. 重启 Node-RED。 2. 将 **ipgeo lookup** 节点拖到画布上(在 **IPGeolocation** 面板类别下找到它)。 3. 打开节点,点击 **API Config** 旁边的铅笔图标,并粘贴你的[免费 IPGeolocation.io API key](https://app.ipgeolocation.io/signup)。 4. 连入一个 **inject** 节点,连出一个 **debug** 节点,然后部署。 5. 将任意 IP 字符串注入到 `msg.payload` 中,例如 `8.8.8.8`,然后从 debug 面板读取地理定位结果。 这就是完整的循环:注入一个 IP,获取返回的结构化位置数据。 ## 环境要求 | 要求 | 版本 | |-------------|---------| | Node-RED | >= 2.0 | | Node.js | >= 14.0 | | IPGeolocation.io API key | 免费层即可使用([注册](https://app.ipgeolocation.io/signup)) | ## 安装 ### 调色板管理器(推荐) 1. 打开 Node-RED。 2. 转到 **菜单 > 管理调色板 > 安装**。 3. 搜索 `node-red-contrib-ipgeolocation`。 4. 点击 **安装**。 ### npm ``` cd ~/.node-red npm install node-red-contrib-ipgeolocation ``` 重启 Node-RED。所有十个节点都将出现在面板的 **IPGeolocation** 类别下。 ## 配置:API key 每个功能节点都引用一个共享的 **ipgeo config** 节点,该节点保存着你的 API key。该 key 作为加密的 Node-RED 凭证存储,绝不会写入导出的流程 JSON 中。 1. 将任何 IPGeolocation 节点拖到画布上。 2. 双击它,然后点击 **API Config** 旁边的铅笔图标。 3. 输入 **Name** 并粘贴你的 **API Key**。 4. 点击 **Add**,然后点击 **Done**。 在每个 IPGeolocation 节点中重复使用同一个配置节点,这样你就可以在一个地方管理一个 key。 ## 节点工作原理 这些约定适用于所有九个功能节点。 **动态输入。**任何 IP、坐标或值都可以是静态字符串,或者在运行时从 `msg`、`flow` 或 `global` 属性中读取。一个配置好的节点可以服务于许多不同的输入。 **默认双输出。**每个节点都带有两个输出: - 输出 1(成功):API 结果,写入配置的属性(默认为 `msg.payload`)。 - 输出 2(错误):带有结构化 `msg.error` 的原始 `msg`。 取消勾选 **Use second output** 可折叠为单个输出,并使用标准的 **Catch** 节点在整个流程范围内处理故障。 **响应整形。**大多数节点公开了 **Fields**(仅返回列出的点记法路径)和 **Excludes**(丢弃列出的路径),以便你可以裁剪大型响应,例如 `location.city,location.country_name` 或 `security.threat_score`。 **额度报告。**每次成功的响应都会将 `msg.ipgeo_credits` 设置为请求消耗的 API 额度数量。 ## 节点参考 | 节点 | Endpoint | 用途 | |------|----------|---------| | `ipgeo-config` | n/a | 共享 API key 凭证 | | `ipgeo-lookup` | `GET /v3/ipgeo` | 单个 IP 或域名地理定位 | | `ipgeo-bulk` | `POST /v3/ipgeo-bulk` | 批量地理定位,最多 50,000 个 IP | | `ipgeo-security` | `GET /v3/security` | 单个 IP 的安全和威胁数据 | | `ipgeo-bulk-security` | `POST /v3/security-bulk` | 批量安全查询,最多 50,000 个 IP | | `ipgeo-abuse` | `GET /v3/abuse` | 滥用联系人详细信息 | | `ipgeo-asn` | `GET /v3/asn` | 通过 IP 或 AS 编号查询 ASN 详细信息 | | `ipgeo-timezone` | `GET /v3/timezone` | 通过名称、IP、坐标、城市、IATA、ICAO、UN/LOCODE 查询时区 | | `ipgeo-astronomy` | `GET /v3/astronomy` | 日月数据 | | `ipgeo-useragent` | `GET /v3/user-agent` | User-agent 解析 | ### ipgeo-lookup:单个 IP 地理定位 解析单个 IPv4、IPv6 或域名。将 IP 留空可查询调用者自身的 IP。 | 选项 | 描述 | 默认值 | |--------|-------------|---------| | IP / Domain | 静态值或 `msg` / `flow` / `global` 属性 | 空(调用者 IP) | | Include | 要添加的可选数据模块 | 无 | | Fields / Excludes | 限制或裁剪响应 | 全部 | | Language | 响应语言 | `en` | | User-Agent header | 将 UA 字符串作为请求头转发 | 关闭 | | Output to | 目标属性 | `msg.payload` | 包含模块: | 模块 | 额外额度 | 添加内容 | |--------|:---:|------| | `security` | +2 | 代理、VPN、TOR、机器人、威胁评分 | | `abuse` | +1 | 滥用联系人(电子邮件、电话、组织) | | `user_agent` | 0 | 解析后的 user-agent | | `geo_accuracy` | 0 | 准确度半径和置信度 | | `dma_code` | 0 | 美国指定市场区域代码 | | `hostname` | 0 | 来自本地数据库的 PTR | | `liveHostname` | 0 | 实时 DNS PTR 查询 | | `hostnameFallbackLive` | 0 | 先查数据库,再查实时 DNS | 在上游设置 `msg.ipgeo_include` 可按消息覆盖包含列表。 ### ipgeo-bulk:批量 IP 地理定位 在一个 POST 中发送多达 50,000 个 IP 或域名。 - **输入:**`msg.payload` 作为字符串数组(`["1.2.3.4", "example.com"]`)或逗号分隔的字符串,将被自动拆分。 - **输出:**按输入顺序排列的结果对象数组。无效或私有条目将返回为 `{ "message": "..." }`。 ``` // Keep only successfully resolved results const resolved = msg.payload.filter(r => r.ip); ``` ### ipgeo-security:IP 安全和威胁情报 单个 IP 风险查询:代理、VPN、TOR 和机器人检测,以及威胁评分,适用于欺诈检查、登录保护和访问控制。支持 **Fields** 和 **Excludes**。 ### ipgeo-bulk-security:批量 IP 安全 安全查询的批量版本,最多 50,000 个 IP。输入处理与 `ipgeo-bulk` 匹配。当某些条目无法评分时,节点会对其进行汇总: | 属性 | 设置时机 | 含义 | |----------|----------|---------| | `msg.ipgeo_invalid_count` | 条目没有 `security` 对象 | 无效条目的计数 | | `msg.ipgeo_invalid_messages` | 同上 | 无效条目的消息 | 当每个条目都有效时,这两者都会从 `msg` 中删除。 ### ipgeo-abuse:滥用联系人查询 返回 IP 的滥用联系人记录,例如 `abuse.emails`、`abuse.phone_numbers` 和所属组织。支持 **Fields** 和 **Excludes**。 ### ipgeo-asn:ASN 查询 查询自治系统详细信息。**Query type** 选择发送的内容: | 查询类型 | 发送内容 | 说明 | |------------|-------|-------| | `auto` | ip 和 asn 都不发送 | API 根据上下文推断 | | `ip` | `ip=` | 解析 IP 背后的 ASN | | `asn` | `asn=` | `AS` 前缀会自动去除(`AS15169` 变为 `15169`) | 支持 **Include** 列表(`peers`、`downstreams`、`upstreams` 等),可通过 `msg.ipgeo_include` 按消息覆盖,还支持 **Fields** 和 **Excludes**。 ### ipgeo-timezone:时区 API 七种查询模式: | 模式 | 发送的参数 | 示例 | |------|----------------|---------| | 时区名称 | `tz` | `America/New_York` | | IP 地址 | `ip` | `8.8.8.8` | | 地址 / 城市 | `location` | `Paris, France` | | 坐标 | `lat` + `long` | `48.8566`, `2.3522` | | IATA 机场 | `iata_code` | `CDG` | | ICAO 机场 | `icao_code` | `LFPG` | | UN/LOCODE | `lo_code` | `FRPAR` | 当所选模式所需的值缺失时,返回 `INVALID_INPUT`。 ### ipgeo-astronomy:日月数据 返回日出、日落、月出、月落、晨昏蒙影阶段(民用、航海、天文,以及蓝调和黄金时刻)、正午、日照长度、月相、亮度以及实时日月位置。 可以通过四种方式获取位置,通过 **Look up by** 模式进行选择: | 模式 | 发送内容 | 说明 | |------|-------|-------| | `coords` | `lat` + `long` | 十进制度数;两者均为必填 | | `location` | `location` | 地址,最好是城市,例如 `New York, USA` | | `ip` | `ip` | 任何 IPv4 或 IPv6 地址;在响应中增加一个 `ip` 字段| `auto` | 无 | API 使用调用者的 IP | 当提供多个参数时,API 的首选顺序是坐标,其次是位置,然后是 IP。坐标和位置模式在其值缺失时会返回 `INVALID_INPUT`。 可选参数(适用于所有模式): | 选项 | 参数 | 描述 | |--------|-----------|-------------| | Date | `date` | `YYYY-MM-DD`;默认为该地点的今天 | | Time zone | `time_zone` | IANA 名称;将所有事件时间转换为此时区 | | Elevation | `elevation` | 海拔高度(米),0 到 10000;默认为 0 | | Language | `lang` | `location` 对象的语言(付费计划) | 响应将结果嵌套在 `astronomy` 对象下,与 `location` 对象并排,因此请读取诸如 `payload.astronomy.sunrise` 和 `payload.location.city` 之类的值。 ### ipgeo-useragent:user-agent 解析器 将 user-agent 字符串解析为浏览器、设备、操作系统和引擎。UA 作为请求头而不是查询参数发送到 API。 在 HTTP-in 流程中非常理想:将 UA 源指向 `msg.req.headers.user-agent`(默认值),以自动解析每个访问者的浏览器。空的 UA 将返回 `INVALID_INPUT`。 ## 消息属性 | 属性 | 方向 | 类型 | 描述 | |----------|-----------|------|-------------| | `ipgeo_credits` | 输出 | number | 请求消耗的额度 | | `ipgeo_include` | 输入 | string | 在受支持的情况下,按消息覆盖包含列表 | | `ipgeo_invalid_count` | 输出 | number | 批量安全:没有安全结果的条目数 | | `ipgeo_invalid_messages` | 输出 | array | 批量安全:无效条目的消息 | | `error` | 输出 | object | 在错误输出上:`{ code, message, status, body }` | ## 错误处理和重试 失败时,节点会设置 `msg.error`,包含类型化的 `code`、可读的 `message`、适用情况下的 HTTP `status` 以及原始响应 `body`。 | 代码 | 原因 | |------|-------| | `NO_API_KEY` | 缺少配置节点或 key 为空 | | `BAD_REQUEST` | 参数无效(HTTP 400) | | `AUTH_FAILED` | API key 无效或缺失(HTTP 401) | | `FORBIDDEN` | 计划限制或来源未加入白名单(HTTP 403) | | `NOT_FOUND` | 未找到 Endpoint 或资源(HTTP 404) | | `VALIDATION` | 验证错误(HTTP 422) | | `LOCKED` | Key 被锁定、超出配额或账户被暂停(HTTP 423) | | `RATE_LIMITED` | 请求过多(HTTP 429) | | `SERVER_ERROR` | API 内部错误(HTTP 500) | | `HTTP_ERROR` | 任何其他非 2xx 状态 | | `TIMEOUT` | 请求超时 | | `NETWORK_ERROR` | DNS 或连接失败 | | `NO_RESPONSE` | 请求已发送但未收到响应 | | `INVALID_INPUT` / `INVALID_MODE` | 节点输入缺失或格式错误 | | `TOO_MANY_IPS` | 批量请求超过 50,000 个 IP 的限制 | **自动重试。** 瞬时故障(HTTP 429、500、502、503、504、超时和网络错误)最多重试 3 次,采用指数退避机制(500 毫秒、1 秒、2 秒)。对于 HTTP 429,如果存在 `Retry-After` 标头,则会予以遵循。默认请求超时为 10 秒,批量 Endpoint 为 30 秒。 ## 示例流程 该包捆绑了随时可导入的示例,每个功能节点一个: | 示例 | 演示 | |---------|--------------| | 01 - Single IP Lookup | `ipgeo-lookup` | | 02 - Bulk IP Lookup | `ipgeo-bulk` | | 03 - IP Security Lookup | `ipgeo-security` | | 04 - Bulk IP Security | `ipgeo-bulk-security` | | 05 - Abuse Contact Lookup | `ipgeo-abuse` | | 06 - ASN Lookup | `ipgeo-asn` | | 07 - Timezone Lookup | `ipgeo-timezone` | | 08 - Astronomy (Sun & Moon) | `ipgeo-astronomy` | | 09 - User-Agent Parser | `ipgeo-useragent` | 导入方法:**菜单 > 导入 > 示例**,然后选择 **node-red-contrib-ipgeolocation** 并挑选一个流程。每个示例都包含一个 inject 触发器、连接到结果和错误 debug 节点的节点,以及一个占位符配置节点。在部署之前,请将该配置节点指向你自己的 API key。 ## 实践方案 ### 按消息覆盖包含列表 ``` // In a Function node upstream of ipgeo-lookup or ipgeo-asn msg.ipgeo_include = "security,abuse"; return msg; ``` ### 在 HTTP 流程中对访问者进行地理定位 配置 `ipgeo-lookup`,将 **IP / Domain** 设置为指向 `req.headers['x-forwarded-for']`(在代理后面)或 `req.connection.remoteAddress`(直连)的 `msg` 属性。 ### 在边缘阻挡代理和 VPN 通过 `ipgeo-security` 处理传入的 IP,然后在 `payload.security.is_proxy` 或威胁评分上使用 **Switch** 节点,以便在流量到达你的应用程序之前丢弃或标记有风险的流量。 ### 返回精简的批量响应 在 `ipgeo-bulk` 上,将 **Fields** 设置为 `location.city,location.country_name,asn.organization`,可选择添加 **Include** `security`,并使用 **Excludes** `security.threat_score` 以仅返回每个 IP 所需的数据。 ## API 额度 | Endpoint 或模块 | 额度 | |--------------------|:---:| | 单个 IP 查询(基础) | 1 | | + security 模块 | +2 | | + abuse 模块 | +1 | | 批量查询 | 每个有效 IP 1-4 | | Security / bulk-security | 每个有效 IP 2 | | ASN、Abuse、Timezone、User-Agent、Astronomy | 1 | 每个节点都会在 `msg.ipgeo_credits` 中报告实际费用。有关当前定价,请参阅[额度使用指南](https://ipgeolocation.io/documentation/credits-usage.html)。 ## 开发和测试 ``` npm install # install dependencies npm test # run the mocha test suite npm run coverage # run tests with an HTML and text coverage report ``` 测试使用 `mocha`、`node-red-node-test-helper`、`should` 和 `nock`,所有 HTTP 均被完全模拟,因此测试套件可以离线运行,无需实时的 API 调用。规范位于 `test/**/*_spec.js` 中,涵盖共享的 API client、辅助程序、每个节点以及捆绑的示例流程。 ## 常见问题
如何获取 IPGeolocation.io API key?app.ipgeolocation.io/signup 注册一个免费账户。免费层提供足够的使用量来评估此包中包含的每个节点。
导出的流程中 API key 安全吗? 是的。API key 作为加密的 Node-RED 凭证存储在 ipgeo-config 节点上,绝不会包含在导出的流程 JSON 中。
我可以一次查询多个 IP 地址吗? 是的。使用 ipgeo-bulk 节点进行地理定位查询,或使用 ipgeo-bulk-security 节点进行安全和威胁分析。两者都支持在单个请求中处理多达 50,000 个 IP 地址。
如何检测 VPN、代理或 TOR 出口节点? 使用 ipgeo-security 节点,或者在使用 ipgeo-lookup 时启用 security 包含模块。响应包含指示代理使用情况、VPN 检测、TOR 出口节点状态和其他相关威胁信息的字段。
它在反向代理后面工作吗? 是的。从 req.headers['x-forwarded-for'] 读取客户端 IP 地址,并将其作为动态 msg 输入传递给 ipgeo-lookup,以对原始客户端进行地理定位。
当达到速率限制时会发生什么? 节点会使用指数退避自动重试请求,并在提供时遵循 Retry-After 响应头。如果速率限制仍然存在,则操作将失败,并在错误输出上出现 RATE_LIMITED 错误。
## 许可证 [MIT](https://github.com/IPGeolocation/node-red-contrib-ipgeolocation/blob/main/LICENSE) (c) IPGeolocation.io ## 链接 - [IPGeolocation.io 官网](https://ipgeolocation.io) - [API 文档](https://ipgeolocation.io/documentation.html) - [获取免费 API key](https://app.ipgeolocation.io/signup) - [Node-RED](https://nodered.org) - [npm 包](https://www.npmjs.com/package/node-red-contrib-ipgeolocation) - [问题追踪器](https://github.com/IPGeolocation/node-red-contrib-ipgeolocation/issues)
标签:API集成, IP地理定位, MITM代理, Node-RED, 低代码, 可观测性, 威胁情报, 开发者工具, 数据可视化, 暗色界面, 自定义脚本