Face++如何突破试用版本的授权限制

我们可以下载sdk进行免费测试,但是每天免费授权的次数是有限的10次。我们开发的时候肯定不只是10次就能完成的,所以我们要考虑如何更高效地利用免费授权测试。

Face⁺⁺ - 旷视Face⁺⁺人工智能开放平台

分析授权流程

现在免费授权都是通过网络授权的,LicenseManager提供了网络授权的接口。下面的代码片段调用了face++的授权接口。

		public static String API_KEY = "jAKhUoK6X1HFRZrxtRWFoObzhEby";
    public static String API_SECRET = "4QjIDv-G3c02XqLkk8924ZdUJm";

    public static String CN_LICENSE_URL = "<https://api-cn.faceplusplus.com/sdk/v3/auth>";	

private suspend fun takeLicense(context: Context, modelBuffer: ByteArray) =
        suspendCancellableCoroutine<Int> { continuation ->
            var ability = FaceppApi.getInstance().getModelAbility(modelBuffer)
            val authManager = FacePPMultiAuthManager(ability)
            val licenseManager = LicenseManager(context)
            licenseManager.registerLicenseManager(authManager)
            val uuid: String = Util.getUUIDString(context)
            licenseManager.takeLicenseFromNetwork(
                Util.CN_LICENSE_URL, uuid, Util.API_KEY, Util.API_SECRET,
                "1", object : LicenseManager.TakeLicenseCallback {
                    override fun onSuccess() {
                        continuation.resumeWith(Result.success(0))
                    }

                    override fun onFailed(i: Int, bytes: ByteArray) {
                        continuation.resumeWith(Result.success(1))
                    }
                })
        }

调用授权接口需要我们把自己申请的测试用api key和api secret传递进去,授权成功后我们可以接到成功的回调。我们在成功callback中调用FaceDetectApi.getInstance().initFaceDetect()可以初始化成功。

免费授权次数限制本质就是调用takeLicenseFromNetwork的次数限制,takeLicenseFromNetwork方法的实现就是下面这段代码。

public void takeLicenseFromNetwork(String url, String uuid, String apiKey, String apiSecret, String duration, final LicenseManager.TakeLicenseCallback takeLicenseCallback) {
        this.apiKey = apiKey;
        this.getExpirationMillis();
        boolean isAuthSuccess = this.needToTakeLicense();
        if (isAuthSuccess) {
            if (takeLicenseCallback != null) {
                takeLicenseCallback.onSuccess();
            }
        } else {
            String content = this.getContext(uuid);
            String errorStr = this.getLastError();
            RequestManager requestManager = new RequestManager(this.context);
            String params = "";

            try {
                params = "api_key=" + URLEncoder.encode(apiKey, "utf-8") + "&api_secret=" + URLEncoder.encode(apiSecret, "utf-8") + "&auth_msg=" + URLEncoder.encode(content, "utf-8") + "&auth_duration=" + URLEncoder.encode(duration, "utf-8");
            } catch (Exception var13) {
                var13.printStackTrace();
            }

            HashMap<String, String> map = new HashMap();
            map.put("perm", "Authorized");
            map.put("Host", "fpp-api-python-qa");
            requestManager.postRequest(url, params.getBytes(), map, new IHttpRequestRelult() {
                public void onDownLoadComplete(int code, byte[] date, HashMap<String, String> headers) {
                    String successStr = new String(date);
                    boolean isSuccess = LicenseManager.this.setLicense(successStr);
                    if (isSuccess) {
                        if (takeLicenseCallback != null) {
                            takeLicenseCallback.onSuccess();
                        }
                    } else if (takeLicenseCallback != null) {
                        takeLicenseCallback.onFailed(-1, LicenseManager.this.getLastError().getBytes());
                    }

                }

                public void onDownLoadError(int code, byte[] date, HashMap<String, String> headers) {
                    if (takeLicenseCallback != null) {
                        takeLicenseCallback.onFailed(code, date);
                    }

                }
            });
        }

    }

从代码中可以发现请求网络授权接口前,方法中还要通过needToTakeLicense()方法判断是否真的要请求网络授权。我们看下needToTakeLicense()的具体实现:

public boolean needToTakeLicense() {
        long nowTime = System.currentTimeMillis();
        Log.w("LicenseManager", "当前时间:" + nowTime);
        Log.w("LicenseManager", "过期时间:" + this.expirationMillis);
        if (this.expirationMillis >= nowTime + this.authTimeBufferMillis) {
            Log.w("LicenseManager", "已授权,不需要重新授权");
            return true;
        } else {
            Log.w("LicenseManager", "需要重新授权");
            return false;
        }
    }

通过这个方法的实现我们了解到在授权过期前,needToTakeLicense()方法返回的都是true。然而判断过期的变量都保存在内存中,所以当用户重启应用时needToTakeLicense()方法返回的是false。

通过这段逻辑我们可以认为在过期范围内我们可以不调用takeLicenseFromNetwork()方法进行授权,而是直接调用FaceDetectApi.getInstance().initFaceDetect()初始化就可以了。

实现限制突破

基于上面的分析,我们可以稍微调整一下调用接口的顺序进行测试。调整后的调用顺序如下:

  1. 尝试调用FaceDetectApi.getInstance().initFaceDetect()进行初始化操作。
  2. 如果第一步初始化失败了调用takeLicenseFromNetwork()方法进行授权-》再尝试调用FaceDetectApi.getInstance().initFaceDetect()进行初始化。
  3. 如果第一步的初始化成功,我们不需要调用takeLicenseFromNetwork()方法进行授权而直接使用。

按照上面的步骤先调用FaceDetectApi.getInstance().initFaceDetect()进行初始化操作后,只有授权过期了我们才会调用takeLicenseFromNetwork()进行网络授权,所以takeLicenseFromNetwork()每一条只会调用一次,但是我们的app可以启动很多次进行sdk的使用。

方法限制

由于我们授权次数限制是通过takeLicenseFromNetwork()调用次数限制实现的,在不同的手机上肯定至少每天进行一次授权,所以这种方法授权同台设备可以无限次使用,但同时只能授权10台设备。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mjlong123123

你的鼓励时我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值