xbnz / laravel-multi-ip
Requires
- ext-intl: *
- caseyamcl/guzzle_retry_middleware: ^2.7
- guzzlehttp/guzzle: ^7.4
- illuminate/cache: ^9.0
- illuminate/collections: ^9.0
- illuminate/config: ^9.0
- illuminate/http: ^9.0
- illuminate/support: ^9.0
- kevinrob/guzzle-cache-middleware: ^4.0
Requires (Dev)
- infection/infection: ^0.26.6
- nunomaduro/larastan: ^2.1
- orchestra/testbench: ^7.4
- phpmd/phpmd: ^2.12
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-mockery: ^1.0
- phpstan/phpstan-phpunit: ^1.1
- phpstan/phpstan-webmozart-assert: ^1.1
- phpunit/phpunit: ^9.5
- spatie/invade: ^1.0
- symplify/easy-coding-standard: ^10.2
This package is auto-updated.
Last update: 2022-08-04 22:44:01 UTC
README
Laravel Multi API
支持的API
提供商 | 需要密钥 | 标准化对象 |
---|---|---|
Abstractapi.com | ✅ | NormalizedGeolocationResultsData::class |
Abuseipdb.com | ✅ | NormalizedGeolocationResultsData::class |
Ipapi.co | ❌ | NormalizedGeolocationResultsData::class |
Ipapi.com | ✅ | NormalizedGeolocationResultsData::class |
Ip-api.com | ❌ | NormalizedGeolocationResultsData::class |
Ipdata.co | ✅ | NormalizedGeolocationResultsData::class |
Ipgeolocation.io | ✅ | NormalizedGeolocationResultsData::class |
Ipinfo.io | ✅ | NormalizedGeolocationResultsData::class |
Mtr.sh: ping | ❌ | MtrDotShPingResultsData::class |
Mtr.sh: mtr | ❌ | MtrDotShMtrResultsData::class |
安装
composer require xbnz/laravel-multi-api
确保您的composer.json文件指示Laravel自动绑定包服务提供者到您的项目
"extra": { "laravel": { "dont-discover": [] } },
配置文件
- 发布配置文件
php artisan vendor:publish --tag=ip-resolver php artisan vendor:publish --tag=resolver
// resolver.php 'use_proxy' => (bool), 'proxies' => (array<string>), // https://13.44.34.34:8080, https://user:pass@33.22.55.66:8080 'timeout' => (int), // seconds 'cache_period' => (int) //seconds, 'async_concurrent_requests' => (int), 'use_retries' => (bool), 'tries' => (int), 'retry_sleep' => (float), // seconds 'retry_sleep_multiplier' => (float) // seconds,
// ip-resolver.php 'api-keys' => (array<Driver>), /** * IpGeolocationDotIoDriver::class => [env(KEY_1), env(KEY_2), ...], */ /** * Visit https://mtr.sh/probes.json to retrieve the list of probe IDs */ \XbNz\Resolver\Domain\Ip\Drivers\MtrDotShMtrDriver::class => [ 'search' => (array<string>) ], \XbNz\Resolver\Domain\Ip\Drivers\MtrDotShPingDriver::class => [ 'search' => (array<string>) ],
支持多个API密钥
您可以在配置文件中为每个驱动程序配置多个API密钥。API密钥将在每个HTTP请求中随机选择。如果您已选择使用重试功能,则密钥将在每次尝试时重新激活。
缓存
默认情况下强制执行缓存,因为替代方案会迅速耗尽您的配额限制。如果您正在使用时间敏感的服务,请使用Laravel的Config外观来在API调用之前减少缓存。
Config::set(['resolver.cache_period' => 1]);
代理
支持HTTP、HTTPS、SOCKS。请使用上述标记的URL结构。如果您已选择使用重试功能,则代理将在每次尝试时重新激活。
API停机可能会破坏您的应用程序。请提前计划。
地理位置
您可以从每个IP API期望得到的最低标准化响应。请注意,可能会有null值,有关结构,请参阅NormalizedGeolocationResultsData::class。
- 查询的IP地址
- 国家
- 城市
- 纬度
- 经度
- 组织/ISP
组合所有API
您可以使用所有API来获取IP的完整信息,从而生成一份全面的报告。如果您有大量IP和驱动程序,可以在config文件中的resolver.php配置文件中增加异步值以加快处理速度。
public function example(Resolver $resolver) { $result = $resolver ->ip() ->withIps(['8.8.8.8', '2606:4700:4700::1111']) ->ipGeolocationDotIo() ->ipApiDotCom() ->ipInfoDotIo() ->normalize(); // ... }
原始API输出
如果您不希望接收压缩的标准化信息,可以使用原始方法
public function example(Resolver $resolver) { $result = $resolver ->ip() ->withIps(['8.8.8.8', '2606:4700:4700::1111']) ->ipGeolocationDotIo() ->ipApiDotCom() ->ipInfoDotIo() ->raw(); // ... }
ℹ️ 这与 normalize() 的工作方式相同。请注意,使用此选项无法保证数据完整性,大多数情况下结果直接从 API 返回。 |
---|
链式调用的替代方案
public function example(Resolver $resolver) { $result = $resolver ->ip() ->withIps(['8.8.8.8', '2606:4700:4700::1111']) ->withDrivers([ IpGeolocationDotIoDriver::class, // other drivers... ]) ->normalize(); // ... }
使用 MTR.sh API 进行停机时间监控
MTR.sh 是一个 Looking Glass API,让您可以访问全球数百个网络。这对于停机时间监控特别有用。MTR.sh API 的问题在于结果对编程语言不友好。但对于 Laravel 开发者来说,这种情况已经不再存在。
MTR.sh 搜索词示例
选择您想要使用的 MTR.sh 网络
搜索类型 | 搜索词 |
---|---|
国家 | ['德国', '巴西', '加拿大'] |
城市 | ['法兰克福', '里约', '多伦多'] |
洲 | ['欧洲', '南美洲', '北美洲'] |
UN/LOCODE | ['defra', 'brrio', 'cator'] |
ISP | ['G-Core Labs', 'Anexia', 'Google'] |
要获取完整列表,请访问 https://mtr.sh/probes.json
public function example(Resolver $resolver) { $result = $resolver ->ip() ->withIps(['1.1.1.1']) ->mtrDotShMtr() ->mtrDotShPing() ->normalize(); // ... }
ℹ️ 一些 MTR.sh 探针可能不支持 IPv6,或者可能没有某些功能,例如执行 MTR 测试的能力。当您指定搜索词时,如果没有探针与 IP 或测试类型功能匹配,将抛出 MtrProbeNotFoundException::class |
---|
关于设计的简短说明
如果您想扩展包以支持其他 API,请记住以下事项
-
每个端点一个驱动程序 -- GET: https://someapi.io/geo/1.1.1.1: SomeApiGeoDriver::class -- POST: https://someapi.io/geo/bulk: SomeApiGeoBulkDriver::class
-
AuthStrategies
和RetryStrategies
负责应用 API 密钥头、路径和查询参数,而不是驱动程序。 -
Normalize()
功能仅当存在一个Mapper::class
支持Driver::class
的目标时才起作用。 -
映射器、驱动程序和策略都在
ResolverServiceProvider::class
和IpServiceProvider::class
中注册。 -
新的 API 类别,如货币转换 API 驱动程序,将遵循相同的模式:在理论上的
CurrencyServiceProvider::class
中注册。
贡献
欢迎提交拉取请求和问题。