精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我發現了大廠OpenApi接口的bug!你發現了嗎?

開發 項目管理
在與火山云旗下云游戲產品的 OpenApi 接口對接過程中,我總共踩了三個坑。一是文檔版本不是最新,二是官方提供的 OpenApi 示例 demo 過于簡單,三是官方提供的驗簽代碼沒有考慮到 POST JSON 請求場景下的 contentType 設置問題。

本文記錄我在對接字節旗下產品火山云游戲OpenApi 接口文檔時遇到的坑,希望能幫助大家(火山云旗下云游戲產品的文檔坑很多,我算是從零到一都踩了一遍,特此記錄,希望大家引以為鑒)。

1. 文檔問題

很經典的開局一張圖,對接全靠問。

產品給的圖產品給的圖

這里給大家強調下,當要跟第三方產品對接時,一定要確認拿到的文檔是不是最新版本。

比如我在這次對接中,第一次拿到的文檔是產品給的,在業務中需要用到一個用戶主動退出游戲的接口,于是我在第一份文檔里面找到一個用戶退出游戲的接口 RomoveUser。

RemoveUserRemoveUser

但是當我在控制臺調用此接口報錯后,去群里一問才發現,對方建議我使用官網公布的最新接口文檔。

官網最新文檔:https://www.volcengine.com/docs/6512/143674

進入官網發現 RemoveUser 這個接口已經是歷史接口了,官方建議換到 BanRoomUser 接口。

BanRoomUserBanRoomUser

OK,這里算是踩到了第一個坑,文檔版本不是最新。

ps:還要說一下,火山云旗下云游戲的這個 OpenApi 接口文檔需要在群里聯系他們開白才能看到,說實話給我的感覺很奇怪,懷疑產品是否有趕鴨子上架問題,暫且懷疑他們的目的是防止不明攻擊吧。

2. OpenApi 示例 demo

第三方接口的接入一般都需要做鑒權。火山云旗下云游戲產品的 OpenApi 接口接入當然也不例外。于是我開始了第二個踩坑之旅,那就是他們給出的 OpenApi 示例 demo 的使用過于簡單。

圖片圖片

火山云旗下云游戲產品的 OpenApi 示例 demo 寫的很簡單,只提供了一個 GET 請求示例。

OpenApi 示例 demo 地址:https://github.com/volcengine/veGame

但是在我司的業務場景還是上個問題,需要一個用戶主動退出游戲的接口,在火山云官網的 OpenApi 文檔中我也找到了這個接口,就是上文提到的 BanRoomUser 接口。

但是在官方文檔中 BanRoomUser 接口是一個 POST JSON 格式的請求。官方給出的 OpenApi 示例 demo 中并沒有關于 POST JSON 請求的示例代碼,所以只能靠我一個人查看他們提供的 SDK 依賴源碼硬猜來寫...,這就很讓人頭痛了。

好在我翻閱他們 SDK 源碼中找到一個靠譜的 json(...) 請求方法,來完成這個 POST JSON 請求。

圖片圖片

OK,說干就干,直接寫好示例代碼,開始發送 POST JSON 請求。

錯誤返回錯誤返回

what f**k?什么鬼,返回了我一個 null,此時我的內心中充滿了一個大大的問號。

我開始懷疑我的代碼是不是寫錯了。但是當我經歷過數次源碼 debug 以及調用其他 OpenApi 接口測試并得到正確返回后,我堅定的認為我沒錯,這就是火山云 OpenApi 的 bug!

正常返回正常返回

OK,說干就干,直接反饋給火山那邊。

接著火山那邊的人就聯系說下午兩點開會一起遠程共享我的屏幕看看,OK 欣然接收,讓他們見證下他們寫的 bug!

...

時間來到下午兩點,當我共享屏幕給字節工程師演示這個 bug 時,我的控制臺打印如下:

圖片圖片

woca,竟然不是 null!好在我腦袋靈活,思路清晰,瞬間想到我改了一個參數 GameId,之前返回 null 時,我傳的 GameId 是一個假數據,現在我傳的是一個真數據。造成了返回不一致。

OK,找到了返回正常的原因,當我把 GameId 改成假數據時,如我所愿,返回了一個 null。

圖片圖片

自此,我也就在字節工程師的圍觀下,復現了他們的 OpenApi 接口的線上 bug。大功告成。

3. 鑒權失敗

字節提供的 OpenApi 示例 demo 現在算是跑通了,但是由于我司項目一些依賴限制問題,我們不能直接引入火山云旗下云游戲產品的 SDK 依賴。所以我還得手動編寫生成簽名的代碼。于是我開始了第三個踩坑之旅,那就是 GET 請求驗簽成功 POST 請求驗簽失敗的問題。

這里先說一下,火山云提供了手動生成簽名的示例代碼:

圖片圖片

Java 生成簽名的代碼:https://github.com/volcengine/volc-openapi-demos/blob/main/signature/java/Sign.java

這里我也是直接把簽名代碼拿來即用就行,一開始接入生成簽名代碼非常順利,GET 請求的 OpenApi 接口都是可以順利調通的,但是當我調用 BanRoomUser 接口時(沒錯,又是這個接口,踩的三個坑都與這個接口有關),直接提示驗簽失敗!

驗簽失敗驗簽失敗

OK,開始排查為什么簽名失敗。

圖片圖片

查看源碼發現,POST JSON 請求時的 contentType 還是 application/x-www-form-urlencoded,直覺告訴我這里不對,所以改成 application/json 試試,看看控制臺返回,

圖片圖片

很好,還是驗簽失敗!!!

我盡力了兄弟們,這個坑踩的我是無話可說。直接聯系直接字節開發人員看下我的請求內容是哪里有問題。

在與字節開發人員一起觀摩我寫的代碼以及生成的簽名之后,大家都沒找到問題所在。那沒辦法了,只能上服務器看接口請求日志了。

圖片圖片

大家可以看出問題在哪里嗎?沒錯我剛剛不是把 contentType 改成了 application/json 嗎,為什么日志顯示的 contentType 是 application/json; charset=utf-8!。

OK,到這里問題也找到了,原因是我這個項目用的 http 請求工具是 okhttp3。他自動給我拼接上去的!

那么怎么解決嘞,替換 http3 工具的話,改造成本比較大,所以我就順勢把代碼的 contentType 也改成application/json; charset=utf-8。

在測試一遍,看看控制臺打印。

圖片圖片

OK,拿到成功響應,自此也就解決了第三個坑,POST JSON 請求時的驗簽不匹配問題。

最后給大家貼出手動生成驗簽的代碼,有需要自取。

@Slf4j
public class Sign {
    private static final BitSet URLENCODER = new BitSet(256);
    private static final String CONST_ENCODE = "0123456789ABCDEF";
    public static final Charset UTF_8 = StandardCharsets.UTF_8;
    private final String region;
    private final String service;
    private final String host;
    private final String path;
    private final String ak;
    private final String sk;
    static {
        int i;
        for (i = 97; i <= 122; ++i) {
            URLENCODER.set(i);
        }

        for (i = 65; i <= 90; ++i) {
            URLENCODER.set(i);
        }

        for (i = 48; i <= 57; ++i) {
            URLENCODER.set(i);
        }
        URLENCODER.set('-');
        URLENCODER.set('_');
        URLENCODER.set('.');
        URLENCODER.set('~');
    }

    public Sign(String region, String service, String host, String path, String ak, String sk) {
        this.region = region;
        this.service = service;
        this.host = host;
        this.path = path;
        this.ak = ak;
        this.sk = sk;
    }

    public Headers calcAuthorization(String method, Map<String, String> queryList, byte[] body,
                                     Date date, String action, String version) throws Exception {
        // 請求頭
        Map<String, String> headerMap = new HashMap<>();
        String contentType = "application/x-www-form-urlencoded; charset=utf-8";
        if (body == null) {
            body = new byte[0];
        } else {
            contentType = "application/json; charset=utf-8";
        }
        String xContentSha256 = hashSHA256(body);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
        // String xDate = "20240515T061353Z";
        String xDate = sdf.format(date);
        String shortXDate = xDate.substring(0, 8);
        String signHeader = "content-type;host;x-content-sha256;x-date";

        SortedMap<String, String> realQueryList = new TreeMap<>(queryList);
        realQueryList.put("Action", action);
        realQueryList.put("Version", version);
        StringBuilder querySB = new StringBuilder();
        for (String key : realQueryList.keySet()) {
            querySB.append(signStringEncoder(key)).append("=").append(signStringEncoder(realQueryList.get(key))).append("&");
        }
        querySB.deleteCharAt(querySB.length() - 1);
        String canonicalStringBuilder = method + "\n" + path + "\n" + querySB + "\n" +
                "content-type:" + contentType + "\n" +
                "host:" + host + "\n" +
                "x-content-sha256:" + xContentSha256 + "\n" +
                "x-date:" + xDate + "\n" +
                "\n" +
                signHeader + "\n" +
                xContentSha256;

        // log.info("canonicalStringBuilder is {}", canonicalStringBuilder);
        String hashcanonicalString = hashSHA256(canonicalStringBuilder.getBytes());
        String credentialScope = shortXDate + "/" + region + "/" + service + "/request";
        String signString = "HMAC-SHA256" + "\n" + xDate + "\n" + credentialScope + "\n" + hashcanonicalString;
        // log.info("signString is {}", signString);

        byte[] signKey = genSigningSecretKeyV4(sk, shortXDate, region, service);
        String signature = HexUtil.encodeHexStr(hmacSHA256(signKey, signString));
        String auth = "HMAC-SHA256" +
                " Credential=" + ak + "/" + credentialScope +
                ", SignedHeaders=" + signHeader +
                ", Signature=" + signature;
        headerMap.put("Authorization", auth);
        headerMap.put("X-Date", xDate);
        headerMap.put("X-Content-Sha256", xContentSha256);
        headerMap.put("Host", host);
        headerMap.put("Content-Type", contentType);
        headerMap.put("User-Agent", "volc-sdk-java/v");
        headerMap.put("Accept", "application/json");
        return Headers.of(headerMap);
    }

    private static String signStringEncoder(String source) {
        if (source == null) {
            return null;
        }
        StringBuilder buf = new StringBuilder(source.length());
        ByteBuffer bb = UTF_8.encode(source);
        while (bb.hasRemaining()) {
            int b = bb.get() & 255;
            if (URLENCODER.get(b)) {
                buf.append((char) b);
            } else if (b == 32) {
                buf.append("%20");
            } else {
                buf.append("%");
                char hex1 = CONST_ENCODE.charAt(b >> 4);
                char hex2 = CONST_ENCODE.charAt(b & 15);
                buf.append(hex1);
                buf.append(hex2);
            }
        }

        return buf.toString();
    }

    public static String hashSHA256(byte[] content) throws Exception {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            // return HexFormat.of().formatHex(md.digest(content));
            return HexUtil.encodeHexStr(md.digest(content));
        } catch (Exception e) {
            throw new Exception(
                    "Unable to compute hash while signing request: "
                            + e.getMessage(), e);
        }
    }

    public static byte[] hmacSHA256(byte[] key, String content) throws Exception {
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(key, "HmacSHA256"));
            return mac.doFinal(content.getBytes());
        } catch (Exception e) {
            throw new Exception(
                    "Unable to calculate a request signature: "
                            + e.getMessage(), e);
        }
    }

    private byte[] genSigningSecretKeyV4(String secretKey, String date, String region, String service) throws Exception {
        byte[] kDate = hmacSHA256((secretKey).getBytes(), date);
        byte[] kRegion = hmacSHA256(kDate, region);
        byte[] kService = hmacSHA256(kRegion, service);
        return hmacSHA256(kService, "request");
    }
}

總結

在與火山云旗下云游戲產品的 OpenApi 接口對接過程中,我總共踩了三個坑。一是文檔版本不是最新,二是官方提供的 OpenApi 示例 demo 過于簡單,三是官方提供的驗簽代碼沒有考慮到 POST JSON 請求場景下的 contentType 設置問題。

責任編輯:武曉燕 來源: 程序員wayn
相關推薦

2022-04-26 06:43:12

文檔TCPLinux

2020-04-14 15:30:00

微信群管理朋友圈

2023-06-24 23:11:07

2024-11-05 09:47:08

VGG網絡模型

2022-11-30 09:18:51

JavaMyBatisMQ

2022-04-18 07:42:31

配置機制Spring

2021-04-22 07:47:47

JavaJDKMYSQL

2020-04-01 08:40:44

Vue.jsweb開發

2024-06-03 11:43:55

2020-09-01 10:32:52

iOS微信新功能

2020-05-18 08:42:23

CSS背景圖像前端開發

2023-06-20 08:01:09

RoseDB存儲數據

2014-08-21 14:49:32

MIUI 6

2021-07-10 07:40:27

Excel數據分析大數據

2021-08-19 15:05:08

微信功能技巧

2018-07-12 14:03:33

區塊鏈新零售電子商務

2021-10-29 11:45:26

Python代碼Python 3.

2025-06-04 08:10:59

2024-11-08 14:18:38

點贊
收藏

51CTO技術棧公眾號

无码h肉动漫在线观看| 久久久久久久9| 最近国语视频在线观看免费播放| 日韩亚洲一区在线| 日韩欧美一区电影| 国产一区二区网| av在线免费一区| 国产福利视频一区二区三区| 欧美亚洲成人网| 成人精品一二三区| 成人中文字幕视频| 91久久精品一区二区三| 中文字幕精品在线播放| 日本一区高清| 国产乱色国产精品免费视频| 欧美一级在线播放| 永久免费看片直接| 亚洲v天堂v手机在线| 7777精品伊人久久久大香线蕉超级流畅| 六月婷婷激情综合| 99精品老司机免费视频| 成人小视频在线| 国产人妖伪娘一区91| 日韩成人免费观看| 亚洲综合激情在线| 中文字幕精品在线| 超碰97人人干| 成人资源在线| 制服丝袜在线91| 日韩一级片播放| 成人免费一区二区三区牛牛| 亚洲天堂网中文字| 日韩av在线一区二区三区| 色综合久久久久久| 国产精品一区二区久久精品爱涩| 国产精品xxxxx| 日韩黄色三级视频| 欧美69视频| 久久精品中文字幕| 五月婷婷婷婷婷| 激情五月综合| 亚洲裸体xxxx| 国产乱了高清露脸对白| 精品三级av在线导航| 欧美一区二区性放荡片| 欧美日韩中文不卡| 在线成人视屏| 色成年激情久久综合| 欧美深夜福利视频| 丁香花电影在线观看完整版| 一区二区三区欧美亚洲| 妞干网这里只有精品| 米奇777四色精品人人爽| 国产精品免费观看视频| 色一情一区二区三区四区| 激情福利在线| 国产亚洲视频系列| 视频一区三区| 成人在线免费看| 国产日韩欧美高清在线| 日韩欧美亚洲日产国| 欧美在线观看视频一区二区 | 九九九在线视频| 欧美亚洲高清| 亚洲日韩成人| 亚洲区一区二区| 在线 丝袜 欧美 日韩 制服| 欧美做受69| 亚洲精品一区二区久| 亚洲午夜久久久久久久久红桃| 另类在线视频| 亚洲欧洲偷拍精品| 日韩福利在线视频| 天天做天天爱天天综合网| 久久久999精品| 日本aⅴ在线观看| 欧美视频不卡| 91精品国产高清久久久久久久久| 欧美三日本三级少妇99| 老色鬼久久亚洲一区二区| 日韩av色综合| 亚洲特级黄色片| 国产一区二区在线免费观看| 国产精品一国产精品最新章节| 网站黄在线观看| 国产欧美日韩久久| 蜜桃视频成人在线观看| www.8ⅹ8ⅹ羞羞漫画在线看| 欧美日韩国产精品一区二区三区四区| 久久国产色av免费观看| 日韩欧国产精品一区综合无码| 欧美一区二区三区免费| 中文字幕人妻一区| 国产欧美日韩在线一区二区| 久久精品视频在线| 日韩免费在线视频观看| 日韩高清欧美激情| 99免费在线视频观看| 欧美女优在线观看| 18欧美乱大交hd1984| 欧美综合在线播放| 人人精品久久| 亚洲精品99999| 玖玖爱在线观看| 91精品秘密在线观看| 2020久久国产精品| 伊人久久国产精品| 成人国产精品免费观看视频| 性欧美videosex高清少妇| 色呦呦视频在线观看| 在线欧美一区二区| 中文字幕在线国产| 欧美疯狂party性派对| 性欧美xxxx| 国产精品无码一区二区桃花视频| 99久久婷婷国产综合精品 | 日韩精品免费一区二区在线观看| 欧美国产日韩xxxxx| 最新中文字幕免费| 99re66热这里只有精品3直播| 五月天色婷婷综合| **在线精品| 亚洲国产古装精品网站| av最新在线观看| 日韩精品亚洲一区二区三区免费| 成人18视频| 麻豆tv入口在线看| 91福利社在线观看| 在线免费观看a级片| 一区二区影视| 国产精品免费久久久久影院| 少妇人妻偷人精品一区二区| 亚洲精品国产一区二区精华液| 一区二区三区视频在线观看免费| 欧美日韩导航| 久久久久久国产| 国产黄色美女视频| 亚洲人成7777| 91视频这里只有精品| 国产精品一区高清| 日本午夜精品理论片a级appf发布| 动漫av一区二区三区| 亚洲天堂精品视频| 一区二区久久精品| 国产精品福利在线观看播放| 国产精品久久久久久婷婷天堂| 免费在线国产| 色偷偷88欧美精品久久久| 一二三不卡视频| 国产免费成人| 久久亚裔精品欧美| 午夜影院一区| 亚洲男人天堂视频| 九九精品免费视频| 久久精品一区二区三区不卡| 少妇性饥渴无码a区免费| 秋霞蜜臀av久久电影网免费| 欧美在线视频观看| 国产综合在线观看| 欧美视频自拍偷拍| 国产3级在线观看| 精品一二线国产| 成年人三级视频| 一区二区免费| 91精品国产高清久久久久久91| 午夜一区在线观看| 日本精品一级二级| 成人一级黄色大片| 国产精品2024| 国产毛片视频网站| 久久成人av| 国产欧美日韩亚洲精品| 国产视频中文字幕在线观看| 日韩视频在线一区二区| 亚洲免费视频一区| 日韩av黄色| 欧美成人免费小视频| 亚洲精品久久久久久动漫器材一区| 亚洲第一成年网| 日韩片在线观看| 日产欧产美韩系列久久99| 亚洲一区精彩视频| 天堂久久av| 欧美在线亚洲在线| 日本中文字幕视频在线| 日韩免费一区二区| 91在线视频在线观看| 国产精品区一区二区三| 无码人妻丰满熟妇啪啪网站| 久久中文精品| www.黄色网址.com| 自拍亚洲一区| 川上优av一区二区线观看| av资源在线| 深夜成人在线观看| 成人毛片视频免费看| 欧洲av在线精品| 久久国产精品波多野结衣av| 久久久久久久av麻豆果冻| 怡红院亚洲色图| 激情综合视频| 一区二区三区国产福利| 久久a爱视频| 国产精品美腿一区在线看| 国产在线精彩视频| www.日韩欧美| 欧洲亚洲精品视频| 日韩欧美国产一区二区三区| www.久久视频| 亚洲一区在线播放| 天堂av网手机版| 91麻豆国产香蕉久久精品| www.com久久久| 久久久精品五月天| 亚洲色成人www永久在线观看| 欧美wwwww| 欧美日韩免费高清| 51精品国产| 成人黄色短视频在线观看| 无码小电影在线观看网站免费 | 成人欧美一区二区| 成人1区2区| 欧美亚洲日本黄色| 女同一区二区免费aⅴ| 日韩中文字幕网| 国外av在线| 日韩精品免费综合视频在线播放| 99久久亚洲精品日本无码| 欧美三级视频在线播放| av一级在线观看| 亚洲国产精品一区二区www在线 | 国产精品一区二区三区免费视频 | 久久无码人妻精品一区二区三区| 国产高清不卡二三区| 91福利免费观看| 麻豆成人综合网| 欧美亚洲日本在线观看| 老司机精品视频网站| 日韩 欧美 高清| 国产亚洲午夜| 国产精品333| 亚洲经典视频在线观看| 又大又硬又爽免费视频| 欧美激情1区| 黄色a级片免费看| 欧美日韩精品| 欧美激情亚洲天堂| 国产综合激情| 国产夫妻自拍一区| 精品动漫3d一区二区三区免费| 国产成人一二三区| 激情久久中文字幕| 日本人体一区二区| 日韩亚洲在线| 黄色动漫在线免费看| 亚洲中午字幕| 乱子伦视频在线看| 美日韩一区二区| 亚洲视频一二三四| 国产麻豆欧美日韩一区| 日本wwwwwww| www日韩大片| 亚洲ⅴ国产v天堂a无码二区| 国产精品乱人伦一区二区| 免费黄色国产视频| 樱桃视频在线观看一区| 久久亚洲AV无码| 精品久久久久久久久久久久| 中文字幕黄色片| 欧洲精品在线观看| 国产亲伦免费视频播放| 亚洲国产精品嫩草影院久久| 日韩电影网址| 中文字幕欧美精品在线 | 97成人精品区在线播放| 大胆人体一区二区| 国产精品中文字幕在线| 国产精品日韩精品在线播放 | 日本wwwxxxx| 亚洲欧美视频在线| melody高清在线观看| 久久国产精品久久国产精品| 丰满的护士2在线观看高清| 人人做人人澡人人爽欧美| 51一区二区三区| 91gao视频| 免费看日本一区二区| 男人的天堂成人| 亚洲精品日本| 中文av一区二区三区| 成人国产亚洲欧美成人综合网| av黄色在线免费观看| 亚洲精品免费播放| 无码人妻精品一区二区三区不卡 | 第一sis亚洲原创| 国产日产欧美一区二区| 久久一日本道色综合久久| 久久无码人妻一区二区三区| 97精品电影院| 色欲一区二区三区精品a片| 亚洲图片有声小说| 又骚又黄的视频| 日韩国产欧美精品一区二区三区| 色网站在线看| 韩国视频理论视频久久| 国产高清亚洲| 日本一区二区三区免费看| 欧美日韩免费| www.色就是色.com| 久久综合九色综合欧美98| 欧美成人综合色| 91成人在线精品| 人妻少妇一区二区三区| 久久久精品视频在线观看| 亚洲伊人av| 好看的日韩精品视频在线| 91精品天堂福利在线观看| 国产天堂在线播放| 99精品在线观看视频| 欧美日韩在线视频免费| 欧美三级一区二区| 黄色av免费在线观看| 欧美一级黄色网| 风间由美一区二区av101| 国产四区在线观看| 老司机午夜精品| 国产蜜臀av在线播放| 亚洲精品久久久久久久久| 精品176二区| 国产精品av在线| 日韩精选在线| 800av在线免费观看| 国产乱码精品一区二区三| 欧洲性xxxx| 91福利社在线观看| 美女欧美视频在线观看免费 | 可以免费看的av毛片| 日韩精品一区国产麻豆| 国产黄a三级三级三级av在线看| 国产精品国产自产拍高清av水多| 亚洲国产网址| 黄色免费观看视频网站| 99精品久久久久久| 日本少妇在线观看| 亚洲高清一二三区| 99thz桃花论族在线播放| 国产欧美亚洲日本| 99在线精品免费视频九九视 | 久久久久久香蕉| 久久先锋影音av鲁色资源| 免费日韩一级片| 日韩精品免费综合视频在线播放| 性欧美freesex顶级少妇| 久久精品成人一区二区三区蜜臀 | 自拍偷拍欧美一区| 北条麻妃在线一区| 欧美国产精品专区| 亚洲综合五月天婷婷丁香| 日韩一区在线视频| 国产精品色婷婷在线观看| youjizz.com在线观看| av网站免费线看精品| 91video| 亚洲欧洲xxxx| 国产成人福利夜色影视| youjizz.com亚洲| 国产黄色成人av| 国产无遮挡aaa片爽爽| 国产视频精品xxxx| 欧美在线va视频| 椎名由奈jux491在线播放 | 午夜理伦三级做爰电影| 欧美性色黄大片| 91精品久久| 精品九九九九| 日韩成人免费电影| 老女人性淫交视频| 日韩精品视频中文在线观看| 78精品国产综合久久香蕉| 大地资源网在线观看免费官网| 成人免费毛片嘿嘿连载视频| chinese国产精品| 久久九九全国免费精品观看| 国产96在线亚洲| 欧美激情精品久久久久久小说| 综合电影一区二区三区 | 免费看欧美黑人毛片| 久久久久久影视| 国产精品久久影视| 97人人模人人爽人人喊中文字 | 一本色道久久88亚洲精品综合| 成人国产免费视频| 亚洲自拍第二页| 91高清视频免费观看| 91成人观看| 国产成人av一区二区三区不卡| 日韩一区二区麻豆国产| 欧美成人免费电影| 91亚洲精品国产| 亚洲国产精品激情在线观看|