using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using TencentCloud.Ocr.V20181119;
using TencentCloud.Ocr.V20181119.Models;
using Newtonsoft.Json;
using TencentCloud.Common;
using TencentCloud.Common.Profile;
using Furion.DependencyInjection;
using Furion;
using TencentCloud.Iai.V20200303;
using TencentCloud.Iai.V20200303.Models;
namespace EzTencentCloud
{
public class TencentCloudService: ITencentCloudService, IScoped
{
public TencentCloudService()
{
}
#region orc 图文识别
///
/// 剪裁后的身份证图片
///
public string CropIdCard { get; set; }
public string GetIdCordImg()
{
if (string.IsNullOrEmpty(CropIdCard))
return "";
else
return CropIdCard;
}
public IDCardOCRResponse IdCord(string ImageBase64, bool isFRONT)
{
try
{
Credential cred = new Credential
{
SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
};
ClientProfile clientProfile = new ClientProfile();
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("ocr.tencentcloudapi.com");
clientProfile.HttpProfile = httpProfile;
var _ocrClient = new OcrClient(cred, "ap-shanghai", clientProfile);
IDCardOCRRequest req = new IDCardOCRRequest();
if (isFRONT)
req.CardSide = "FRONT";
else
req.CardSide = "BACK";
req.ImageBase64 = ImageBase64;
req.Config = JsonConvert.SerializeObject(new
{
//身份证照片裁剪(去掉证件外多余的边缘、自动矫正拍摄角度)
CropIdCard = true,
// CropPortrait = true,
//边框和框内遮挡告警
BorderCheckWarn = true,
//PS检测告警
DetectPsWarn = true,
//临时身份证告警
TempIdWarn = true,
//身份证有效日期不合法告警
InvalidDateWarn = true,
//图片质量分数(评价图片的模糊程度)
Quality = true,
});
IDCardOCRResponse resp = _ocrClient.IDCardOCRSync(req);
if (resp == null)
throw new Exception("图片无法识别,请重新选择身份证图片");
var adv = JsonConvert.DeserializeObject(resp.AdvancedInfo);
if (adv == null)
throw new Exception("图片无法识别,请重新选择身份证图片");
if (adv?.BorderCodeValue != null && adv.BorderCodeValue > 50)
throw new Exception("身份证图片不完整,请重新选择身份证图片");
if (adv?.Quality != null && adv.Quality < 50)
throw new Exception("图片模糊,请重新选择身份证图片");
if (adv?.WarnInfos?.Where(x => x == -9100) == null)
throw new Exception("身份证日期不合法,请重新选择身份证图片");
if (adv?.WarnInfos?.Where(x => x == -9106) == null)
throw new Exception("该图片可能是被PS过,请重新选择身份证图片");
CropIdCard = adv.IdCard;
return resp;
}
catch (Exception)
{
throw;
}
}
public BizLicenseOCRResponse BizLicenseOCR(string ImageBase64)
{
try
{
Credential cred = new Credential
{
SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
};
ClientProfile clientProfile = new ClientProfile();
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("ocr.tencentcloudapi.com");
clientProfile.HttpProfile = httpProfile;
var _ocrClient = new OcrClient(cred, "ap-shanghai", clientProfile);
var ret = _ocrClient.BizLicenseOCRSync(new BizLicenseOCRRequest()
{
ImageBase64 = ImageBase64,
});
return ret;
}
catch (Exception)
{
throw;
}
}
#endregion
#region iai 人脸识别
public void IaiCreatGroup()
{
Credential cred = new Credential
{
SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
};
ClientProfile clientProfile = new ClientProfile();
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("iai.tencentcloudapi.com");
clientProfile.HttpProfile = httpProfile;
var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile);
try
{
var retinfo = iaiClient.GetGroupInfoSync(new GetGroupInfoRequest
{
GroupId = App.Configuration["IAIGroupSet:ID"] ?? "",
});
}
catch (TencentCloudSDKException e)
{
if (e.ErrorCode == "InvalidParameterValue.GroupIdNotExist")
{
CreateGroupRequest request = new CreateGroupRequest()
{
GroupId = App.Configuration["IAIGroupSet:ID"],
GroupName= App.Configuration["IAIGroupSet:Name"],
};
var aia = iaiClient.CreateGroupSync(request);
}
}
}
public bool IaiAddPerso( string img64,string PersonNameId,string PersonName, int PersonGender)
{
Credential cred = new Credential
{
SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
};
ClientProfile clientProfile = new ClientProfile();
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("iai.tencentcloudapi.com");
clientProfile.HttpProfile = httpProfile;
var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile);
var ret= iaiClient.CreatePerson(new TencentCloud.Iai.V20200303.Models.CreatePersonRequest
{
GroupId = App.Configuration["IAIGroupSet:ID"],
Image = img64,
PersonId= PersonNameId,
PersonName= PersonName,
Gender=PersonGender,
});
if(ret.IsFaulted)
return false;
else
return true;
}
public bool IaiAddPersoImg(string img64, string PersonNameId, string PersonName, int PersonGender)
{
Credential cred = new Credential
{
SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
};
ClientProfile clientProfile = new ClientProfile();
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("iai.tencentcloudapi.com");
clientProfile.HttpProfile = httpProfile;
var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile);
var ret = iaiClient.CreateFace( new TencentCloud.Iai.V20200303.Models.CreateFaceRequest
{
PersonId = PersonNameId,
Images = [img64],
});
if (ret.IsFaulted)
return false;
else
return true;
}
public VerifyFaceResponse VerifyFace(string img64, string PersonNameId)
{
Credential cred = new Credential
{
SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
};
ClientProfile clientProfile = new ClientProfile();
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("iai.tencentcloudapi.com");
clientProfile.HttpProfile = httpProfile;
var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile);
var ret = iaiClient.VerifyFaceSync(new TencentCloud.Iai.V20200303.Models.VerifyFaceRequest
{
PersonId = PersonNameId,
Image= img64
});
return ret;
}
#endregion
}
//返回扩展参数
internal class AdvancedInfo
{
///
/// idCard 裁剪后身份证照片的base64编码,请求 Config.CropIdCard 时返回;
///
public string? IdCard { get; set; }
///
/// 身份证头像照片的base64编码,请求 Config.CropPortrait 时返回;
///
public string? Portrait { get; set; }
///
/// 图片质量分数,请求 Config.Quality 时返回(取值范围:0 ~ 100,分数越低越模糊,建议阈值≥50);
///
public int? Quality { get; set; }
///
/// 身份证边框不完整告警阈值分数,请求 Config.BorderCheckWarn时返回(取值范围:0 ~ 100,分数越低边框遮挡可能性越低,建议阈值≤50);
///
public int BorderCodeValue { get; set; }
///
/// 告警信息,Code 告警码列表和释义:
///-9100 身份证有效日期不合法告警,
///-9101 身份证边框不完整告警,
///-9102 身份证复印件告警,
///-9103 身份证翻拍告警,
///-9105 身份证框内遮挡告警,
///-9104 临时身份证告警,
///-9106 身份证 PS 告警,
///-9107 身份证反光告警。
///
public List WarnInfos { get; set; }
}
}