文字识别接入常见问题

2020-09-20 17:38:53 浏览数 (1)

一、接入常见问题

1.我现在还没有开通文字识别服务,但是我想先体验一下文字服务的效果,我该怎么做?

访问文字识别功能演示页面可以在线体验文字识别服务

https://cloud.tencent.com/act/event/ocrdemo

2.SecretId和SecretKey是什么?我该怎么获取?

--1)API 密钥是构建腾讯云 API 请求的重要凭证,使用腾讯云 API 可以操作您名下的所有腾讯云资源,为了您的财产和服务安全,请妥善保存和定期更换密钥。

注:请勿通过任何方式(如 GitHub)上传或者分享您的密钥信息,一旦泄露至外部渠道,可能造成您的云上资产重大损失

--2)成功注册腾讯云账号之后,可以通过如下演示获取API秘钥

3.我已开通文字识别服务,也能看懂API的接口调用说明,但是不懂代码,我怎样才能对API的功能及各项参数进行测试呢?

推荐使用API Explorer,因为API Explorer提供了在线调用、签名验证、 SDK 代码生成和快速检索接口等能力,能显著降低使用云 API 的难度。

使用方式说明:

这里我们以文字识别-身份证识别这个API为例,首先,通过参照文字识别-身份证识别的接口文档来填写API Explorer中调用该接口的各项参数,然后点“在线调用”,点"发送请求"按钮即可

测试地址如下:

https://console.cloud.tencent.com/api/explorer?Product=ocr&Version=2018-11-19&Action=IDCardOCR&SignVersion=

4.我们的项目对安全性要求非常高,通过云API方式调用文字识别服务不符合我们的需求,请问是否可以支持私有化部署?

支持,请联系我们告知具体的使用场景和需求。

5.我在接入文字识别-身份证识别时,出现报错信息"Message": "图片解码失败。",此问题的原因及解决方案是什么呢?

--1)如果您的身份证图片是Url入参,请核对如下问题:

  • 检查参数位置是否填写正确,比如您提供的图片的网络Url,但是却将其填写到了ImageBase64入参中,这种情况也是会报解码失败错误的
  • 检查入参的图片是否真的是标准图片类型,某些时候,可能这个文件只是拥有了图片的扩展名,但这个文件存储的并不是标准的二进制文件内容,这种情况下,就无法对图片内容进行解码;检查方式也很简单,你可以直接打开图片文件,看是否正常,如果图片文件展示的不是图片内容,或者无法正常展示,那么就需要您去确定图片的来源或者更换一张新得标准图片了
  • 检查图片是否损坏,方法仍然是测试图片是否可以正常展示,如果无法展示并报错,那么基本可以确定图片存在异常或者损坏了,需要更换标准图片

--2)如果您的身份证图片是ImageBase64入参,请核对如下问题:

  • 检查参数位置是否填写正确,比如您提供的图片的base64字符串,但是却将其填写到了Url入参中,这种情况也是会报解码失败错误的
  • 检查您入参的图片的base64字符串是否有携带特征头,因为API的Image入参是需要去掉特征头的,特征头的内容类似"data:image/jpeg;base64,",例如我这里有张jpg的图片的base64字符串的部分值如下
代码语言:javascript复制
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUD

那么,您在入参时,是需要去掉"data:image/jpeg;base64,"

  • 检查您的Image入参是否不完整,可能由于某些原因,您提交的base64字符串并不是完整的,这种情况,您可以将base64解码还原为图片,然后测试图片是否能正常展示,这里为您推荐一款base64还原为图片的网络工具:

http://tool.chinaz.com/tools/imgtobase/

注意:还原时,base64字符需要携带特征头,如这里的"data:image/jpeg;base64,"

6.我们的服务安全性要求非常高,对出站IP有严格的控制,请问是否可以提供文字识别服务的IP段以便我们将其配置为白名单来获取文字识别服务?

同样是出于安全方面的考虑,文字识别服务的IP虽然有配置IP段,但我们会周期性地改变IP段来提升安全性,关于您的需求,我们为您提供如下解决方案: 方案一:您可以将您的业务服务器部署到您的内网环境中,然后搭建一台代理服务器,您的业务服务器发起的文字识别服务请求通过代理服务器转发到文字识别服务端,这样可以提升您的业务服务器的安全性

方案二:也是基于代理服务器的逻辑,我们向您推荐API网关,使用API网关之后,您可以将文字识别API请求托管到API网关,然后您可以通过请求API网关发起文字识别服务请求。

API网关参考文档:https://cloud.tencent.com/document/product/628/41654

7.我要怎么配置才能使得某个子账号只具备调用文字识别下某一个API的权限?

十分抱歉,文字识别的权限控制是服务级的,目前仅支持文字识别(OCR)全读写访问权限配置,如有相关更新信息,请留意官方文档动态。

8.我在调用文字识别服务时出现报错提示"Message": "下载失败",请问这是什么原因以及相应的解决方案又是什么?

根据报错,我们可以推测您的图片入参方式是Url,这里的Url指的是基于HTTP协议的Web访问地址,通俗的说就是一个HTTP协议的网络地址,通过公网要能正常访问图片,建议您做如下排查:

  • 请检查您是否填写了一个本地文件地址,例如E:test.png、E:test.pngAItest.png都是不支持的,标准的Url地址类似http://test.image.myzijiebao.com/testA.jpg、https://test.image.myzijiebao.com/testA.jpg
  • 请检查您是否将Url字符填写错误了,导致无法正确访问到您的图片服务器
  • 请检车您的HTTPS协议的Url是否配置了自定义端口,Url的HTTPS协议仅支持标准的443端口,则图片是无法正常下载的,请修改为标准的443端口即可
  • 请检查Url是否配置了重定向且重定向后的Url无法正常访问
  • 请检查Url对应的图片下载耗时是否较长,如果超过3s,也是会报此错误的,另外,如果您的Url指向的境外服务器(如港澳台、国外),由于跨境带宽限制,图片的下载耗时也会拉长,如果超时也会出现此报错,所以建议条件允许尽可能将图片存储 在境内(不包含港澳台),如果图片一定要存储在境外,请参考问题9中的方案

二、SDK接入相关问题

1.我们的业务服务器部署在内网中,无法访问公网,请提供一个SDK调用文字识别服务的方案

如果SDK运行在内网服务器中,需要通过内网服务器中的SDK发起文字识别服务请求到代理服务器,再由代理服务器将请求转发至文字识别服务端。 1)首先我们假设您的代理服务器已经配置完成,此时需要在SDK的接口调用中配置代理服务器的信息,我们这里为您提供各开发语言版本SDK的代理配置方法

第一步:设置环境变量,设置https_proxy、http_proxy环境变量即可

第二步:下载您需要的开发语言SDK

https://cloud.tencent.com/document/sdk/Java

第三步:在SDK的接口调用Demo中进行配置

PHP
代码语言:javascript复制
//代理方案 $httpProfile->setProxy('https://ip:port');
$httpProfile = new HttpProfile();
$httpProfile->setProxy("http://127.0.0.1:12639");
golang

不支持代码中设置代理,可通过环境变量设置

python
代码语言:javascript复制
#如果需要指定proxy访问接口,可以按照如下方式初始化 python2
httpProfile = HttpProfile(proxy="http://用户名:密码@代理IP:代理端口")
#python3
httpProfile.proxy = "http://127.0.0.1:12639" #http://用户名:密码@代理IP:代理端口 也可
JAVA 从3.0.96版本开始
代码语言:javascript复制
HttpProfile httpProfile = new HttpProfile();
httpProfile.setProxyHost("127.0.0.1");
httpProfile.setProxyPort("12639");
.NET
代码语言:javascript复制
 // 代理服务器,当你的环境下有代理服务器时设定
httpProfile.WebProxy = Environment.GetEnvironmentVariable("HTTPS_PROXY");
//或者
httpProfile.WebProxy = "http://127.0.0.1:12639";
nodejs

不支持代码中设置代理,可通过环境变量设置

2)如果您还没有搭建好代理服务器,我们以文字识别-身份证识别这个接口为例,为您提供Nginx代理服务器的搭建方式以及Java SDK调用Nginx代理服务器的整个过程,请参考如下文档和示例Demo :

tencentcloud-sdk-java通过代理访问云API.rar

示例Demo

代码语言:javascript复制
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;

import com.tencentcloudapi.ocr.v20181119.OcrClient;

import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRRequest;
import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRResponse;

public class IDCardOCR
{
    public static void main(String [] args) {
        try{

            Credential cred = new Credential("AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpxxxx", "JL5oGVSDhGYzCD3ctxkHVVM8cpokaD4D");
            
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
System.setProperty("https.proxyHost", "tencent.cdhwdl.com"); # 代理服务器的域名
            System.setProperty("https.proxyPort", "443"); # 代理服务器的HTTPS协议端口号

            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            
            OcrClient client = new OcrClient(cred, "ap-hongkong", clientProfile);
            
            String params = "{"ImageUrl":"https://tencent-1256311141.cos.ap-chengdu.myzijiebao.com/ai/idcardf1.png"}";
            IDCardOCRRequest req = IDCardOCRRequest.fromJsonString(params, IDCardOCRRequest.class);
            
            IDCardOCRResponse resp = client.IDCardOCR(req);
            
            System.out.println(IDCardOCRResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
                System.out.println(e.toString());
        }

    }
    
}

2.我的项目环境架构是LAMP,目前我已经接入了PHP SDK 3.0-tencentcloud-sdk-php,但是目前通过Apache访问文字识别服务时,报如下错误,请问应该怎么解决呢?

[TencentCloudCommonExceptionTencentCloudSDKException] code: message:cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) requestId:

Web服务器访问文字识别服务时,会涉及到双向认证,所以您的Apache服务端也需要配置证书。请参考如下解决方案:

第一步:到 https://curl.haxx.se/ca/cacert.pem 下载证书文件cacert.pem,将其保存到 PHP 安装路径下。

第二步:编辑php.ini文件,删除curl.cainfo配置项前的分号注释符(;),值设置为保存的证书文件cacert.pem的绝对路径。

第三步:重启Apache服务或其他Web服务

3.我们的项目接入了腾讯云Nodejs 3.0,我们了解到HmacSHA256签名算法的POST请求体不得超过1MB,如果超过就需要配置前面算法为TC3-HmacSHA256,但是我们引入的官方Nodejs 3.0中仅支持配置签名算法为HmacSHA256,请问此问题应该怎么解决?

您可以通过如下Github获取集成了V3签名算法的Nodejs 3.0,然后配置签名算法参数为TC-HmacSHA256

https://github.com/TencentCloud/tencentcloud-sdk-nodejs/tree/signature3

代码语言:javascript复制
clientProfile.signMethod = "TC3-HMAC-SHA256";

三、API接入相关问题

1.文字识别的签名方法V1和V3有什么不同,它们的计算逻辑分别是怎样的?

V1的特点:

  • 签名方法 V1 简单易用,但是功能和安全性都不如签名方法 V3,推荐使用签名方法 V3。
  • V1使用的签名算法是HmacSHA1, HmacSHA256
  • V1的POST请求体大小上限为1M,素材超过1M,需要使用 V3

V3的特点:

  • 签名方法 V3(TC3-HMAC-SHA256)功能上覆盖了以前的签名方法 V1,而且更安全,支持更大的请求,支持 json 格式,性能有一定提升,推荐使用该签名方法计算签名。
  • V3使用的签名方法是TC3-HMAC-SHA256,可以支持更大的素材(超过1M)

对于签名计算逻辑,我们以文字识别-身份证识别这个接口的POST请求为例进行分析,可以使用API Explorer工具来辅助签名计算

V1签名的计算逻辑:

第一步:将所有请求参数(注意是所有,包含业务参数和公共参数)按照参数名的字典序升序排序,获得A

代码语言:javascript复制
{

    'Action' : 'IDCardOCR',

    'ImageUrl' : 'https://tencent-1256311141.cos.ap-chengdu.myzijiebao.com/ai/idcardf1.png',

    'Language' : 'zh-CN',

    'Nonce' : '7694',

    'Region' : 'ap-hongkong',

    'SecretId' : 'AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpooQp',

    'Timestamp' : '1600594405',

    'Version' : '2018-11-19',

}

第二步:将排序好的请求参数转换为"A=B&C=D&E=F"格式,获得B

代码语言:javascript复制
Action=IDCardOCR
ImageUrl=https://tencent-1256311141.cos.ap-chengdu.myzijiebao.com/ai/idcardf1.png
Language=zh-CN
Nonce=7694
Region=ap-hongkong
SecretId=AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpxxxx
Timestamp=1600594405
Version=2018-11-19

第三步:拼接签名原文串,获得C

代码语言:javascript复制
POSTocr.tencentcloudapi.com/?Action=IDCardOCR&ImageUrl=https://tencent-1256311141.cos.ap-chengdu.myzijiebao.com/ai/idcardf1.png&Language=zh-CN&Nonce=7694&Region=ap-hongkong&SecretId=AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpooQp&Timestamp=1600594405&Version=2018-11-19

第四步:调用HmacSha1加密算法,以C为加密内容,SecretKey为秘钥进行加密处理,获得签名D

代码语言:javascript复制
a/kKdyxV/6tjZs9sQpuP1KBmab4=

V3签名的计算逻辑:

第一步:拼接规范请求串

规范请求串=HTTP方法 HTTPURI URL查询字符串 参与签名的Header(键值对) 参与签名的Header(键) 请求主体的16进制小写SHA256值

代码语言:javascript复制
POST
/

content-type:application/json
host:ocr.tencentcloudapi.com

content-type;host
970539395f4bb228406c064a509aa5c7fc846ac15595f1961fb333fb1a9b21a9

第二步:拼接待签名字符串

待签名字符串=签名方法 时间戳 凭证范围 规范请求串的哈希值(SHA256)

代码语言:javascript复制
TC3-HMAC-SHA256
1600594502
2020-09-20/ocr/tc3_request
25791c965a96b3685593eb363ef7ab55fe90739dddcd2054b4fcf7f9598b5420

第三步:计算签名,签名的计算包含如下三个值

SecretKey(控制台可获取) Date(即待签名字符串中的凭证范围中的date值) Service(即待签名字符串中的凭证范围中的service,文字识别是ocr

计算签名又包含四个步骤

--1)计算SecretDate

拼接TC3和SecretKey作为HMACSHA256加密算法的秘钥,Date作为HMACSHA256加密算法的消息

--2)计算SecretService 将SecretDate作为HMACSHA256加密算法的秘钥,Service作为HMACSHA256加密算法的消息

--3)计算SecretSigning 将SecretService作为HMACSHA256加密算法的秘钥,tc3_request作为HMACSHA256加密算法的消息

--4)计算签名 将SecretSigning作为HMACSHA256加密算法的消息,将待签名字符串作为HMACSHA256加密算法的秘钥(转16进制小写)

代码语言:javascript复制
3f124dc4a0b633466bf5073203a142fe6a953ef6af025f43bc4af4a00870d81a

第四步:拼接Authorization

Authorization=签名方法(TC3-HMAC-SHA256) "空格" "Credential=SecretId/凭证范围" "逗号" "空格" "SignedHeaders=content-type;host" "逗号" "空格" "Signature=签名

代码语言:javascript复制
TC3-HMAC-SHA256 Credential=AKIDbx60g9mLlwxhBLAYFfneDbKlwqTpooQp/2020-09-20/ocr/tc3_request, SignedHeaders=content-type;host, Signature=3f124dc4a0b633466bf5073203a142fe6a953ef6af025f43bc4af4a00870d81a

0 人点赞