亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

JAVA演示阿里云圖像識別API,印刷文字識別-營業執照識別

2020-01-31 16:50:03
字體:
來源:轉載
供稿:網友

最近有由于需要,我開始接觸阿里云的云市場的印刷文字識別-營業執照識別這里我加上了官網的申請說明,只要你有阿里云賬號就可以用,前500次是免費的,API說明很簡陋,只能做個簡單參考。

一、API介紹

JAVA示例: 

public static void main(String[] args) {   String host = "https://dm-58.data.aliyun.com";   String path = "/rest/160601/ocr/ocr_business_license.json";   String method = "POST";   String appcode = "你自己的AppCode";   Map<String, String> headers = new HashMap<String, String>();   //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105   headers.put("Authorization", "APPCODE " + appcode);   //根據API的要求,定義相對應的Content-Type   headers.put("Content-Type", "application/json; charset=UTF-8");   Map<String, String> querys = new HashMap<String, String>();   String bodys = "{/"image/":/"對圖片內容進行Base64編碼/"}";   try {   /**   * 重要提示如下:   * HttpUtils請從   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java   * 下載   *   * 相應的依賴請參照   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml   */   HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);   System.out.println(response.toString());   //獲取response的body   //System.out.println(EntityUtils.toString(response.getEntity()));   } catch (Exception e) {   e.printStackTrace();   } }

返回碼:

{  "config_str" : "null/n", #配置字符串信息  "angle" : float, #輸入圖片的角度(順時針旋轉),[0, 90, 180,270]  "reg_num" : string, #注冊號,沒有識別出來時返回"FailInRecognition"  "name" : string, #公司名稱,沒有識別出來時返回"FailInRecognition"  "type" : string, #公司類型,沒有識別出來時返回"FailInRecognition"  "person" : string, #公司法人,沒有識別出來時返回"FailInRecognition"  "establish_date": string, #公司注冊日期(例:證件上為"2014年04月16日",算法返回"20140416")  "valid_period": string, #公司營業期限終止日期(例:證件上為"2014年04月16日至2034年04月15日",算法返回"20340415")  #當前算法將日期格式統一為輸出為"年月日"(如"20391130"),并將"長期"表示為"29991231",若證件上沒有營業期限,則默認其為"長期",返回"29991231"。  "address" : string, #公司地址,沒有識別出來時返回"FailInRecognition"  "capital" : string, #注冊資本,沒有識別出來時返回"FailInRecognition"  "business": string, #經營范圍,沒有識別出來時返回"FailInRecognition"  "emblem" : string, #國徽位置[top,left,height,width],沒有識別出來時返回"FailInDetection"  "title" : string, #標題位置[top,left,height,width],沒有識別出來時返回"FailInDetection"  "stamp" : string, #印章位置[top,left,height,width],沒有識別出來時返回"FailInDetection"  "qrcode" : string, #二維碼位置[top,left,height,width],沒有識別出來時返回"FailInDetection"  "success" : bool, #識別成功與否 true/false  "request_id": string}

購買后,在云市場列表里展示,你可要點擊進去查看AppCode等其主要信息(接口調用里需要AppCode)

簡單的API介紹,但挺有效了的,唯一不好的就是沒有錯誤返回碼的描述,需要自己測試。

二、代碼開發

閑話少說,上代碼:

AliyunImageRecognitionUtil :阿里云圖像識別工具類

package com.casic.cloud.qcy.util;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Map;import org.apache.http.HttpResponse;import org.apache.http.util.EntityUtils;import org.springframework.web.multipart.commons.CommonsMultipartFile;import com.alibaba.fastjson.JSONObject;import com.casic.cloud.qcy.constant.Constants;import sun.misc.BASE64Encoder;/**  * @ClassName: AliyunImageRecognitionUtil  * @Description: 阿里云圖像識別工具類 * @author: tianpengw * @date 2019年3月21日 上午8:49:08  *  */public class AliyunImageRecognitionUtil { private static String businessLicenceHost = PropertiesUtil.getProperties("businessLicenceHost");  private static String businessLicencePath = PropertiesUtil.getProperties("businessLicencePath");  private static String method = "POST";  private static String appCode = PropertiesUtil.getProperties("appCode");  /** *  * @Description: 根據文件全路徑識別 * @author: tianpengw * @param imgPath * @return */ public static Map<String,Object> bussinessLicenceRecognition(String imgPath){ Map<String,Object> resultMap = new HashMap<String,Object>();  Map<String, String> headers = new HashMap<String, String>(); //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105   headers.put("Authorization", "APPCODE " + appCode);   headers.put("Content-Type", "application/json; charset=UTF-8");      Map<String, String> querys = new HashMap<String, String>();   String bodys = "{/"image/":/""+imageToBase64Str(imgPath)+"/"}";   try {   /**   * 重要提示如下:   * HttpUtils請從   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java   * 下載   *   * 相應的依賴請參照   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml   */   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);   String resStr = EntityUtils.toString(response.getEntity());   System.out.println(resStr);      resultMap = JSONObject.parseObject(resStr, Map.class);   //獲取response的body   } catch (Exception e) {   e.printStackTrace();   }   return resultMap; }  /** *  * @Description: 根據InputStream識別 * @author: tianpengw * @param imgPath * @return */ public static Map<String,Object> bussinessLicenceRecognition(InputStream inputStream){ Map<String,Object> resultMap = new HashMap<String,Object>();  Map<String, String> headers = new HashMap<String, String>(); //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105   headers.put("Authorization", "APPCODE " + appCode);   headers.put("Content-Type", "application/json; charset=UTF-8");      Map<String, String> querys = new HashMap<String, String>();   // 加密   BASE64Encoder encoder = new BASE64Encoder();   byte[] data = null;   try {    data = new byte[inputStream.available()];    inputStream.read(data);    inputStream.close();   } catch (IOException e) {    e.printStackTrace();   }   String bodys = "{/"image/":/""+encoder.encode(data)+"/"}";   try {   /**   * 重要提示如下:   * HttpUtils請從   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java   * 下載   *   * 相應的依賴請參照   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml   */   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);   String resStr = EntityUtils.toString(response.getEntity());   System.out.println(resStr);      resultMap = JSONObject.parseObject(resStr, Map.class);   resultMap.put("errCode", Constants.RESULT_SUCCESS);   //獲取response的body   } catch (Exception e) {   e.printStackTrace();   resultMap.put("errCode", Constants.RESULT_FAIL);   }   return resultMap; } /** *  * @Description: 根據byte[]識別 * @author: tianpengw * @param imgPath * @return */ public static Map<String,Object> bussinessLicenceRecognition( byte[] data){ Map<String,Object> resultMap = new HashMap<String,Object>();  Map<String, String> headers = new HashMap<String, String>(); //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105   headers.put("Authorization", "APPCODE " + appCode);   headers.put("Content-Type", "application/json; charset=UTF-8");      Map<String, String> querys = new HashMap<String, String>();   // 加密   BASE64Encoder encoder = new BASE64Encoder();      String bodys = "{/"image/":/""+encoder.encode(data)+"/"}";   try {   /**   * 重要提示如下:   * HttpUtils請從   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java   * 下載   *   * 相應的依賴請參照   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml   */   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);   String resStr = EntityUtils.toString(response.getEntity());   System.out.println(resStr);      resultMap = JSONObject.parseObject(resStr, Map.class);   resultMap.put("errCode", Constants.RESULT_SUCCESS);   //獲取response的body   } catch (Exception e) {   e.printStackTrace();   resultMap.put("errCode", Constants.RESULT_FAIL);   }   return resultMap; }  /**  * 圖片轉base64字符串  * @param imgFile 圖片路徑  * @return  */  public static String imageToBase64Str(String imgFile) {   InputStream inputStream = null;   byte[] data = null;   try {    inputStream = new FileInputStream(imgFile);    data = new byte[inputStream.available()];    inputStream.read(data);    inputStream.close();   } catch (IOException e) {    e.printStackTrace();   }   // 加密   BASE64Encoder encoder = new BASE64Encoder();   return encoder.encode(data);  }    public static void main(String[] args) { String imgPath = "d:/yyzznew1.jpg"; Map<String,Object> map = AliyunImageRecognitionUtil.bussinessLicenceRecognition(imgPath); System.out.println(map.get("person")); System.out.println(map.get("reg_num")); }}

AliyunHttpUtils :阿里云httpUtils

package com.casic.cloud.qcy.util;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.List;import java.util.Map;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.commons.lang.StringUtils;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpDelete;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpPut;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.entity.ByteArrayEntity;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;/**  * @ClassName: AliyunHttpUtils  * @Description:  * @author: tianpengw * @date 2019年3月21日 上午8:44:51  *  */public class AliyunHttpUtils { /** * get *  * @param host * @param path * @param method * @param headers * @param querys * @return * @throws Exception */ public static HttpResponse doGet(String host, String path, String method,   Map<String, String> headers,   Map<String, String> querys)      throws Exception {      HttpClient httpClient = wrapClient(host);   HttpGet request = new HttpGet(buildUrl(host, path, querys));    for (Map.Entry<String, String> e : headers.entrySet()) {     request.addHeader(e.getKey(), e.getValue());    }        return httpClient.execute(request);  }  /** * post form *  * @param host * @param path * @param method * @param headers * @param querys * @param bodys * @return * @throws Exception */ public static HttpResponse doPost(String host, String path, String method,   Map<String, String> headers,   Map<String, String> querys,   Map<String, String> bodys)      throws Exception {      HttpClient httpClient = wrapClient(host);   HttpPost request = new HttpPost(buildUrl(host, path, querys));    for (Map.Entry<String, String> e : headers.entrySet()) {     request.addHeader(e.getKey(), e.getValue());    }    if (bodys != null) {      List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();      for (String key : bodys.keySet()) {        nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));      }      UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");      formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");      request.setEntity(formEntity);    }    return httpClient.execute(request);  }   /** * Post String *  * @param host * @param path * @param method * @param headers * @param querys * @param body * @return * @throws Exception */ public static HttpResponse doPost(String host, String path, String method,   Map<String, String> headers,   Map<String, String> querys,   String body)      throws Exception {      HttpClient httpClient = wrapClient(host);   HttpPost request = new HttpPost(buildUrl(host, path, querys));    for (Map.Entry<String, String> e : headers.entrySet()) {     request.addHeader(e.getKey(), e.getValue());    }    if (StringUtils.isNotBlank(body)) {     request.setEntity(new StringEntity(body, "utf-8"));    }    return httpClient.execute(request);  }  /** * Post stream *  * @param host * @param path * @param method * @param headers * @param querys * @param body * @return * @throws Exception */ public static HttpResponse doPost(String host, String path, String method,   Map<String, String> headers,   Map<String, String> querys,   byte[] body)      throws Exception {      HttpClient httpClient = wrapClient(host);   HttpPost request = new HttpPost(buildUrl(host, path, querys));    for (Map.Entry<String, String> e : headers.entrySet()) {     request.addHeader(e.getKey(), e.getValue());    }    if (body != null) {     request.setEntity(new ByteArrayEntity(body));    }    return httpClient.execute(request);  }  /** * Put String * @param host * @param path * @param method * @param headers * @param querys * @param body * @return * @throws Exception */ public static HttpResponse doPut(String host, String path, String method,   Map<String, String> headers,   Map<String, String> querys,   String body)      throws Exception {      HttpClient httpClient = wrapClient(host);   HttpPut request = new HttpPut(buildUrl(host, path, querys));    for (Map.Entry<String, String> e : headers.entrySet()) {     request.addHeader(e.getKey(), e.getValue());    }    if (StringUtils.isNotBlank(body)) {     request.setEntity(new StringEntity(body, "utf-8"));    }    return httpClient.execute(request);  }  /** * Put stream * @param host * @param path * @param method * @param headers * @param querys * @param body * @return * @throws Exception */ public static HttpResponse doPut(String host, String path, String method,   Map<String, String> headers,   Map<String, String> querys,   byte[] body)      throws Exception {      HttpClient httpClient = wrapClient(host);   HttpPut request = new HttpPut(buildUrl(host, path, querys));    for (Map.Entry<String, String> e : headers.entrySet()) {     request.addHeader(e.getKey(), e.getValue());    }    if (body != null) {     request.setEntity(new ByteArrayEntity(body));    }    return httpClient.execute(request);  }  /** * Delete *  * @param host * @param path * @param method * @param headers * @param querys * @return * @throws Exception */ public static HttpResponse doDelete(String host, String path, String method,   Map<String, String> headers,   Map<String, String> querys)      throws Exception {      HttpClient httpClient = wrapClient(host);   HttpDelete request = new HttpDelete(buildUrl(host, path, querys));    for (Map.Entry<String, String> e : headers.entrySet()) {     request.addHeader(e.getKey(), e.getValue());    }        return httpClient.execute(request);  }  private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {   StringBuilder sbUrl = new StringBuilder();   sbUrl.append(host);   if (!StringUtils.isBlank(path)) {   sbUrl.append(path);    }   if (null != querys) {   StringBuilder sbQuery = new StringBuilder();     for (Map.Entry<String, String> query : querys.entrySet()) {     if (0 < sbQuery.length()) {      sbQuery.append("&");     }     if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {      sbQuery.append(query.getValue());        }     if (!StringUtils.isBlank(query.getKey())) {      sbQuery.append(query.getKey());      if (!StringUtils.isBlank(query.getValue())) {      sbQuery.append("=");      sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));      }              }     }     if (0 < sbQuery.length()) {     sbUrl.append("?").append(sbQuery);     }    }      return sbUrl.toString();  }  private static HttpClient wrapClient(String host) { HttpClient httpClient = new DefaultHttpClient(); if (host.startsWith("https://")) {  sslClient(httpClient); }  return httpClient; }  private static void sslClient(HttpClient httpClient) {    try {      SSLContext ctx = SSLContext.getInstance("TLS");      X509TrustManager tm = new X509TrustManager() {        public X509Certificate[] getAcceptedIssuers() {          return null;        }        public void checkClientTrusted(X509Certificate[] xcs, String str) {                 }        public void checkServerTrusted(X509Certificate[] xcs, String str) {                 }      };      ctx.init(null, new TrustManager[] { tm }, null);      SSLSocketFactory ssf = new SSLSocketFactory(ctx);      ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);      ClientConnectionManager ccm = httpClient.getConnectionManager();      SchemeRegistry registry = ccm.getSchemeRegistry();      registry.register(new Scheme("https", 443, ssf));    } catch (KeyManagementException ex) {      throw new RuntimeException(ex);    } catch (NoSuchAlgorithmException ex) {     throw new RuntimeException(ex);    }  }}

PropertiesUtil :讀取配置文件工具

package com.casic.cloud.qcy.util;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;/**  * @ClassName: PropertiesUtil  * @Description:  * @author tianpengw * @date 2018年6月27日 下午3:09:08  *  */public class PropertiesUtil { private static Logger log = LogManager.getLogger(PropertiesUtil.class);  private static Properties prop;  static{ try{  if(null == prop){  prop = new Properties();  }  InputStream fis = null;  fis = ClassLoaderUtils.getResourceAsStream("common.properties", PropertiesUtil.class);  if(fis!=null){  prop.load(fis);// 將屬性文件流裝載到Properties對象中    fis.close();// 關閉流    } }catch (Exception e) {  log.error("讀取配置文件出錯:" + e ); } }  /** *  * @Description: 根據key獲取配置的值 * @author tianpengw  * @param key * @return */ public static String getProperties(String key){ if(key==null) return null; return prop.getProperty(key);  }   /** *  * @Description:  * @author tianpengw  * @param proper 讀取配置的文件名稱 * @param key * @return */ public static String getPropertie(String resourceName,String key){ InputStream fis = ClassLoaderUtils.getResourceAsStream(resourceName, PropertiesUtil.class); if(fis!=null){  try {  prop.load(fis);  fis.close();// 關閉流    } catch (IOException e) {  e.printStackTrace();  }     } if(key==null) return null; return prop.getProperty(key); }   /** *  * @Description: 根據key獲取配置的值,若沒有,則取傳過來的默認的值 * @author tianpengw  * @param key * @param defaultValue 默認值 * @return */ public static String getProperties(String key,String defaultValue){ if(key==null) return null; return prop.getProperty(key, defaultValue);  }}

配置文件common.properties(放在 src/main/resources下)

#aliyun business licence recognitionbusinessLicenceHost = https://dm-58.data.aliyun.combusinessLicencePath = /rest/160601/ocr/ocr_business_license.jsonappCode = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

三、測試結果

成功的結果:

失敗結果,當處理非營業執照的圖片時將會返回“invalid business licence”結果,我這么沒有進行判斷處理直接按照正確的json解析,所以報錯,此處你們可以按照自己需求選擇處理邏輯。從這返回結果也看的出該接口做的不合理,返回內容不統一,導致接口使用者,必須知曉各種情況才能做有效的處理,如果此處能返回json串,給錯誤碼那對于調用者來說就方便多了。

四、后記

此API適合一般的營業執照和新的三證合一的營業執照,但是字段獲取的含義不同,此處需要注意;
由于API并未列出錯誤碼,在未知的錯誤情況還包含識別次數不夠的時候是報錯還是有錯誤提示(由于條件限制,此情況無法驗證);

工具是死的,人是活的,開發需要考慮盡可能多的情況,來保證代碼的完善。
至此,工具介紹完畢,歡迎交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品99久久久久久白浆小说| 大量国产精品视频| 日韩欧美在线视频免费观看| 精品日韩视频在线观看| 久久99青青精品免费观看| 精品久久久久久中文字幕一区奶水| 一本色道久久综合狠狠躁篇怎么玩| 福利一区视频在线观看| 欧美激情中文网| 欧美精品久久久久久久免费观看| 欧洲亚洲在线视频| 精品久久久久久国产91| 91欧美视频网站| 精品露脸国产偷人在视频| 国产精品嫩草影院一区二区| 日日噜噜噜夜夜爽亚洲精品| 中文字幕成人在线| 亚洲国产天堂久久国产91| 色狠狠久久aa北条麻妃| 欧美视频在线观看 亚洲欧| 亚洲jizzjizz日本少妇| 97在线视频国产| 国产精品美女免费看| 色综合伊人色综合网| 亚洲第一中文字幕在线观看| 国内精品久久久久影院 日本资源| 97在线观看免费高清| 精品久久久一区二区| 精品久久久久久久久久| 国产色婷婷国产综合在线理论片a| 日韩禁在线播放| 亚洲18私人小影院| 欧美精品免费看| 欧美激情国内偷拍| 日韩国产中文字幕| 久久中文久久字幕| 国内精品一区二区三区四区| 国产小视频国产精品| 亚洲性生活视频在线观看| 欧美做受高潮电影o| 成人免费直播live| 成人性生交大片免费看视频直播| 国产精品影片在线观看| 久久精品在线播放| 日韩欧中文字幕| 国产一区二区黄| 国产精品成av人在线视午夜片| 日韩美女写真福利在线观看| 欧美日韩精品在线视频| 不卡av电影在线观看| 欧美性一区二区三区| 亚洲一区久久久| 亚洲精品aⅴ中文字幕乱码| 欧美成人国产va精品日本一级| 国产精品igao视频| 欧洲亚洲在线视频| 亚洲片av在线| 亚洲视频一区二区三区| 法国裸体一区二区| 国产美女久久精品| 中文字幕日韩电影| 欧美性生活大片免费观看网址| 国产精品高清网站| 欧美成年人视频网站| 亚洲成色www8888| 不卡伊人av在线播放| 国产盗摄xxxx视频xxx69| 亚洲第一视频在线观看| 亚洲精品国精品久久99热一| 欧美日韩精品在线| 色婷婷综合成人av| 日韩在线不卡视频| 美女撒尿一区二区三区| 欧美激情亚洲综合一区| 色天天综合狠狠色| 一区二区三区久久精品| 成人a级免费视频| 精品亚洲va在线va天堂资源站| 成人羞羞国产免费| 一区二区三区 在线观看视| 国产日韩欧美电影在线观看| 日韩免费电影在线观看| 国产精品第一页在线| 亚洲欧洲高清在线| 一区二区三区视频观看| 91久久久国产精品| 精品欧美一区二区三区| 中文字幕一区二区三区电影| 日韩一区二区在线视频| 国产成人精品视频在线| 欧美孕妇孕交黑巨大网站| 久久久在线视频| 亚洲人午夜精品| 一本久久综合亚洲鲁鲁| 久久精品久久久久| 亚洲人成绝费网站色www| 久久免费国产精品1| 91av在线影院| 欧美巨猛xxxx猛交黑人97人| 91香蕉电影院| 成人激情综合网| 成人淫片在线看| 亚洲aaa激情| 成人精品在线观看| 国产精品你懂得| 国产有码在线一区二区视频| 欧美综合第一页| 欧美性在线观看| 国产小视频91| 在线一区二区日韩| 91在线无精精品一区二区| 欧美性猛交xxxx免费看漫画| 精品国产欧美一区二区五十路| 成人中文字幕在线观看| 成人中文字幕在线观看| 欧美激情免费视频| 国产日韩精品在线播放| 久久九九国产精品怡红院| 国产99久久精品一区二区 夜夜躁日日躁| 欧美孕妇与黑人孕交| 欧美日韩精品在线视频| 97**国产露脸精品国产| 91九色在线视频| 国产亚洲成精品久久| 亚洲性猛交xxxxwww| 日韩欧美有码在线| 欧美电影电视剧在线观看| 日本a级片电影一区二区| 日本高清不卡的在线| 亚洲免费福利视频| 青青青国产精品一区二区| 欧美日韩在线视频一区| 久久久久久91| 欧美国产日韩xxxxx| 国产精品日韩欧美综合| 色偷偷亚洲男人天堂| 亚洲色图综合网| 中文字幕久精品免费视频| 91综合免费在线| 国产精品高清在线观看| 亚洲一区二区久久久| 91国产在线精品| 欧美裸体xxxxx| 亚洲精品suv精品一区二区| 国内精品在线一区| 久久91亚洲精品中文字幕奶水| 日韩欧美在线视频日韩欧美在线视频| 黄色精品在线看| 亚洲精品福利在线| 国产日韩欧美在线播放| 97在线视频免费观看| 久久久久久久999| 久久综合网hezyo| 中文字幕欧美视频在线| 亚洲第一中文字幕在线观看| 在线观看日韩欧美| 黑人巨大精品欧美一区二区一视频| 91av在线播放视频| 国产亚洲精品久久久久久777| 精品久久久久久久久久国产| 欧美精品videos另类日本| 97福利一区二区| 中文字幕欧美日韩| 久久久久久国产免费|