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

首頁 > 開發 > Java > 正文

selenium+java破解極驗滑動驗證碼的示例代碼

2024-07-13 10:16:00
字體:
來源:轉載
供稿:網友

摘要

分析驗證碼素材圖片混淆原理,并采用java/191964.html">selenium模擬人拖動滑塊過程,進而破解驗證碼。

人工驗證的過程

1、打開威鋒網注冊頁面

2、移動鼠標至小滑塊,一張完整的圖片會出現(如下圖1)

selenium,java滑動驗證碼,滑動驗證碼,java,驗證碼

3、點擊鼠標左鍵,圖片中間會出現一個缺塊(如下圖2)

selenium,java滑動驗證碼,滑動驗證碼,java,驗證碼

4、移動小滑塊正上方圖案至缺塊處

5、驗證通過

selenium模擬驗證的過程

  1. 加載威鋒網注冊頁面
  2. 下載圖片1和缺塊圖片2
  3. 根據兩張圖片的差異計算平移的距離x
  4. 模擬鼠標點擊事件,點擊小滑塊向右移動x
  5. 驗證通過
  6. 詳細分析

1、打開chrome瀏覽器控制臺,會發現圖1所示的驗證碼圖片并不是極驗后臺返回的原圖。而是由多個div拼接而成(如下圖3)

selenium,java滑動驗證碼,滑動驗證碼,java,驗證碼

通過圖片顯示div的style屬性可知,極驗后臺把圖片進行切割加錯位處理。把素材圖片切割成10 * 58大小的52張小圖,再進行錯位處理。在網頁上顯示的時候,再通過css的background-position屬性對圖片進行還原。以上的圖1和圖2都是經過了這種處理。在這種情況下,使用selenium模擬驗證是需要對下載的驗證碼圖片進行還原。如上圖3的第一個div.gt_cut_fullbg_slice標簽,它的大小為10px * 58px,其中style屬性為background-image: url("http://static.geetest.com/pictures/gt/969ffa43c/969ffa43c.webp"); background-position: -157px -58px;會把該屬性對應url的圖片進行一個平移操作,以左上角為參考,向左平移157px,向上平移58px,圖片超出部分不會顯示。所以上圖1所示圖片是由26 * 2個10px * 58px大小的div組成(如下圖4)。每一個小方塊的大小58 * 10

selenium,java滑動驗證碼,滑動驗證碼,java,驗證碼

2、下載圖片并還原,上一步驟分析了圖片具體的混淆邏輯,具體還原圖片的代碼實現如下,主要邏輯是把原圖裁剪為52張小圖,然后拼接成一張完整的圖。

/** *還原圖片 * @param type */private static void restoreImage(String type) throws IOException {  //把圖片裁剪為2 * 26份  for(int i = 0; i < 52; i++){    cutPic(basePath + type +".jpg"        ,basePath + "result/" + type + i + ".jpg", -moveArray[i][0], -moveArray[i][1], 10, 58);  }  //拼接圖片  String[] b = new String[26];  for(int i = 0; i < 26; i++){    b[i] = String.format(basePath + "result/" + type + "%d.jpg", i);  }  mergeImage(b, 1, basePath + "result/" + type + "result1.jpg");  //拼接圖片  String[] c = new String[26];  for(int i = 0; i < 26; i++){    c[i] = String.format(basePath + "result/" + type + "%d.jpg", i + 26);  }  mergeImage(c, 1, basePath + "result/" + type + "result2.jpg");  mergeImage(new String[]{basePath + "result/" + type + "result1.jpg",      basePath + "result/" + type + "result2.jpg"}, 2, basePath + "result/" + type + "result3.jpg");  //刪除產生的中間圖片  for(int i = 0; i < 52; i++){    new File(basePath + "result/" + type + i + ".jpg").deleteOnExit();  }  new File(basePath + "result/" + type + "result1.jpg").deleteOnExit();  new File(basePath + "result/" + type + "result2.jpg").deleteOnExit();}

還原過程需要注意的是,后臺返回錯位的圖片是312 * 116大小的。而網頁上圖片div的大小是260 * 116。

3、計算平移距離,遍歷圖片的每一個像素點,當兩張圖的R、G、B之差的和大于255,說明該點的差異過大,很有可能就是需要平移到該位置的那個點,代碼如下。

BufferedImage fullBI = ImageIO.read(new File(basePath + "result/" + FULL_IMAGE_NAME + "result3.jpg"));  BufferedImage bgBI = ImageIO.read(new File(basePath + "result/" + BG_IMAGE_NAME + "result3.jpg"));  for (int i = 0; i < bgBI.getWidth(); i++){    for (int j = 0; j < bgBI.getHeight(); j++) {      int[] fullRgb = new int[3];      fullRgb[0] = (fullBI.getRGB(i, j) & 0xff0000) >> 16;      fullRgb[1] = (fullBI.getRGB(i, j) & 0xff00) >> 8;      fullRgb[2] = (fullBI.getRGB(i, j) & 0xff);      int[] bgRgb = new int[3];      bgRgb[0] = (bgBI.getRGB(i, j) & 0xff0000) >> 16;      bgRgb[1] = (bgBI.getRGB(i, j) & 0xff00) >> 8;      bgRgb[2] = (bgBI.getRGB(i, j) & 0xff);      if(difference(fullRgb, bgRgb) > 255){        return i;      }    }  }

4、模擬鼠標移動事件,這一步驟是最關鍵的步驟,極驗驗證碼后臺正是通過移動滑塊的軌跡來判斷是否為機器所為。整個移動軌跡的過程越隨機越好,我這里提供一種成功率較高的移動算法,代碼如下。

  public static void move(WebDriver driver, WebElement element, int distance) throws InterruptedException {    int xDis = distance + 11;    System.out.println("應平移距離:" + xDis);    int moveX = new Random().nextInt(8) - 5;    int moveY = 1;    Actions actions = new Actions(driver);    new Actions(driver).clickAndHold(element).perform();    Thread.sleep(200);    printLocation(element);    actions.moveToElement(element, moveX, moveY).perform();    System.out.println(moveX + "--" + moveY);    printLocation(element);    for (int i = 0; i < 22; i++){      int s = 10;      if (i % 2 == 0){        s = -10;      }      actions.moveToElement(element, s, 1).perform();      printLocation(element);      Thread.sleep(new Random().nextInt(100) + 150);    }    System.out.println(xDis + "--" + 1);    actions.moveByOffset(xDis, 1).perform();    printLocation(element);    Thread.sleep(200);    actions.release(element).perform();  }

完整代碼如下

package com.github.wycm;import org.apache.commons.io.FileUtils;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import org.openqa.selenium.By;import org.openqa.selenium.Point;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.interactions.Actions;import org.openqa.selenium.support.ui.ExpectedCondition;import org.openqa.selenium.support.ui.WebDriverWait;import javax.imageio.ImageIO;import javax.imageio.ImageReadParam;import javax.imageio.ImageReader;import javax.imageio.stream.ImageInputStream;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.net.URL;import java.util.Iterator;import java.util.Random;import java.util.regex.Matcher;import java.util.regex.Pattern;public class GeettestCrawler {  private static String basePath = "src/main/resources/";  private static String FULL_IMAGE_NAME = "full-image";  private static String BG_IMAGE_NAME = "bg-image";  private static int[][] moveArray = new int[52][2];  private static boolean moveArrayInit = false;  private static String INDEX_URL = "https://passport.feng.com/?r=user/register";  private static WebDriver driver;  static {    System.setProperty("webdriver.chrome.driver", "D:/dev/selenium/chromedriver_V2.30/chromedriver_win32/chromedriver.exe");    if (!System.getProperty("os.name").toLowerCase().contains("windows")){      System.setProperty("webdriver.chrome.driver", "/Users/wangyang/workspace/selenium/chromedriver_V2.30/chromedriver");    }    driver = new ChromeDriver();  }  public static void main(String[] args) throws InterruptedException {    for (int i = 0; i < 10; i++){      try {        invoke();      } catch (IOException e) {        e.printStackTrace();      } catch (InterruptedException e) {        e.printStackTrace();      }    }    driver.quit();  }  private static void invoke() throws IOException, InterruptedException {    //設置input參數    driver.get(INDEX_URL);    //通過[class=gt_slider_knob gt_show]    By moveBtn = By.cssSelector(".gt_slider_knob.gt_show");    waitForLoad(driver, moveBtn);    WebElement moveElemet = driver.findElement(moveBtn);    int i = 0;    while (i++ < 15){      int distance = getMoveDistance(driver);      move(driver, moveElemet, distance - 6);      By gtTypeBy = By.cssSelector(".gt_info_type");      By gtInfoBy = By.cssSelector(".gt_info_content");      waitForLoad(driver, gtTypeBy);      waitForLoad(driver, gtInfoBy);      String gtType = driver.findElement(gtTypeBy).getText();      String gtInfo = driver.findElement(gtInfoBy).getText();      System.out.println(gtType + "---" + gtInfo);      /**       * 再來一次:       * 驗證失?。?      */      if(!gtType.equals("再來一次:") && !gtType.equals("驗證失敗:")){        Thread.sleep(4000);        System.out.println(driver);        break;      }      Thread.sleep(4000);    }  }  /**   * 移動   * @param driver   * @param element   * @param distance   * @throws InterruptedException   */  public static void move(WebDriver driver, WebElement element, int distance) throws InterruptedException {    int xDis = distance + 11;    System.out.println("應平移距離:" + xDis);    int moveX = new Random().nextInt(8) - 5;    int moveY = 1;    Actions actions = new Actions(driver);    new Actions(driver).clickAndHold(element).perform();    Thread.sleep(200);    printLocation(element);    actions.moveToElement(element, moveX, moveY).perform();    System.out.println(moveX + "--" + moveY);    printLocation(element);    for (int i = 0; i < 22; i++){      int s = 10;      if (i % 2 == 0){        s = -10;      }      actions.moveToElement(element, s, 1).perform();//      printLocation(element);      Thread.sleep(new Random().nextInt(100) + 150);    }    System.out.println(xDis + "--" + 1);    actions.moveByOffset(xDis, 1).perform();    printLocation(element);    Thread.sleep(200);    actions.release(element).perform();  }  private static void printLocation(WebElement element){    Point point = element.getLocation();    System.out.println(point.toString());  }  /**   * 等待元素加載,10s超時   * @param driver   * @param by   */  public static void waitForLoad(final WebDriver driver, final By by){    new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>() {      public Boolean apply(WebDriver d) {        WebElement element = driver.findElement(by);        if (element != null){          return true;        }        return false;      }    });  }  /**   * 計算需要平移的距離   * @param driver   * @return   * @throws IOException   */  public static int getMoveDistance(WebDriver driver) throws IOException {    String pageSource = driver.getPageSource();    String fullImageUrl = getFullImageUrl(pageSource);    FileUtils.copyURLToFile(new URL(fullImageUrl), new File(basePath + FULL_IMAGE_NAME + ".jpg"));    String getBgImageUrl = getBgImageUrl(pageSource);    FileUtils.copyURLToFile(new URL(getBgImageUrl), new File(basePath + BG_IMAGE_NAME + ".jpg"));    initMoveArray(driver);    restoreImage(FULL_IMAGE_NAME);    restoreImage(BG_IMAGE_NAME);    BufferedImage fullBI = ImageIO.read(new File(basePath + "result/" + FULL_IMAGE_NAME + "result3.jpg"));    BufferedImage bgBI = ImageIO.read(new File(basePath + "result/" + BG_IMAGE_NAME + "result3.jpg"));    for (int i = 0; i < bgBI.getWidth(); i++){      for (int j = 0; j < bgBI.getHeight(); j++) {        int[] fullRgb = new int[3];        fullRgb[0] = (fullBI.getRGB(i, j) & 0xff0000) >> 16;        fullRgb[1] = (fullBI.getRGB(i, j) & 0xff00) >> 8;        fullRgb[2] = (fullBI.getRGB(i, j) & 0xff);        int[] bgRgb = new int[3];        bgRgb[0] = (bgBI.getRGB(i, j) & 0xff0000) >> 16;        bgRgb[1] = (bgBI.getRGB(i, j) & 0xff00) >> 8;        bgRgb[2] = (bgBI.getRGB(i, j) & 0xff);        if(difference(fullRgb, bgRgb) > 255){          return i;        }      }    }    throw new RuntimeException("未找到需要平移的位置");  }  private static int difference(int[] a, int[] b){    return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]) + Math.abs(a[2] - b[2]);  }  /**   * 獲取move數組   * @param driver   */  private static void initMoveArray(WebDriver driver){    if (moveArrayInit){      return;    }    Document document = Jsoup.parse(driver.getPageSource());    Elements elements = document.select("[class=gt_cut_bg gt_show]").first().children();    int i = 0;    for(Element element : elements){      Pattern pattern = Pattern.compile(".*background-position: (.*?)px (.*?)px.*");      Matcher matcher = pattern.matcher(element.toString());      if (matcher.find()){        String width = matcher.group(1);        String height = matcher.group(2);        moveArray[i][0] = Integer.parseInt(width);        moveArray[i++][1] = Integer.parseInt(height);      } else {        throw new RuntimeException("解析異常");      }    }    moveArrayInit = true;  }  /**   *還原圖片   * @param type   */  private static void restoreImage(String type) throws IOException {    //把圖片裁剪為2 * 26份    for(int i = 0; i < 52; i++){      cutPic(basePath + type +".jpg"          ,basePath + "result/" + type + i + ".jpg", -moveArray[i][0], -moveArray[i][1], 10, 58);    }    //拼接圖片    String[] b = new String[26];    for(int i = 0; i < 26; i++){      b[i] = String.format(basePath + "result/" + type + "%d.jpg", i);    }    mergeImage(b, 1, basePath + "result/" + type + "result1.jpg");    //拼接圖片    String[] c = new String[26];    for(int i = 0; i < 26; i++){      c[i] = String.format(basePath + "result/" + type + "%d.jpg", i + 26);    }    mergeImage(c, 1, basePath + "result/" + type + "result2.jpg");    mergeImage(new String[]{basePath + "result/" + type + "result1.jpg",        basePath + "result/" + type + "result2.jpg"}, 2, basePath + "result/" + type + "result3.jpg");    //刪除產生的中間圖片    for(int i = 0; i < 52; i++){      new File(basePath + "result/" + type + i + ".jpg").deleteOnExit();    }    new File(basePath + "result/" + type + "result1.jpg").deleteOnExit();    new File(basePath + "result/" + type + "result2.jpg").deleteOnExit();  }  /**   * 獲取原始圖url   * @param pageSource   * @return   */  private static String getFullImageUrl(String pageSource){    String url = null;    Document document = Jsoup.parse(pageSource);    String style = document.select("[class=gt_cut_fullbg_slice]").first().attr("style");    Pattern pattern = Pattern.compile("url//(/"(.*)/"//)");    Matcher matcher = pattern.matcher(style);    if (matcher.find()){      url = matcher.group(1);    }    url = url.replace(".webp", ".jpg");    System.out.println(url);    return url;  }  /**   * 獲取帶背景的url   * @param pageSource   * @return   */  private static String getBgImageUrl(String pageSource){    String url = null;    Document document = Jsoup.parse(pageSource);    String style = document.select(".gt_cut_bg_slice").first().attr("style");    Pattern pattern = Pattern.compile("url//(/"(.*)/"//)");    Matcher matcher = pattern.matcher(style);    if (matcher.find()){      url = matcher.group(1);    }    url = url.replace(".webp", ".jpg");    System.out.println(url);    return url;  }  public static boolean cutPic(String srcFile, String outFile, int x, int y,                 int width, int height) {    FileInputStream is = null;    ImageInputStream iis = null;    try {      if (!new File(srcFile).exists()) {        return false;      }      is = new FileInputStream(srcFile);      String ext = srcFile.substring(srcFile.lastIndexOf(".") + 1);      Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName(ext);      ImageReader reader = it.next();      iis = ImageIO.createImageInputStream(is);      reader.setInput(iis, true);      ImageReadParam param = reader.getDefaultReadParam();      Rectangle rect = new Rectangle(x, y, width, height);      param.setSourceRegion(rect);      BufferedImage bi = reader.read(0, param);      File tempOutFile = new File(outFile);      if (!tempOutFile.exists()) {        tempOutFile.mkdirs();      }      ImageIO.write(bi, ext, new File(outFile));      return true;    } catch (Exception e) {      e.printStackTrace();      return false;    } finally {      try {        if (is != null) {          is.close();        }        if (iis != null) {          iis.close();        }      } catch (IOException e) {        e.printStackTrace();        return false;      }    }  }  /**   * 圖片拼接 (注意:必須兩張圖片長寬一致哦)   * @param files 要拼接的文件列表   * @param type 1橫向拼接,2 縱向拼接   * @param targetFile 輸出文件   */  private static void mergeImage(String[] files, int type, String targetFile) {    int length = files.length;    File[] src = new File[length];    BufferedImage[] images = new BufferedImage[length];    int[][] ImageArrays = new int[length][];    for (int i = 0; i < length; i++) {      try {        src[i] = new File(files[i]);        images[i] = ImageIO.read(src[i]);      } catch (Exception e) {        throw new RuntimeException(e);      }      int width = images[i].getWidth();      int height = images[i].getHeight();      ImageArrays[i] = new int[width * height];      ImageArrays[i] = images[i].getRGB(0, 0, width, height, ImageArrays[i], 0, width);    }    int newHeight = 0;    int newWidth = 0;    for (int i = 0; i < images.length; i++) {      // 橫向      if (type == 1) {        newHeight = newHeight > images[i].getHeight() ? newHeight : images[i].getHeight();        newWidth += images[i].getWidth();      } else if (type == 2) {// 縱向        newWidth = newWidth > images[i].getWidth() ? newWidth : images[i].getWidth();        newHeight += images[i].getHeight();      }    }    if (type == 1 && newWidth < 1) {      return;    }    if (type == 2 && newHeight < 1) {      return;    }    // 生成新圖片    try {      BufferedImage ImageNew = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);      int height_i = 0;      int width_i = 0;      for (int i = 0; i < images.length; i++) {        if (type == 1) {          ImageNew.setRGB(width_i, 0, images[i].getWidth(), newHeight, ImageArrays[i], 0,              images[i].getWidth());          width_i += images[i].getWidth();        } else if (type == 2) {          ImageNew.setRGB(0, height_i, newWidth, images[i].getHeight(), ImageArrays[i], 0, newWidth);          height_i += images[i].getHeight();        }      }      //輸出想要的圖片      ImageIO.write(ImageNew, targetFile.split("//.")[1], new File(targetFile));    } catch (Exception e) {      throw new RuntimeException(e);    }  }}

pom文件依賴如下

  <dependency>   <groupId>org.seleniumhq.selenium</groupId>   <artifactId>selenium-server</artifactId>   <version>3.0.1</version>  </dependency>  <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->  <dependency>   <groupId>org.jsoup</groupId>   <artifactId>jsoup</artifactId>   <version>1.7.2</version>  </dependency>

最后

完整代碼已上傳至github,地址:https://github.com/wycm/selenium-geetest-crack

附上一張滑動效果圖

selenium,java滑動驗證碼,滑動驗證碼,java,驗證碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩性视频在线| 欧美日韩国产综合视频在线观看中文| 欧美主播福利视频| 在线观看欧美视频| 国产区精品在线观看| 欧美大片免费观看在线观看网站推荐| 欧美午夜激情在线| 韩国视频理论视频久久| 中文字幕视频在线免费欧美日韩综合在线看| 久久精品人人做人人爽| 日本精品一区二区三区在线播放视频| 在线一区二区日韩| 亚洲人午夜色婷婷| 亚洲黄色片网站| 亚洲三级av在线| 麻豆乱码国产一区二区三区| 日韩电影中文字幕在线观看| 欧美视频国产精品| 国产精品自拍网| 亚洲国产精品大全| 全色精品综合影院| 亚洲丝袜一区在线| 91免费人成网站在线观看18| 91久久久久久国产精品| www.色综合| 成人欧美一区二区三区在线| 亚洲综合中文字幕在线观看| 久久精品精品电影网| 国产国语刺激对白av不卡| 亚洲少妇中文在线| 亚洲精品电影在线| 日本最新高清不卡中文字幕| 日韩在线播放一区| 亚洲午夜久久久影院| 亚洲成年人影院在线| 亚洲激情视频网| 日韩电影免费观看在线| 亚洲精品美女久久久久| 国内偷自视频区视频综合| 伦理中文字幕亚洲| 日韩不卡中文字幕| 欧美午夜女人视频在线| 欧美另类极品videosbestfree| 国产成人激情小视频| xvideos成人免费中文版| 国产小视频国产精品| 国产精品三级久久久久久电影| 亚洲激情国产精品| 91av国产在线| 91po在线观看91精品国产性色| 国产一区二区三区直播精品电影| 中文字幕亚洲专区| 国产mv免费观看入口亚洲| 日韩欧美在线视频观看| 日韩影视在线观看| 最新日韩中文字幕| 国外成人免费在线播放| 亚洲影视九九影院在线观看| 午夜精品久久久久久久久久久久久| 国产在线观看精品一区二区三区| 欧美激情国产高清| 中文字幕av一区中文字幕天堂| 午夜欧美不卡精品aaaaa| 午夜精品一区二区三区在线| 国产精品一区二区久久国产| 日韩视频在线观看免费| 6080yy精品一区二区三区| 国产精品1234| 午夜精品一区二区三区在线| 欧美一级高清免费播放| 一本色道久久综合亚洲精品小说| 在线观看日韩www视频免费| 日韩中文字幕网址| 98精品国产自产在线观看| 92国产精品视频| 欧美精品免费播放| 色哟哟亚洲精品一区二区| 亚洲精品第一国产综合精品| 国产亚洲免费的视频看| 精品亚洲国产成av人片传媒| 国产乱肥老妇国产一区二| 国产成人综合一区二区三区| 国产99视频在线观看| 欧美亚洲激情在线| 国内外成人免费激情在线视频网站| 亚洲人成电影网站色| 色偷偷噜噜噜亚洲男人的天堂| 精品国产一区二区三区久久久狼| 国产精品久久久久久久久久| 亚洲最大成人网色| 国产精品国产三级国产aⅴ9色| 日韩欧美精品免费在线| 日韩av在线网站| 亚洲人成网站777色婷婷| 日韩电影中文字幕| 91人人爽人人爽人人精88v| 日韩美女视频中文字幕| 色妞色视频一区二区三区四区| 美女999久久久精品视频| 亚洲aⅴ男人的天堂在线观看| 日韩亚洲精品电影| 国产+成+人+亚洲欧洲| 丝袜亚洲欧美日韩综合| 欧美亚洲成人免费| 欧美久久精品午夜青青大伊人| 亚洲xxxxx电影| 亚洲xxxx在线| 91精品在线一区| 97免费视频在线| 91久久精品在线| 亚洲精品99久久久久中文字幕| 欧美肥老妇视频| 一区二区三区天堂av| 亚洲激情国产精品| 在线观看精品自拍私拍| 欧美性xxxxxxx| 亚洲精品国产欧美| 日本精品久久电影| 色噜噜狠狠狠综合曰曰曰| 国产精品一区二区久久| 亚洲乱码国产乱码精品精| 欧美猛交免费看| 中国人与牲禽动交精品| 亚洲国产精品女人久久久| 亚洲精品美女久久久| 国产精品久久久久久久久借妻| 亚洲成人网在线观看| 中文字幕在线日韩| 国产欧美日韩中文字幕在线| 97精品欧美一区二区三区| 国内精品久久久久久影视8| 日韩精品极品在线观看| 国产一区二区三区在线观看视频| 黑人精品xxx一区| 88国产精品欧美一区二区三区| 91精品国产综合久久香蕉的用户体验| 高清欧美性猛交xxxx黑人猛交| 久久精品夜夜夜夜夜久久| 国产精品v日韩精品| 日韩av手机在线看| 亚洲精品中文字| 日韩亚洲欧美中文高清在线| 欧美日韩国产在线看| 国产这里只有精品| 蜜臀久久99精品久久久久久宅男| 国产精品爱啪在线线免费观看| 国产精品一区二区女厕厕| www.美女亚洲精品| 亚洲天天在线日亚洲洲精| 国产噜噜噜噜噜久久久久久久久| 久久亚洲国产成人| 成人性生交xxxxx网站| 北条麻妃一区二区三区中文字幕| 久久99热这里只有精品国产| 在线观看精品国产视频| 国产精品扒开腿做爽爽爽的视频| 97热精品视频官网| 国产噜噜噜噜噜久久久久久久久| 亚洲一区二区精品| 亚洲欧洲国产精品| 日本19禁啪啪免费观看www| 深夜福利日韩在线看| 国产在线播放91| 中文字幕av一区中文字幕天堂|