1.シナリオが実証します
IDカードの写真、自動充填機能についての情報を読み取ることによって。
2.分析
写真の上に運ば関連情報を解決したい、あなたは写真の機能を識別するために必要な、テンセントは、誰もが使用するための無料のIDカードのOCRインタフェースを提供します。
いいえ、患者が直接インターフェース呼び出しを見ることができない(インターフェースルール導入をスキップ)
3.インターフェースのルール
インタフェースアドレス:https://api.ai.qq.com/fcgi-bin/ocr/ocr_idcardocr
API住所:https://ai.qq.com/doc/ocridcardocr.shtml
ルール
注意:
1.検索要求モードインタフェースは無効(Iが試した)の転送を要求するためのフォーム形式、JSONインターフェースを使用して送信されなければなりません。
2.戻りJSON形式の文字列、特定のデータが解析され、そしてJSONオブジェクトが最初にJSONオブジェクトに変換する必要があるように値を直接使用することができません。
上院の概要
APP_IDは、一意許可検索インタフェースを有するためにキーを使用して、自動的に登録されたアカウントの後に生成識別する。
TIME_STAMP、タイムスタンプは、システムはタイムアウト(5分)をチェックし、(秒ではなく、ミリ秒単位で)現在のタイムスタンプを取得し、
nonce_str、ランダムな文字列は、最大長さは、我々が直接32ビットを生成することができ、32ビットです。
主の送信中に改ざんされてからデータを防ぐために、セキュリティ検証のために、サイン。
画像は、base64でコードに画像を変換する、唯一1メガバイトを超えることができない画像JPG、PNGおよびBMPフォーマット及び画像サイズをサポートします。
必要なヘッド、 "データ:; base64で、画像/ JPEG"、さらに、ピクチャタイプ、すなわち宣言、含まれていない "データ:画像/ PNGと、BASE64、"、 "データ:画像/ BMP、BASE64、" 除去。
CARD_TYPE、それが正の場合は1と負、0と、非常にシンプル。
それはフォームがフォームでなければならないことを必要とするため、その値の型自体は、単に、制限することができませんでしたAPP_ID、値TIME_STAMPと整数のための命令を無視し、文字列は実際にはこれらの3つのフィールドがCARD_TYPE:ことに留意すべきですフォームの送信フォームのデータ型を提出し、それは彼らが自己矛盾していること、それが文字列である、常に唯一のものです!
次のように生成規則に署名:
、除外サイン、辞書式昇順(ASCII昇順)後、ステッチの形態の組成物は、要求URLパラメータを取得し、これらのいくつかのパラメータに必要な、これは、次のことを意味します
結果1.スプライシング昇順に必要なパラメータ:APP_ID = VALUE1&CARD_TYPE = value2の&画像=値3&nonce_str = value4を&= VALUE5&TIME_STAMP = value6に署名
2.image値、すなわち、URLエンコードを使用することなく、残りのフィールドの値を符号化されたデータフォーマットに必要なURLのBASE64。
文字列の前に暗号化されていない生成3:エンドそのスプライシングの最初のステップの結果キー、すなわちオン:APP_ID = VALUE1&CARD_TYPE = value2の&画像= VALUE3&nonce_str = value4&サイン= VALUE5&TIME_STAMP = value6&app_key = value7
4.記号を生成する:第三の工程の結果、MD5暗号化を使用する、暗号化結果が得られた値の大文字符号を回します。
戻り値のデータ
値の上限(秒あたりの要求のQPS-呼び出し可能数)
4.特定のコール
前提:私たちは前に渡すと仮定は、base64形式の画像です。
定数を設定します。
//インタフェースIDに割り当てられた プライベートTX_APP_ID最終的な静的int型= 1111111111; インタフェースに対応する//キー =「2222222222222222」プライベートTX_APP_KEY決勝静的な文字列; インタフェース、検索の//アドレス 民間最終静的な文字列TX_ORCURL =「HTTPS :// API。 ai.qq.com/fcgi-bin/ocr/ocr_idcardocr「;
インポート
輸入java.util.Map; 輸入java.util.TreeMapの; 輸入java.util.UUID。
特定のコード
ストリングimgBase64 = request.getParameter( "imgBase64")。 IF(imgBase64.startsWith( "データ:画像/ JPEG、BASE64、")){ imgBase64 = imgBase64.replace( "データ:画像/ JPEG、BASE64、"、 ""); }そうであれば(imgBase64.startsWith( "データ:画像/ PNG、BASE64、")){ imgBase64 = imgBase64.replace( "データ:画像/ PNG、BASE64、"、 ""); }そうであれば(imgBase64.startsWith( "データ:画像/ BMP、BASE64、")){ imgBase64 = imgBase64.replace( "データ:画像/ BMP、BASE64、"、 ""); } //时间戳 INT TIME_STAMP =(INT)(のSystem.currentTimeMillis()/ 1000)。 //随机字符串 文字列nonce_str = UUID.randomUUID()のtoString()を置き換えます( " - "、 "")。。。 //文字列画像= URLEncoder.encode(imgBase64、 "UTF-8"); // IDカードの前面と背面(0-正1-負) のint CARD_TYPE = 0; // TreeMapの(自動的に命じ生成マップ)を使用しなければなりません 地図<文字列、文字列> = SortedMapの新しい新しいのTreeMapを<>( ); sortedMap.put( "APP_ID"、String.valueOf(TX_APP_ID)); sortedMap.put( "TIME_STAMP"、String.valueOf(TIME_STAMP)); sortedMap.put( "nonce_str"、nonce_str); sortedMap.put( "画像"画像); sortedMap.put(" CARD_TYPE "String.valueOf(CARD_TYPE)); //認証生成 ・サイン= generateSign(SortedMapのを); sortedMap.put("ログイン」、記号); //検索テンセントインターフェース ストリングresultData = httpPostWithForm(TX_ORCURL、のSortedMap); TODOの// resultDataさらなる処理(フロントエンド処理に直接返却)
以下のための認証コードを生成します
インポートする必要があります
輸入java.io.UnsupportedEncodingException。 輸入java.net.URLEncoder。 インポートするjava.util.Iterator; 輸入java.util.Map; 輸入org.apache.commons.codec.digest.DigestUtils。
/ ** *テンセントは、認証ID OCR生成 VALUE1&キー1 =キー2 =値2&... @explain *を 辞書に応じて地図の昇順に* @paramのSortedMapキー * @returnサイン(MD5は暗号化され、大文字を転送) * / プライベート静的な文字列をgenerateSign(地図<文字列、文字列>のSortedMap){ //認証 文字列サイン= ""; イテレータ<文字列> = sortedMap.keySet ITER()イテレータ();. のStringBuilder StringBuilderの新しい新しいSB =(); ながら、(iter.hasNext ()){ 文字列のキー= iter.next(); Object値=()キーsortedMap.get; // URLに必要なBase64エンコード (key.equals( "イメージ" IF)){ のtry { E.printStackTrace(); 値= URLEncoder.encode (sortedMap.get(キー)、 "UTF -8"); キャッチ}(にUnsupportedEncodingException E){ } } Sb.append(キー).append( "=")のappend(値).append( "&");. } .. Sb.append( "app_key")アペンド( "=")アペンド(TX_APP_KEY)。 //前に暗号化された 記号= sb.toStringは(); //暗号化した後(MD5は暗号化され、大文字転送) ・サイン= DigestUtils.md5Hex(ログイン).toUpperCase(); ;リターンサイン }
ポスト要求コードを送信
インポートする必要があります
輸入はjava.util.ArrayList; 輸入はjava.util.List; 輸入java.util.Map; 輸入org.apache.commons.httpclient.HttpStatus。 輸入org.apache.http.HttpResponse。 輸入org.apache.http.client.entity.UrlEncodedFormEntity。 輸入org.apache.http.client.methods.HttpPost; 輸入org.apache.http.impl.client.CloseableHttpClient。 輸入org.apache.http.impl.client.HttpClientBuilder。 輸入org.apache.http.message.BasicNameValuePair; 輸入org.apache.http.util.EntityUtils。
/ ** *提出フォームフォームフォームデータを、POSTリクエストを送信する * @explain * 1.リクエストヘッダ:httppost.setHeader( "Content-Typeの"、 "ファイルのアプリケーション/ x-www-form-urlencodedで") * 2.提出データ形式:&VALUE1キー1 =キー2 =値2 ... * @paramリクエストURLアドレス * @param paramsMap特定のデータ *の@returnサーバがデータを返す * / パブリック静的文字列httpPostWithFormを(文字列URL、地図<文字列、文字列> paramsMap){ //リターン受信するための結果 = ""文字列resultDataを、 試してみる{ HttpPost = POST新しい新HttpPost(URL); リスト<BasicNameValuePair> =新しい新しいpairListのArrayList <BasicNameValuePair>(); //反復マップ- >キーを削除し、値に- BasicNameValuePairオブジェクト>リストに追加 paramsMap:キー(文字列のために。keySet()){ pairList.add(新新BasicNameValuePair(キー、paramsMap.get(キー))); } UrlEncodedFormEntity uefe =新新UrlEncodedFormEntity(pairList、 "UTF-8"); post.setEntity(uefe); // HTTPクライアントを作成します CloseableHttpClient HttpClientを。= HttpClientBuilder.create())(ビルドし; // POSTリクエストを送信し たHttpResponse httpClient.executeレスポンス=(ポスト); //ステータスコード:200は、 IF(response.getStatusLine()getStatusCode()== HttpStatus.SC_OK。) { //戻りデータ: resultData = EntityUtils.toString(response.getEntity()、 "UTF-8"); }他{ 新しいのRuntimeException( "!インターフェイスの接続に失敗しました")投げる; } }キャッチ(例外Eを){ 新しいのRuntimeExceptionを投げる( "インターフェイスの接続が失敗した!"); } resultDataを返します; }