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

首頁 > 編程 > C# > 正文

詳解二維碼生成工廠

2019-10-29 21:17:05
字體:
來源:轉載
供稿:網友

本次主要分享的是3個免費的二維碼接口的對接代碼和測試得出的注意點及區別,有更好處理方式多多交流,相互促進進步;最近在學習JavsScript的擴展TypeScript,感覺語法糖很甜,大部分與C#更為類似,可能都是微軟項目的原因吧,有興趣的朋友可以多多相互交流下;

以上是個人的看法,下面來正式分享今天的文章吧:

  • Google的Api二維碼生成接口
  • 2d-code的Api二維碼生成接口
  • topscan的Api二維碼生成接口
  • 使用面向對象+加載程序集創建對象合并以上接口封裝成二維碼生成工廠

下面一步一個腳印的來分享:

Google的Api二維碼生成接口

首先,這里給出Google接口文檔的鏈接qr_codes文檔,熱情的朋友馬上就會打開此鏈接吧,詳細看下里面的參數這就不做截圖了,大致通常用到的參數是:api地址,內容參數,生成圖片的高寬這3個參數,其他的幾個參數都采用默認的吧,不同需要大家可以更詳細的看下;其實第一次看到文檔里面的參數,感覺少了一些東西,比如怎么不能傳遞二維碼中間那個圖標的圖片地址和掃描二維碼過后怎么跳轉到我想重定向的url鏈接呢,帶著這個疑問我進行了多次的嘗試;下面給出自己嘗試的結果說明:

  •  接口關鍵參數是:cht(固定值qr),chl(內容參數),chs(生成出來二維碼圖片尺寸,格式如:200x200,這里是xyz的x不是*)
  • api接口只會生成一個二維碼的圖片流,如果需要把圖片保存到本地需要通過瀏覽器直接get訪問接口或者通過程序下載這個二維碼
  • 內容參數如果傳遞文本信息,在生成出來的二維碼圖片中間不會顯示文本內容,只有用手機掃描二維碼才能在手機上顯示傳遞的文本信息
  • 內容參數如果傳遞單純的http://格式的鏈接地址,那么手機掃描后會自動重定向到改http://鏈接地址上(這個掃描重定向可以用來做一些商品或者文章的查看)
  • google接口暫未研究出此Logo圖標地址參數(希望有朋友研究出來后與我分享,謝謝)
  • 由于api地址是國外的,調用接口響應不是那么快速

其次,上面是個人的一些總結,下面我們來看下封裝的請求接口方法和下載二維碼圖片方法:

#region 生成二維碼

 /// <summary> /// 生成二維碼 /// </summary> /// <param name="content">展示內容(文本內容 或者 掃描后的跳轉http://格式的地址)</param> /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> /// <param name="logoUrl"> Logo圖標地址(格式:http://),(注:google接口暫未研究出此參數)</param> /// <param name="apiUrl">接口地址(內置默認api地址)</param> /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> /// <returns></returns> public virtual string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) { var qrName = string.Empty; #region 參數初始化 ApiUrl = apiUrl ?? ApiUrl; Content = content ?? Content; SaveQRPath = savePath ?? SaveQRPath; LogoUrl = logoUrl ?? LogoUrl; WAndH = wAndh ?? WAndH; #endregion if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } ApiUrl = string.Format("{0}?cht=qr&chl={1}&chs={2}x{2}", ApiUrl, HttpUtility.UrlEncode(Content), WAndH); qrName = DownImg(ApiUrl, SaveQRPath, ImageFormat.Jpeg); return qrName; } #endregion

下載二維碼圖片保存到程序根目錄:

#region 下載圖片 /// <summary> /// 下載圖片 /// </summary> /// <param name="url">圖片下載地址</param> /// <param name="savePath">保存路徑默認:Img文件夾</param> /// <param name="format">默認:Jpeg</param> /// <returns>新圖片名稱</returns> public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null) { var qrName = string.Empty; try { format = format ?? ImageFormat.Jpeg; HttpClient http = new HttpClient(); http.Timeout = new TimeSpan(0, 1, 0); using (var stream = http.GetStreamAsync(url).Result) { if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); } qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format; var path = Path.Combine(savePath, qrName); using (Image img = Image.FromStream(stream)) { img.Save(path, format); } } } catch (Exception ex) { qrName = string.Empty; } return qrName; }#endregion

上面兩個方法使用的是虛方法,因為我這里是吧google接口當做默認的二維碼生成器來使用,后面要講的另外兩個接口都是重寫與此;下載圖片的方法都是公用的,暫不需要重寫;這里需要提到的是調用api接口時有一個固定的參數cht=qr,這個參數表示采用QR方法生成二維碼,因為這個api接口還有生成圖標的功能,所以只想要生成二維碼這里就固定,更多的生成圖標功能不在本章分享中,謝謝。

2d-code的Api二維碼生成接口

首先,該接口需要通過他們官網注冊一個key,然后從后臺獲取到這個key后才能調用接口地址,當然注冊后有個功能是,凡是您通過api接口生成的二維碼,除了自己通過流下載,還能通過他們后臺一起下載所有生成的圖片,本人暫時沒有去關注是否生成量大了會收費哈哈,下面列舉下接口參數說明和測試得出的注意點:

  • 接口關鍵參數是:key(注冊獲取),text(文本參數),url(掃描后重定向地址),logo(Logo圖標地址),size(二維碼正方形,高寬)
  • 接口的文本參數只能傳遞文本,不能當做掃描后重定向的地址參數使用和Google等接口有點不一樣
  • 掃描后重定向地址和Logo圖標地址都是可訪問的http://格式的地址鏈接
  • Logo圖標地址,官方說不建議使用png格式,測試只有jpg成功(可能是測試不夠多這里只單純介紹我的結果)
  • 生成速度比較快,而且還有一個藝術字的生成接口,挺不錯
  • api接口只會生成一個二維碼的圖片流,如果需要把圖片保存到本地需要通過瀏覽器直接get訪問接口或者通過程序下載這個二維碼

其次,下面給出封裝的代碼,由于下載和上面介紹的代碼一樣是公用的這里就不做陳述:

public QR_2dCode() { ApiUrl = "http://www.2d-code.cn/2dcode/api.php"; } #region 生成二維碼 /// <summary> /// 生成二維碼 /// </summary> /// <param name="content">展示內容(文本內容 或者 掃描后的跳轉http://格式的地址)</param> /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> /// <param name="logoUrl"> Logo圖標地址(格式:http://),官方不建議使用png格式,測試只有jpg成功</param> /// <param name="directUrl">掃描后重定向地址(http://)</param> /// <param name="apiUrl">接口地址(內置默認api地址)</param> /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> /// <returns></returns> public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) { var qrName = string.Empty; #region 參數初始化 ApiUrl = apiUrl ?? ApiUrl; Content = content ?? Content; SaveQRPath = savePath ?? SaveQRPath; LogoUrl = logoUrl ?? LogoUrl; WAndH = wAndh ?? WAndH; #endregion if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } ApiUrl = string.Format("{0}?key=c_d800OBbu6hDzJtXPE2Yd02IMtmpuK9VdCqHe6vrtar4&text={1}&url={2}&logo={3}&size={4}", ApiUrl, HttpUtility.UrlEncode(Content.Contains("http") ? "" : Content), HttpUtility.UrlEncode(Content), HttpUtility.UrlEncode(LogoUrl), WAndH); qrName = DownImg(ApiUrl, SaveQRPath); return qrName; }#endregion

topscan的Api二維碼生成接口

首先,該接口肯定是免費的,參數描述和google的差不多,不同處在于可以傳遞Logo圖標地址(當然可能我還沒發現google的可以傳遞logo的參數,故此朋友們可以忽略);下面列舉下接口參數說明和測試得出的注意點:

  • 接口關鍵參數是:text(內容參數),logo(Logo圖標地址),w(生成出來二維碼圖片尺寸,格式如:200x200,這里是xyz的x不是*)
  • api接口只會生成一個二維碼的圖片流,如果需要把圖片保存到本地需要通過瀏覽器直接get訪問接口或者通過程序下載這個二維碼
  • 內容參數如果傳遞文本信息,在生成出來的二維碼圖片中間不會顯示文本內容,只有用手機掃描二維碼才能在手機上顯示傳遞的文本信息
  • 內容參數如果傳遞單純的http://格式的鏈接地址,那么手機掃描后會自動重定向到改http://鏈接地址上(這個掃描重定向可以用來做一些商品或者文章的查看)
  • Logo圖標地址(格式:http://),jpg,png測試通過
  • 測試得出有時候請求生成二維碼不返回數據,有可能是我網路問題吧,正常生成二維碼的速度還是挺快

其次,下面給出封裝的代碼,由于下載和上面介紹的代碼一樣是公用的這里就不做陳述:

public QR_TopScan() { ApiUrl = "http://qr.topscan.com/api.php"; } #region 生成二維碼 /// <summary> /// 生成二維碼 /// </summary> /// <param name="content">展示內容(文本內容 或者 掃描后的跳轉http://格式的地址)</param> /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> /// <param name="logoUrl"> Logo圖標地址(格式:http://),jpg,png測試通過,測試得出有不能成功的,原因不知是否和地址有關</param> /// <param name="apiUrl">接口地址(內置默認api地址)</param> /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> /// <returns></returns> public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) { var qrName = string.Empty; #region 參數初始化 ApiUrl = apiUrl ?? ApiUrl; Content = content ?? Content; SaveQRPath = savePath ?? SaveQRPath; LogoUrl = logoUrl ?? LogoUrl; WAndH = wAndh ?? WAndH; #endregion if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } ApiUrl = string.Format("{0}?text={1}&logo={2}&w={3}", ApiUrl, HttpUtility.UrlEncode(Content), HttpUtility.UrlEncode(LogoUrl), WAndH); qrName = DownImg(ApiUrl, SaveQRPath); return qrName; }#endregion

使用面向對象+加載程序集創建對象合并以上接口封裝成二維碼生成工廠

首先,分析上面3個接口的參數可以看出,都需要固定的參數:接口api,內容(文本或跳轉http地址),Logo圖片地址(google暫時除外),寬度和高度等這幾個參數,這樣一來咋們可以定義個統一參數類,來傳遞該參數信息,這里還要提下由于這幾個接口都是從別人接口獲取圖片流,如果想要吧圖片在執行程序時候直接保存在我們的程序本地,都需要下載,所以又多一個參數: 保存二維碼的磁盤路徑,所以才有了一下公共的屬性:

#region 基礎配置信息 /// <summary> /// 接口地址(必填) /// </summary> protected string ApiUrl = "https://chart.googleapis.com/chart"; /// <summary> /// 展示內容(文本內容),google文本參數直接傳遞http地址直接重定向 /// </summary> protected string Content = "http://www.cnblogs.com/wangrudong003/"; /// <summary> /// 保存二維碼的磁盤路徑(默認程序跟目錄+QRCode) /// </summary> protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode"); /// <summary> /// Logo圖片地址(http://) /// </summary> protected string LogoUrl = "http://a.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg"; /// <summary> /// 寬度和高度(二維碼正方形的,高寬一至,默認200) /// </summary> protected int WAndH = 200;#endregion

然后,這里我不想每個接口都手動new一次來創建對象,所以用了加載程序集的模塊的方式來創建所需要的對象,因此有了工廠類的入口:

/// <summary> /// 二維碼生成工廠 /// </summary> public class QRCodeReposity { public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode) { var nspace = typeof(BaseQRCode); var fullName = nspace.FullName; var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1); return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode; } }

這里和之前的緩存工廠文章設計差不多,可以查閱下之前的分享篇,也多多點贊,謝謝;下面在給出說有的代碼如下:

/// <summary> /// 工廠模塊定義 /// </summary> public enum QREmType { /// <summary> /// google接口 /// </summary> BaseQRCode, /// <summary> /// 2d-code接口 /// </summary> QR_2dCode, /// <summary> /// topscan接口 /// </summary> QR_TopScan } /// <summary> /// 二維碼生成工廠 /// </summary> public class QRCodeReposity { public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode) { var nspace = typeof(BaseQRCode); var fullName = nspace.FullName; var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1); return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode; } } /// <summary> /// 基類使用Google提供Api:https://developers.google.com/chart/infographics/docs/qr_codes ,由于是國外地址,相對來說有點慢 /// </summary> public class BaseQRCode { #region 基礎配置信息 /// <summary> /// 接口地址(必填) /// </summary> protected string ApiUrl = "https://chart.googleapis.com/chart"; /// <summary> /// 展示內容(文本內容),google文本參數直接傳遞http地址直接重定向 /// </summary> protected string Content = "http://www.cnblogs.com/wangrudong003/"; /// <summary> /// 保存二維碼的磁盤路徑(默認程序跟目錄+QRCode) /// </summary> protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode"); /// <summary> /// Logo圖片地址(http://) /// </summary> protected string LogoUrl = "http://a.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg"; /// <summary> /// 寬度和高度(二維碼正方形的,高寬一至,默認200) /// </summary> protected int WAndH = 200; #endregion #region 方法 #region 生成二維碼 /// <summary> /// 生成二維碼 /// </summary> /// <param name="content">展示內容(文本內容 或者 掃描后的跳轉http://格式的地址)</param> /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> /// <param name="logoUrl"> Logo圖標地址(格式:http://),(注:google接口暫未研究出此參數)</param> /// <param name="apiUrl">接口地址(內置默認api地址)</param> /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> /// <returns></returns> public virtual string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) { var qrName = string.Empty; #region 參數初始化 ApiUrl = apiUrl ?? ApiUrl; Content = content ?? Content; SaveQRPath = savePath ?? SaveQRPath; LogoUrl = logoUrl ?? LogoUrl; WAndH = wAndh ?? WAndH; #endregion if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } ApiUrl = string.Format("{0}?cht=qr&chl={1}&chs={2}x{2}", ApiUrl, HttpUtility.UrlEncode(Content), WAndH); qrName = DownImg(ApiUrl, SaveQRPath, ImageFormat.Jpeg); return qrName; } #endregion #region 下載圖片 /// <summary> /// 下載圖片 /// </summary> /// <param name="url">圖片下載地址</param> /// <param name="savePath">保存路徑默認:Img文件夾</param> /// <param name="format">默認:Jpeg</param> /// <returns>新圖片名稱</returns> public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null) { var qrName = string.Empty; try { format = format ?? ImageFormat.Jpeg; HttpClient http = new HttpClient(); http.Timeout = new TimeSpan(0, 1, 0); using (var stream = http.GetStreamAsync(url).Result) { if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); } qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format; var path = Path.Combine(savePath, qrName); using (Image img = Image.FromStream(stream)) { img.Save(path, format); } } } catch (Exception ex) { qrName = string.Empty; } return qrName; } #endregion #endregion } /// <summary> /// 使用2d-code提供Api,需要去官網注冊獲取Key /// </summary> public class QR_2dCode : BaseQRCode { public QR_2dCode() { ApiUrl = "http://www.2d-code.cn/2dcode/api.php"; } #region 生成二維碼 /// <summary> /// 生成二維碼 /// </summary> /// <param name="content">展示內容(文本內容 或者 掃描后的跳轉http://格式的地址)</param> /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> /// <param name="logoUrl"> Logo圖標地址(格式:http://),官方不建議使用png格式,測試只有jpg成功</param> /// <param name="directUrl">掃描后重定向地址(http://)</param> /// <param name="apiUrl">接口地址(內置默認api地址)</param> /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> /// <returns></returns> public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) { var qrName = string.Empty; #region 參數初始化 ApiUrl = apiUrl ?? ApiUrl; Content = content ?? Content; SaveQRPath = savePath ?? SaveQRPath; LogoUrl = logoUrl ?? LogoUrl; WAndH = wAndh ?? WAndH; #endregion if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } ApiUrl = string.Format("{0}?key=c_d800OBbu6hDzJtXPE2Yd02IMtmpuK9VdCqHe6vrtar4&text={1}&url={2}&logo={3}&size={4}", ApiUrl, HttpUtility.UrlEncode(Content.Contains("http") ? "" : Content), HttpUtility.UrlEncode(Content), HttpUtility.UrlEncode(LogoUrl), WAndH); qrName = DownImg(ApiUrl, SaveQRPath); return qrName; } #endregion } /// <summary> /// 使用topscan提供Api /// </summary> public class QR_TopScan : BaseQRCode { public QR_TopScan() { ApiUrl = "http://qr.topscan.com/api.php"; } #region 生成二維碼 /// <summary> /// 生成二維碼 /// </summary> /// <param name="content">展示內容(文本內容 或者 掃描后的跳轉http://格式的地址)</param> /// <param name="savePath">保存二維碼的磁盤路徑(默認程序跟目錄+QRCode)</param> /// <param name="logoUrl"> Logo圖標地址(格式:http://),jpg,png測試通過,測試得出有不能成功的,原因不知是否和地址有關</param> /// <param name="apiUrl">接口地址(內置默認api地址)</param> /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默認200)</param> /// <returns></returns> public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null) { var qrName = string.Empty; #region 參數初始化 ApiUrl = apiUrl ?? ApiUrl; Content = content ?? Content; SaveQRPath = savePath ?? SaveQRPath; LogoUrl = logoUrl ?? LogoUrl; WAndH = wAndh ?? WAndH; #endregion if (string.IsNullOrEmpty(ApiUrl)) { return qrName; } ApiUrl = string.Format("{0}?text={1}&logo={2}&w={3}", ApiUrl, HttpUtility.UrlEncode(Content), HttpUtility.UrlEncode(LogoUrl), WAndH); qrName = DownImg(ApiUrl, SaveQRPath); return qrName; } #endregion }

本篇的分享內容在程序設計方面沒有太多,重點是分裝下這幾個接口和分享下接口的差異,方面朋友們可以拿來主義和正在對接二維碼生成的朋友做下交流,僅此而已;關鍵代碼的備注都在分享代碼里,有更好或者不清楚的地方歡迎留言,謝謝。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91午夜在线播放| 亚洲精品久久久久久下一站| 狠狠躁天天躁日日躁欧美| 国产偷国产偷亚洲清高网站| 国产精品久久久久国产a级| 亚洲一区二区三区乱码aⅴ| 日韩在线高清视频| 亚洲香蕉成人av网站在线观看| 免费91在线视频| 日韩欧美在线国产| 国内成人精品一区| www.久久色.com| 久久久久久久久电影| 欧美尺度大的性做爰视频| 欧美性猛交丰臀xxxxx网站| 久久精品91久久久久久再现| 亚洲欧美在线一区二区| 日韩欧美中文在线| 疯狂蹂躏欧美一区二区精品| 动漫精品一区二区| 亚洲精品乱码久久久久久金桔影视| 亚洲精品v天堂中文字幕| 国产精品久久中文| 青青草99啪国产免费| 亚洲性av网站| 日本一区二区三区在线播放| 亚洲aⅴ日韩av电影在线观看| 正在播放欧美一区| 中文字幕日韩视频| 久久亚洲精品中文字幕冲田杏梨| 日韩中文视频免费在线观看| 日韩在线观看视频免费| 久99九色视频在线观看| 久久精品福利视频| 久久久久久久影视| 成人免费淫片aa视频免费| 国产精品日韩电影| 欧美亚洲午夜视频在线观看| 国产精品久久视频| 亚洲午夜精品久久久久久性色| 欧美午夜精品久久久久久久| 欧美精品九九久久| 日本精品免费一区二区三区| 国产精品久久国产精品99gif| 日韩有码片在线观看| 亚洲欧美日韩高清| 日韩久久午夜影院| 欧美性猛交xxxx黑人猛交| 精品久久久久久久久久ntr影视| 成人黄色在线播放| 九九精品视频在线观看| 亚洲成人精品在线| 亚洲国产中文字幕久久网| 午夜精品一区二区三区视频免费看| 国产91|九色| 国产噜噜噜噜噜久久久久久久久| 国产精品成人av在线| 久久国产精品影片| 久久精品国产电影| 欧洲一区二区视频| 性色av一区二区三区红粉影视| 777精品视频| 日本精品一区二区三区在线| 日韩a**中文字幕| 91超碰caoporn97人人| 久久人91精品久久久久久不卡| 日本国产一区二区三区| 亚洲精品欧美极品| 国产91成人video| 亚洲欧美激情在线视频| 欧美理论电影网| 奇米一区二区三区四区久久| 亚洲精品国产欧美| 国产欧美日韩中文字幕| 亚洲电影免费观看高清完整版在线观看| 亚洲成人中文字幕| 国产精品自产拍在线观看中文| 亚洲精品美女在线| 国产精品午夜视频| 日韩精品视频三区| 神马久久桃色视频| 日韩欧美亚洲一二三区| 国产丝袜一区视频在线观看| 亚洲情综合五月天| 欧美做受高潮电影o| 亚洲人成在线电影| 97精品一区二区视频在线观看| 欧美日韩一区二区免费在线观看| 欧美国产日韩精品| 亚洲精品有码在线| 亚洲精品国产精品久久清纯直播| 91精品国产成人www| 亚洲精品日韩欧美| 欧美一级大片在线免费观看| 日韩成人中文字幕| 欧美在线视频a| 都市激情亚洲色图| 欧美在线一区二区三区四| 精品久久久久久久久久ntr影视| 精品夜色国产国偷在线| 在线精品高清中文字幕| 欧美色欧美亚洲高清在线视频| 色偷偷综合社区| 日韩av手机在线| 欧美老女人性生活| 成人欧美在线视频| 国产色视频一区| 国产日韩欧美视频在线| 亚洲天堂av网| 国产91精品久久久久久久| 中文字幕久热精品视频在线| 亚洲一区二区久久久久久| www亚洲精品| 在线丨暗呦小u女国产精品| 欧美激情在线一区| 亚洲自拍偷拍第一页| 国产精品直播网红| 国产精品亚洲精品| 国产亚洲精品久久| 国内偷自视频区视频综合| 亚洲一区二区三区在线免费观看| 国产精品美女www爽爽爽视频| 国产啪精品视频| 日韩影视在线观看| 亚洲精品色婷婷福利天堂| 欧美性猛交xxxx富婆| 这里只有精品在线观看| 亚洲男人天堂古典| 欧美华人在线视频| 在线免费观看羞羞视频一区二区| 国产91精品青草社区| 亚洲人成网站999久久久综合| 国产精品日韩一区| 亚洲娇小xxxx欧美娇小| 欧美成aaa人片在线观看蜜臀| 国产精品成人观看视频国产奇米| 亚洲国产古装精品网站| 日韩av123| 操日韩av在线电影| 91亚洲精品久久久| 456亚洲影院| 在线观看久久久久久| 在线观看国产精品91| 亚洲国产日韩欧美在线动漫| 国产精品美女久久久久久免费| 欧美日本啪啪无遮挡网站| 欧美国产日产韩国视频| 亚州欧美日韩中文视频| 精品女厕一区二区三区| 国产精品久久久久久久app| 亚洲国产精品久久久久久| 亚洲自拍偷拍在线| 亚洲国产精品成人一区二区| 91日韩在线视频| 国内精品视频久久| 欧美午夜www高清视频| 亚洲自拍偷拍在线| 国产在线日韩在线| 久久国产精品久久久久久久久久| 久久久国产一区二区三区| 人九九综合九九宗合| 日本免费一区二区三区视频观看| 日韩精品极品毛片系列视频| 欧美在线免费观看|