fingerprintjs/fingerprint-pro-server-api-java-sdk

GitHub: fingerprintjs/fingerprint-pro-server-api-java-sdk

Fingerprint Pro Server API 的官方 Java SDK,帮助 Java 应用在服务端获取和管理设备智能与访客识别数据。

Stars: 17 | Forks: 8

Fingerprint logo

Jitpack Release CI badge CI badge CI badge Discord server

# Fingerprint Server API Java SDK [Fingerprint](https://fingerprint.com/) 是一个提供行业领先准确性的设备智能平台。Fingerprint Server Java SDK 是一种从您的 Java 应用程序与 Fingerprint [Server API](https://dev.fingerprint.com/reference/pro-server-api) 进行交互的简便方法。您可以搜索、更新和删除识别事件。 *由 [OpenAPI Generator](https://openapi-generator.tech) 自动生成* ## 要求 支持以下 Gradle/Maven 版本 - Maven (3.8.3+) - Gradle (7.2+) 支持以下 Java 版本 - Java 11 - Java 17 - Java 21 ## 安装说明 ### Maven 用户 将此依赖项添加到您项目的 POM 中: ``` jitpack.io https://jitpack.io ``` ``` com.github.fingerprintjs fingerprint-pro-server-api-java-sdk v7.12.0 ``` ### Gradle 用户 将此依赖项添加到您项目的构建文件(`build.gradle` 或 `build.gradle.kts`)中: ``` // build.gradle repositories { maven { url 'https://jitpack.io' } } dependencies { implementation "com.github.fingerprintjs:fingerprint-pro-server-api-java-sdk:v7.12.0" } ``` ``` // build.gradle.kts repositories { maven { url = uri("https://jitpack.io") } } dependencies { implementation("com.github.fingerprintjs:fingerprint-pro-server-api-java-sdk:v7.12.0") } ``` ### 其他 首先通过执行以下命令生成 JAR: ``` ./gradlew jar ``` 然后手动安装以下 JAR 包: - `target/fingerprint-pro-server-api-sdk-7.12.0.jar` ## 入门指南 请按照[安装说明](#installation)并执行以下 Java 代码: ``` package main; import com.fingerprint.api.FingerprintApi; import com.fingerprint.model.EventsGetResponse; import com.fingerprint.model.EventsUpdateRequest; import com.fingerprint.model.VisitorsGetResponse; import com.fingerprint.sdk.ApiClient; import com.fingerprint.sdk.ApiException; import com.fingerprint.sdk.Configuration; import com.fingerprint.sdk.Region; public class FingerprintApiExample { // Fingerprint Secret API Key private static final String FPJS_API_SECRET = "Fingerprint Secret API Key"; // A mandatory visitorId of a specific visitor private static final String FPJS_VISITOR_ID = "visitorId"; // An optional requestId made by a specific visitor private static final String FPJS_REQUEST_ID = "requestId"; // An optional linkedId of the visit private static final String FPJS_LINKED_ID = "linkedId"; // An optional parameter limiting scanned results private static final Integer LIMIT = 10; // An optional parameter used to paginate results, see lastTimestamp private static final String PAGINATION_KEY = "1683900801733.Ogvu1j"; public static void main(String... args) { // Create a new api client instance from Configuration with your Fingerprint Server API Key and your Fingerprint Server API Region. /* You can specify a region on getDefaultApiClient function's second parameter If you leave the second parameter empty, then Region.GLOBAL will be used as a default region Options for regions are: Region.GLOBAL Region.EUROPE Region.ASIA */ ApiClient client = Configuration.getDefaultApiClient(FPJS_API_SECRET, Region.EUROPE); FingerprintApi api = new FingerprintApi(client); // Get an event with a given requestId try { // Fetch the event with a given requestId EventsGetResponse response = api.getEvent(FPJS_REQUEST_ID); System.out.println(response.getProducts().toString()); } catch (ApiException e) { System.err.println("Exception when calling FingerprintApi.getEvent:" + e.getMessage()); } // Search events with custom filters try { // By visitorId SearchEventsResponse response = api.searchEvents(LIMIT, new FingerprintApi.SearchEventsOptionalParams().setVisitorId(FPJS_VISITOR_ID)); // Next page // SearchEventsResponse response = api.searchEvents(LIMIT, new FingerprintApi.SearchEventsOptionalParams().setPaginationKey(response.getPaginationKey()).setVisitorId(FPJS_VISITOR_ID)); // Bad bot // SearchEventsResponse response = api.searchEvents(LIMIT, new FingerprintApi.SearchEventsOptionalParams().setBot("bad")); // Filtered by IP // SearchEventsResponse response = api.searchEvents(LIMIT, new FingerprintApi.SearchEventsOptionalParams().setIpAddress("192.168.0.1/32")); System.out.println(response.getEvents().toString()); } catch (ApiException e) { System.err.println("Exception when calling FingerprintApi.searchEvents:" + e.getMessage()); } // Update an event with a given requestId try { EventsUpdateRequest request = new EventsUpdateRequest(); request.setLinkedId("myNewLinkedId"); api.updateEvent(FPJS_REQUEST_ID, request); } catch (ApiException e) { System.err.println("Exception when calling FingerprintApi.updateEvent:" + e.getMessage()); } // Get a specific visitor's all visits try { // Fetch all visits with a given visitorId, with a page limit VisitorsGetResponse response = api.getVisits(FPJS_VISITOR_ID, null, null, LIMIT, null, null); System.out.println(response.getVisits().toString()); } catch (ApiException e) { System.err.println("Exception when calling FingerprintApi.getVisits:" + e.getMessage()); } // Get a specific visitor's all visits with a linkedId try { // Fetch all visits with a given visitorId, with a page limit, skipping the first visit VisitorsGetResponse response = api.getVisits(FPJS_VISITOR_ID, null, FPJS_LINKED_ID, LIMIT, PAGINATION_KEY, null); System.out.println(response.getVisits().toString()); } catch (ApiException e) { System.err.println("Exception when calling FingerprintApi.getVisits:" + e.getMessage()); } // Use all the parameters on getVisits try { // Fetch the visitor's all visits with a given requestId and linkedId with a page limit while skipping the first visit VisitorsGetResponse response = api.getVisits(FPJS_VISITOR_ID, FPJS_REQUEST_ID, FPJS_LINKED_ID, LIMIT, PAGINATION_KEY, null); System.out.println(response.getVisits().toString()); } catch (ApiException e) { System.err.println("Exception when calling FingerprintApi.getVisits:" + e.getMessage()); } // Delete visitor data with a given visitorID try { api.deleteVisitorData(FPJS_VISITOR_ID); } catch (ApiException e) { System.err.println("Exception when calling FingerprintApi.deleteVisitorData:" + e.getMessage()); } } } ``` ## 密封结果 此 SDK 提供了用于解码[密封结果](https://dev.fingerprint.com/docs/sealed-client-results)的实用方法。 ``` package com.fingerprint.example; import com.fingerprint.Sealed; import com.fingerprint.model.EventsGetResponse; import java.util.Base64; public class SealedResults { public static void main(String... args) throws Exception { // Sealed result from the frontend. String SEALED_RESULT = System.getenv("BASE64_SEALED_RESULT"); // Base64 encoded key generated in the dashboard. String SEALED_KEY = System.getenv("BASE64_KEY"); final EventsGetResponse event = Sealed.unsealEventResponse( Base64.getDecoder().decode(SEALED_RESULT), // You can provide more than one key to support key rotation. The SDK will try to decrypt the result with each key. new Sealed.DecryptionKey[]{ new Sealed.DecryptionKey( Base64.getDecoder().decode(SEALED_KEY), Sealed.DecryptionAlgorithm.AES_256_GCM ) } ); // Do something with unsealed response, e.g: send it back to the frontend. } } ``` 了解更多信息,请参阅[密封结果示例](/examples/src/main/java/com/fingerprint/example/SealedResults.java)。 ## Webhook 签名验证 此 SDK 提供了用于验证传入 webhook 请求的 HMAC 签名的实用方法。 以下是使用 Spring Boot 的示例实现: ``` import com.fingerprint.sdk.WebhookValidation; @RestController class WebhookController { @PostMapping("/api/webhook") public ResponseEntity webhookHandler(@RequestBody byte[] webhook, @RequestHeader HttpHeaders headers) { final String secret = System.getenv("WEBHOOK_SIGNATURE_SECRET"); if (secret == null || secret.isEmpty()) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Secret key is not configured"); } final String signature = headers.getFirst("fpjs-event-signature"); if (signature == null || signature.isEmpty()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Missing fpjs-event-signature header"); } final boolean isValidSignature = WebhookValidation.isSignatureValid(signature, webhook, secret); if (!isValidSignature) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Webhook signature is not valid"); } return ResponseEntity.ok("Webhook received"); } } ``` ## API 端点文档 所有 URI 的基础路径为 *https://api.fpjs.io* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- *FingerprintApi* | [**deleteVisitorData**](docs/FingerprintApi.md#deleteVisitorData) | **DELETE** /visitors/{visitor_id} | 按 visitor ID 删除数据 *FingerprintApi* | [**getEvent**](docs/FingerprintApi.md#getEvent) | **GET** /events/{request_id} | 按 request ID 获取事件 *FingerprintApi* | [**getRelatedVisitors**](docs/FingerprintApi.md#getRelatedVisitors) | **GET** /related-visitors | 获取相关访客 *FingerprintApi* | [**getVisits**](docs/FingerprintApi.md#getVisits) | **GET** /visitors/{visitor_id} | 按 visitor ID 获取访问记录 *FingerprintApi* | [**searchEvents**](docs/FingerprintApi.md#searchEvents) | **GET** /events/search | 通过搜索获取事件 *FingerprintApi* | [**updateEvent**](docs/FingerprintApi.md#updateEvent) | **PUT** /events/{request_id} | 使用指定的 request ID 更新事件 *FingerprintApi* | [**webhookTrace**](docs/FingerprintApi.md#webhookTrace) | **TRACE** /webhook | 用于描述 webhook 格式的虚拟路径。 ## 模型文档 - [Botd](docs/Botd.md) - [BotdBot](docs/BotdBot.md) - [BotdBotResult](docs/BotdBotResult.md) - [BrowserDetails](docs/BrowserDetails.md) - [ClonedApp](docs/ClonedApp.md) - [DeprecatedGeolocation](docs/DeprecatedGeolocation.md) - [DeveloperTools](docs/DeveloperTools.md) - [Emulator](docs/Emulator.md) - [Error](docs/Error.md) - [ErrorCode](docs/ErrorCode.md) - [ErrorPlainResponse](docs/ErrorPlainResponse.md) - [ErrorResponse](docs/ErrorResponse.md) - [EventsGetResponse](docs/EventsGetResponse.md) - [EventsUpdateRequest](docs/EventsUpdateRequest.md) - [FactoryReset](docs/FactoryReset.md) - [Frida](docs/Frida.md) - [Geolocation](docs/Geolocation.md) - [GeolocationCity](docs/GeolocationCity.md) - [GeolocationContinent](docs/GeolocationContinent.md) - [GeolocationCountry](docs/GeolocationCountry.md) - [GeolocationSubdivision](docs/GeolocationSubdivision.md) - [HighActivity](docs/HighActivity.md) - [IPBlocklist](docs/IPBlocklist.md) - [IPBlocklistDetails](docs/IPBlocklistDetails.md) - [IPInfo](docs/IPInfo.md) - [IPInfoASN](docs/IPInfoASN.md) - [IPInfoDataCenter](docs/IPInfoDataCenter.md) - [IPInfoV4](docs/IPInfoV4.md) - [IPInfoV6](docs/IPInfoV6.md) - [Identification](docs/Identification.md) - [IdentificationConfidence](docs/IdentificationConfidence.md) - [IdentificationSeenAt](docs/IdentificationSeenAt.md) - [Incognito](docs/Incognito.md) - [Integration](docs/Integration.md) - [IntegrationSubintegration](docs/IntegrationSubintegration.md) - [Jailbroken](docs/Jailbroken.md) - [LocationSpoofing](docs/LocationSpoofing.md) - [MitMAttack](docs/MitMAttack.md) - [PrivacySettings](docs/PrivacySettings.md) - [ProductBotd](docs/ProductBotd.md) - [ProductClonedApp](docs/ProductClonedApp.md) - [ProductDeveloperTools](docs/ProductDeveloperTools.md) - [ProductEmulator](docs/ProductEmulator.md) - [ProductFactoryReset](docs/ProductFactoryReset.md) - [ProductFrida](docs/ProductFrida.md) - [ProductHighActivity](docs/ProductHighActivity.md) - [ProductIPBlocklist](docs/ProductIPBlocklist.md) - [ProductIPInfo](docs/ProductIPInfo.md) - [ProductIdentification](docs/ProductIdentification.md) - [ProductIncognito](docs/ProductIncognito.md) - [ProductJailbroken](docs/ProductJailbroken.md) - [ProductLocationSpoofing](docs/ProductLocationSpoofing.md) - [ProductMitMAttack](docs/ProductMitMAttack.md) - [ProductPrivacySettings](docs/ProductPrivacySettings.md) - [ProductProximity](docs/ProductProximity.md) - [ProductProxy](docs/ProductProxy.md) - [ProductRawDeviceAttributes](docs/ProductRawDeviceAttributes.md) - [ProductRemoteControl](docs/ProductRemoteControl.md) - [ProductRootApps](docs/ProductRootApps.md) - [ProductSuspectScore](docs/ProductSuspectScore.md) - [ProductTampering](docs/ProductTampering.md) - [ProductTor](docs/ProductTor.md) - [ProductVPN](docs/ProductVPN.md) - [ProductVelocity](docs/ProductVelocity.md) - [ProductVirtualMachine](docs/ProductVirtualMachine.md) - [Products](docs/Products.md) - [Proximity](docs/Proximity.md) - [Proxy](docs/Proxy.md) - [ProxyConfidence](docs/ProxyConfidence.md) - [ProxyDetails](docs/ProxyDetails.md) - [RawDeviceAttribute](docs/RawDeviceAttribute.md) - [RawDeviceAttributeError](docs/RawDeviceAttributeError.md) - [RelatedVisitor](docs/RelatedVisitor.md) - [RelatedVisitorsResponse](docs/RelatedVisitorsResponse.md) - [RemoteControl](docs/RemoteControl.md) - [RootApps](docs/RootApps.md) - [SDK](docs/SDK.md) - [SearchEventsResponse](docs/SearchEventsResponse.md) - [SearchEventsResponseEventsInner](docs/SearchEventsResponseEventsInner.md) - [SupplementaryID](docs/SupplementaryID.md) - [SuspectScore](docs/SuspectScore.md) - [Tampering](docs/Tampering.md) - [Tor](docs/Tor.md) - [VPN](docs/VPN.md) - [VPNConfidence](docs/VPNConfidence.md) - [VPNMethods](docs/VPNMethods.md) - [Velocity](docs/Velocity.md) - [VelocityData](docs/VelocityData.md) - [VelocityIntervals](docs/VelocityIntervals.md) - [VirtualMachine](docs/VirtualMachine.md) - [Visit](docs/Visit.md) - [VisitorsGetResponse](docs/VisitorsGetResponse.md) - [Webhook](docs/Webhook.md) - [WebhookClonedApp](docs/WebhookClonedApp.md) - [WebhookDeveloperTools](docs/WebhookDeveloperTools.md) - [WebhookEmulator](docs/WebhookEmulator.md) - [WebhookFactoryReset](docs/WebhookFactoryReset.md) - [WebhookFrida](docs/WebhookFrida.md) - [WebhookHighActivity](docs/WebhookHighActivity.md) - [WebhookIPBlocklist](docs/WebhookIPBlocklist.md) - [WebhookIPInfo](docs/WebhookIPInfo.md) - [WebhookJailbroken](docs/WebhookJailbroken.md) - [WebhookLocationSpoofing](docs/WebhookLocationSpoofing.md) - [WebhookMitMAttack](docs/WebhookMitMAttack.md) - [WebhookPrivacySettings](docs/WebhookPrivacySettings.md) - [WebhookProximity](docs/WebhookProximity.md) - [WebhookProxy](docs/WebhookProxy.md) - [WebhookRemoteControl](docs/WebhookRemoteControl.md) - [WebhookRootApps](docs/WebhookRootApps.md) - [WebhookSupplementaryIDs](docs/WebhookSupplementaryIDs.md) - [WebhookSuspectScore](docs/WebhookSuspectScore.md) - [WebhookTampering](docs/WebhookTampering.md) - [WebhookTor](docs/WebhookTor.md) - [WebhookVPN](docs/WebhookVPN.md) - [WebhookVelocity](docs/WebhookVelocity.md) - [WebhookVirtualMachine](docs/WebhookVirtualMachine.md) ## 鉴权文档 为 API 定义的认证方案: ### ApiKeyHeader - **类型**:API key - **API key 参数名称**:Auth-API-Key - **位置**:HTTP header ### ApiKeyQuery - **类型**:API key - **API key 参数名称**:api_key - **位置**:URL query string ## 密封结果文档 - [Sealed](docs/Sealed.md) - [DecryptionKey](docs/DecryptionKey.md) ## 建议 建议在多线程环境中为每个线程创建一个 `ApiClient` 实例,以避免任何潜在问题。 ## 支持 要报告问题、提问或提供反馈,请使用 [Issues](https://github.com/fingerprintjs/fingerprint-pro-server-api-java-sdk/issues)。 如果您需要私密支持,可以发送电子邮件至 [oss-support@fingerprint.com](mailto:oss-support@fingerprint.com)。 ## 许可证 本项目基于 [MIT 许可证](https://github.com/fingerprintjs/fingerprint-pro-server-api-java-sdk/blob/main/LICENSE) 授权。
标签:API集成, FingerprintJS, Fingerprint Pro, Java SDK, Java开发, JitPack, JS文件枚举, MIT开源, SDK封装, 反机器人, 反欺诈, 可观测性, 后台面板检测, 域名枚举, 服务端API, 浏览器指纹, 用户识别, 网络安全, 设备指纹, 设备智能, 访客识别, 隐私保护