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

如何實(shí)現(xiàn)ChatGPT的打字機(jī)效果

開發(fā) 前端
在搭建過程中,我還遇到另一個(gè)坑。因?yàn)樽约褐虚g有一層nginx代理,而「nginx默認(rèn)開啟了緩存,所以導(dǎo)致流式輸出到nginx這個(gè)地方被緩存了」,最終前端拿到的數(shù)據(jù)是緩存后一次性輸出的。同時(shí)gzip也可能有影響。

打字機(jī)效果

最近在搭建chat gpt代理的時(shí)候,發(fā)現(xiàn)自己的配置雖然能夠調(diào)通接口,返回?cái)?shù)據(jù),但是結(jié)果是一次性顯示出來的,不像之前的chat gpt的官網(wǎng)demo那樣實(shí)現(xiàn)了打字機(jī)效果,一個(gè)字一個(gè)字出來。

圖片

所以研究了一下chat gpt打字機(jī)效果的原理,后續(xù)如果要實(shí)現(xiàn)類似的效果可以借鑒。

純前端實(shí)現(xiàn)打字機(jī)效果

最開始我搜索打字機(jī)效果時(shí),出現(xiàn)的結(jié)果大多數(shù)是純前端的方案。其原理也很簡單,通過js定時(shí)把內(nèi)容輸出到屏幕。下面是chat gpt的答案:

前端實(shí)現(xiàn)打字機(jī)效果可以通過以下步驟:

  1. 將文本內(nèi)容嵌入到 HTML 元素中,如 div 或 span。
  2. 通過 CSS 樣式設(shè)置元素的顯示方式為隱藏(如 display: none;)。
  3. 使用 JavaScript 獲取該元素,并逐個(gè)顯示其中的字符。
  4. 使用定時(shí)器(如 setInterval() 函數(shù))控制每個(gè)字符的出現(xiàn)時(shí)間間隔,從而實(shí)現(xiàn)逐個(gè)逐個(gè)顯示的效果。
  5. 當(dāng)所有字符都被顯示后,停止定時(shí)器以避免不必要的計(jì)算開銷。

下面是一個(gè)簡單的示例代碼:

HTML:

<div id="typewriter">Hello World!</div>

CSS:

#typewriter {
display: none;
}

JS:

const element = document.getElementById('typewriter');

let i = 0;
const interval = setInterval(() => {
element.style.display = 'inline';
element.textContent = element.textContent.slice(0, i++) + '_';

if (i > element.textContent.length) {
clearInterval(interval);
element.textContent = element.textContent.slice(0, -1);
}
}, 100);

該代碼會將 id 為 typewriter 的元素中的文本逐個(gè)顯示,每個(gè)字符之間相隔 100 毫秒。最終顯示完畢后,會將最后一個(gè)字符的下劃線去除。

流式輸出

后面我抓包以及查看了chat gpt的官方文檔之后,發(fā)現(xiàn)事情并沒有這么簡單。chat gpt的打字機(jī)效果并不是后端一次性返回后,純前端的樣式。而是后端通過流式輸出不斷向前端輸出內(nèi)容。

在chat gpt官方文檔中,有一個(gè)參數(shù)可以讓它實(shí)現(xiàn)流式輸出:

圖片

這是一個(gè)叫“event_stream_format”的協(xié)議規(guī)范。

event_stream_format(簡稱 ESF)是一種基于 HTTP/1.1 的、用于實(shí)現(xiàn)服務(wù)器推送事件的協(xié)議規(guī)范。它定義了一種數(shù)據(jù)格式,可以將事件作為文本流發(fā)送給客戶端。ESF 的設(shè)計(jì)目標(biāo)是提供簡單有效的實(shí)時(shí)通信方式,以及支持眾多平臺和編程語言。

ESF 數(shù)據(jù)由多行文本組成,每行用 \n(LF)分隔。其中,每個(gè)事件由以下三部分組成:

  • 事件類型(event)
  • 數(shù)據(jù)(data)
  • 標(biāo)識符(id)

例如:

event: message 
data: Hello, world!
id: 123

這個(gè)例子表示一個(gè)名為 message 的事件,攜帶著消息內(nèi)容 Hello, world!,并提供了一個(gè)標(biāo)識符為 123 的可選參數(shù)。

ESF 還支持以下兩種特殊事件類型:

  • 注釋(comment):以冒號開頭的一行,只做為注釋使用。
  • 重傳(retry):指定客戶端重連的時(shí)間間隔,以毫秒為單位。

例如:

: This is a comment

retry: 10000

event: update
data: {"status": "OK"}

ESF 協(xié)議還支持 Last-Event-ID 頭部,它允許客戶端在斷線后重新連接,并從上次連接中斷處恢復(fù)。當(dāng)客戶端連接時(shí),可以通過該頭部將上次最新的事件 ID 傳遞給服務(wù)器,以便服務(wù)器根據(jù)該 ID 繼續(xù)發(fā)送事件。

ESF 是一種簡單的、輕量級的協(xié)議,適用于需要實(shí)時(shí)數(shù)據(jù)交換和多方通信的場景。由于其使用了標(biāo)準(zhǔn)的 HTTP/1.1 協(xié)議,因此可以輕易地在現(xiàn)有的 Web 基礎(chǔ)設(shè)施上實(shí)現(xiàn)。

抓包可以發(fā)現(xiàn)這個(gè)響應(yīng)長這樣:

圖片

圖片

可以看到是data: 加上一個(gè)json,每次的流式數(shù)據(jù)在delta里面。

http response中有幾個(gè)重要的頭:

圖片

其中,keep-alive是保持客戶端和服務(wù)端的雙向通信,這個(gè)大家應(yīng)該都比較了解。下面解釋一下另外兩個(gè)頭.

這里其實(shí)openai返回的是text/event-stream,text/event-stream 是一種流媒體協(xié)議,用于在 Web 應(yīng)用程序中推送實(shí)時(shí)事件。它的內(nèi)容是文本格式的,每個(gè)事件由一個(gè)或多個(gè)字段組成,以換行符(\n)分隔。這個(gè) MIME 類型通常用于服務(wù)器到客戶端的單向通信,例如服務(wù)器推送最新的新聞、股票報(bào)價(jià)等信息給客戶端。

我這里使用的開源項(xiàng)目chatgpt-web抓的包,請求被nodejs包了一層,返回了application/octet-stream (不太清楚這么做的動機(jī)是什么),它是一種 MIME 類型,通常用于指示某個(gè)資源的內(nèi)容類型為二進(jìn)制文件,也就是未知的二進(jìn)制數(shù)據(jù)流。該類型通常不會執(zhí)行任何自定義處理,并且可以由客戶端根據(jù)需要進(jìn)行下載或保存。

Transfer-Encoding: chunked 是一種 HTTP 報(bào)文傳輸編碼方式,用于指示報(bào)文主體被分為多個(gè)等大小的塊(chunks)進(jìn)行傳輸。每個(gè)塊包含一個(gè)十六進(jìn)制數(shù)字的長度字段,后跟一個(gè) CRLF(回車換行符),然后是實(shí)際的數(shù)據(jù)內(nèi)容,最后以另一個(gè) CRLF 結(jié)束。

使用 chunked 編碼方式可以使服務(wù)器在發(fā)送未知大小的數(shù)據(jù)時(shí)更加靈活,同時(shí)也可以避免一些限制整個(gè)響應(yīng)主體大小的限制。當(dāng)接收端收到所有塊后,會將它們組合起來,解壓縮(如果需要),并形成原始的響應(yīng)主體。

總之,Transfer-Encoding: chunked 允許服務(wù)器在發(fā)送 HTTP 響應(yīng)時(shí),動態(tài)地生成報(bào)文主體,而不必事先確定其大小,從而提高了通信效率和靈活性。

服務(wù)端的實(shí)現(xiàn)

作為chat gpt代理

如果寫一個(gè)golang http服務(wù)作為chat gpt的代理,只需要循環(huán)掃描chat gpt返回的每行結(jié)果,每行作為一個(gè)事件輸出給前端就行了。核心代碼如下:

// 設(shè)置Content-Type標(biāo)頭為text/event-stream  
w.Header().Set("Content-Type", "text/event-stream")
// 設(shè)置緩存控制標(biāo)頭以禁用緩存
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
w.Header().Set("Keep-Alive", "timeout=5")
// 循環(huán)讀取響應(yīng)體并將每行作為一個(gè)事件發(fā)送到客戶端
scanner := bufio.NewScanner(resp.Body)
for scanner.Scan() {
eventData := scanner.Text()
if eventData == "" {
continue
}
fmt.Fprintf(w, "%s\n\n", eventData)
flusher, ok := w.(http.Flusher)
if ok {
flusher.Flush()
} else {
log.Println("Flushing not supported")
}
}

自己作為服務(wù)端

這里模仿openai的數(shù)據(jù)結(jié)構(gòu),自己作為服務(wù)端,返回流式輸出:

const Text = `  
proxy_cache:通過這個(gè)模塊,Nginx 可以緩存代理服務(wù)器從后端服務(wù)器請求到的響應(yīng)數(shù)據(jù)。當(dāng)下一個(gè)客戶端請求相同的資源時(shí),Nginx 可以直接從緩存中返回響應(yīng),而不必去請求后端服務(wù)器。這大大降低了代理服務(wù)器的負(fù)載,同時(shí)也能提高客戶端訪問速度。需要注意的是,使用 proxy_cache 模塊時(shí)需要謹(jǐn)慎配置緩存策略,避免出現(xiàn)緩存不一致或者過期的情況。

proxy_buffering:通過這個(gè)模塊,Nginx 可以將后端服務(wù)器響應(yīng)數(shù)據(jù)緩沖起來,并在完整的響應(yīng)數(shù)據(jù)到達(dá)之后再將其發(fā)送給客戶端。這種方式可以減少代理服務(wù)器和客戶端之間的網(wǎng)絡(luò)連接數(shù),提高并發(fā)處理能力,同時(shí)也可以防止后端服務(wù)器過早關(guān)閉連接,導(dǎo)致客戶端無法接收到完整的響應(yīng)數(shù)據(jù)。

綜上所述, proxy_cache 和 proxy_buffering 都可以通過緩存技術(shù)提高代理服務(wù)器性能和安全性,但需要注意合理的配置和使用,以避免潛在的緩存不一致或者過期等問題。同時(shí), proxy_buffering 還可以通過緩沖響應(yīng)數(shù)據(jù)來提高代理服務(wù)器的并發(fā)處理能力,從而更好地服務(wù)于客戶端。
`

type ChatCompletionChunk struct {
ID string `json:"id"`
Object string `json:"object"`
Created int64 `json:"created"`
Model string `json:"model"`
Choices []struct {
Delta struct {
Content string `json:"content"`
} `json:"delta"`
Index int `json:"index"`
FinishReason *string `json:"finish_reason"`
} `json:"choices"`
}

func handleSelfRequest(w http.ResponseWriter, r *http.Request) {
// 設(shè)置Content-Type標(biāo)頭為text/event-stream
w.Header().Set("Content-Type", "text/event-stream")
// 設(shè)置緩存控制標(biāo)頭以禁用緩存
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
w.Header().Set("Keep-Alive", "timeout=5")
w.Header().Set("Transfer-Encoding", "chunked")
// 生成一個(gè)uuid
uid := uuid.NewString()
created := time.Now().Unix()

for i, v := range Text {
eventData := fmt.Sprintf("%c", v)
if eventData == "" {
continue
}
var finishReason *string
if i == len(Text)-1 {
temp := "stop"
finishReason = &temp
}
chunk := ChatCompletionChunk{
ID: uid,
Object: "chat.completion.chunk",
Created: created,
Model: "gpt-3.5-turbo-0301",
Choices: []struct {
Delta struct {
Content string `json:"content"`
} `json:"delta"`
Index int `json:"index"`
FinishReason *string `json:"finish_reason"`
}{
{ Delta: struct {
Content string `json:"content"`
}{
Content: eventData,
},
Index: 0,
FinishReason: finishReason,
},
},
}

fmt.Println("輸出:" + eventData)
marshal, err := json.Marshal(chunk)
if err != nil {
return
}

fmt.Fprintf(w, "data: %v\n\n", string(marshal))
flusher, ok := w.(http.Flusher)
if ok {
flusher.Flush()
} else {
log.Println("Flushing not supported")
}
if i == len(Text)-1 {
fmt.Fprintf(w, "data: [DONE]")
flusher, ok := w.(http.Flusher)
if ok {
flusher.Flush()
} else {
log.Println("Flushing not supported")
}
} time.Sleep(100 * time.Millisecond)
}
}

核心是每次寫進(jìn)一行數(shù)據(jù)data: xx \n\n,最終以data: [DONE]結(jié)尾。

前端的實(shí)現(xiàn)

前端代碼參考https://github.com/Chanzhaoyu/chatgpt-web的實(shí)現(xiàn)。

這里核心是使用了axios的onDownloadProgress鉤子,當(dāng)stream有輸出時(shí),獲取chunk內(nèi)容,更新到前端顯示。

await fetchChatAPIProcess<Chat.ConversationResponse>({  
prompt: message,
options,
signal: controller.signal,
onDownloadProgress: ({ event }) => {
const xhr = event.target
const { responseText } = xhr
// Always process the final line
const lastIndex = responseText.lastIndexOf('\n')
let chunk = responseText
if (lastIndex !== -1)
chunk = responseText.substring(lastIndex)
try {
const data = JSON.parse(chunk)
updateChat(
+uuid,
dataSources.value.length - 1,
{
dateTime: new Date().toLocaleString(),
text: lastText + data.text ?? '',
inversion: false,
error: false,
loading: false,
conversationOptions: { conversationId: data.conversationId, parentMessageId: data.id },
requestOptions: { prompt: message, options: { ...options } },
},
)

if (openLongReply && data.detail.choices[0].finish_reason === 'length') {
options.parentMessageId = data.id
lastText = data.text
message = ''
return fetchChatAPIOnce()
}

scrollToBottom()
}
catch (error) {
//
}
},
})

在底層的請求代碼中,設(shè)置對應(yīng)的header和參數(shù),監(jiān)聽data內(nèi)容,回調(diào)onProgress函數(shù)。

const responseP = new Promise((resolve, reject) => {  
const url = this._apiReverseProxyUrl;
const headers = {
...this._headers,
Authorization: `Bearer ${this._accessToken}`,
Accept: "text/event-stream",
"Content-Type": "application/json"
};
if (this._debug) {
console.log("POST", url, { body, headers });
}
fetchSSE(
url,
{
method: "POST",
headers,
body: JSON.stringify(body),
signal: abortSignal,
onMessage: (data) => {
var _a, _b, _c;
if (data === "[DONE]") {
return resolve(result);
}
try {
const convoResponseEvent = JSON.parse(data);
if (convoResponseEvent.conversation_id) {
result.conversationId = convoResponseEvent.conversation_id;
}
if ((_a = convoResponseEvent.message) == null ? void 0 : _a.id) {
result.id = convoResponseEvent.message.id;
}
const message = convoResponseEvent.message;
if (message) {
let text2 = (_c = (_b = message == null ? void 0 : message.content) == null ? void 0 : _b.parts) == null ? void 0 : _c[0];
if (text2) {
result.text = text2;
if (onProgress) {
onProgress(result);
}
}
}
} catch (err) {
}
}
},
this._fetch
).catch((err) => {
const errMessageL = err.toString().toLowerCase();
if (result.text && (errMessageL === "error: typeerror: terminated" || errMessageL === "typeerror: terminated")) {
return resolve(result);
} else {
return reject(err);
}
});
});

nginx配置

在搭建過程中,我還遇到另一個(gè)坑。因?yàn)樽约褐虚g有一層nginx代理,而「nginx默認(rèn)開啟了緩存,所以導(dǎo)致流式輸出到nginx這個(gè)地方被緩存了」,最終前端拿到的數(shù)據(jù)是緩存后一次性輸出的。同時(shí)gzip也可能有影響。

這里可以通過nginx配置,把gzip和緩存都關(guān)掉。

gzip off;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache off;
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://xxx.com:1234;
}

proxy_cache 和 proxy_buffering 是 Nginx 的兩個(gè)重要的代理模塊。它們可以顯著提高代理服務(wù)器的性能和安全性。

  • proxy_cache:通過這個(gè)模塊,Nginx 可以緩存代理服務(wù)器從后端服務(wù)器請求到的響應(yīng)數(shù)據(jù)。當(dāng)下一個(gè)客戶端請求相同的資源時(shí),Nginx 可以直接從緩存中返回響應(yīng),而不必去請求后端服務(wù)器。這大大降低了代理服務(wù)器的負(fù)載,同時(shí)也能提高客戶端訪問速度。需要注意的是,使用 proxy_cache 模塊時(shí)需要謹(jǐn)慎配置緩存策略,避免出現(xiàn)緩存不一致或者過期的情況。
  • proxy_buffering:通過這個(gè)模塊,Nginx 可以將后端服務(wù)器響應(yīng)數(shù)據(jù)緩沖起來,并在完整的響應(yīng)數(shù)據(jù)到達(dá)之后再將其發(fā)送給客戶端。這種方式可以減少代理服務(wù)器和客戶端之間的網(wǎng)絡(luò)連接數(shù),提高并發(fā)處理能力,同時(shí)也可以防止后端服務(wù)器過早關(guān)閉連接,導(dǎo)致客戶端無法接收到完整的響應(yīng)數(shù)據(jù)。

實(shí)測只配置proxy_cache沒有用,配置了proxy_buffering后流式輸出才生效。

責(zé)任編輯:武曉燕 來源: 編了個(gè)程
相關(guān)推薦

2023-06-19 08:36:30

頻率setData元素

2023-08-22 10:25:19

CSS動畫網(wǎng)頁

2025-06-17 09:21:13

2023-07-27 07:35:55

HTTP持久化服務(wù)器

2010-09-30 15:19:33

2022-12-12 11:11:05

2023-02-07 10:09:20

ChatGPT人工智能

2025-08-29 08:12:13

2012-05-09 14:49:23

HTML5

2023-03-23 09:09:32

前端詞云效果

2012-09-17 09:32:16

JavaScriptJSHTML5

2011-01-18 09:37:52

Linux鍵盤

2013-11-11 09:26:50

編程思考

2024-04-24 11:09:12

Android圖標(biāo)

2011-04-25 14:45:38

2019-08-26 09:42:51

人工智能機(jī)器學(xué)習(xí)技術(shù)

2016-04-01 10:34:29

APK壓縮Android

2024-08-07 10:39:47

ChatGPT自然語言企業(yè)數(shù)據(jù)

2025-05-26 08:43:00

AIChatGPT模型

2023-04-03 11:52:00

ChatGPTDevOps技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲第一天堂在线观看| 丝袜 亚洲 另类 欧美 重口| 亚洲午夜天堂| 中文字幕一区二区三区在线不卡 | 无码播放一区二区三区| 成年人在线视频| 韩国视频一区二区| 2019中文字幕免费视频| 美女福利视频网| 欧美大胆a级| 91精品国产欧美一区二区成人| 丁香六月激情婷婷| 人人干在线视频| 91亚洲永久精品| 91亚洲国产精品| 中文字幕国产在线观看| 欧美成人亚洲| 在线看日韩欧美| 久久人妻少妇嫩草av无码专区| 福利一区视频| 色成年激情久久综合| 国产在线观看欧美| 欧美精品电影| 久久久国产精品午夜一区ai换脸| 国产高清自拍99| 一级α片免费看刺激高潮视频| 国产欧美日韩一级| 欧美激情中文网| 久久久久久视频| 日本一区二区高清不卡| 亚洲精选一区二区| xxxx黄色片| 97久久精品| 日韩一区二区三区四区五区六区| 日本久久久久久久久久久久| 综合日韩av| 精品magnet| 青青青青草视频| 青青草原av在线| 亚洲激情图片一区| 四虎免费在线观看视频| 五月天婷婷在线视频| 欧美激情综合五月色丁香| 久久国产主播精品| 四虎影视在线播放| 99精品视频一区二区| 国产欧美日韩综合精品二区| www日本在线| 国产高清在线观看免费不卡| 亚洲sss综合天堂久久| 国产又大又粗又硬| 国内成人免费视频| 91日韩久久| 亚洲国产精品二区| 丁香婷婷综合激情五月色| 成人精品一二区| 亚洲国产精品欧美久久| 丁香天五香天堂综合| 国产chinese精品一区二区| 国产v片在线观看| 国产91富婆露脸刺激对白| 99c视频在线| 内射后入在线观看一区| www.66久久| 欧美精品v日韩精品v国产精品| 国产在线三区| 一区免费观看视频| 毛片在线视频观看| 黄视频网站在线观看| 欧美视频在线观看免费| 欧美一级特黄a| 国产一区二区久久久久| 日韩精品在线一区| 国产偷人妻精品一区| av亚洲免费| 久久这里有精品视频| 久久久久成人精品无码| 久久高清免费观看| 国产日韩中文字幕| 成人乱码一区二区三区| 久久久综合视频| 伊人狠狠色丁香综合尤物| 毛片大全在线观看| 在线视频观看一区| 老女人性生活视频| 美女亚洲一区| 久久精品在线播放| 国产在线观看黄色| 久久99国产精品麻豆| 国产一级特黄a大片99| av影片免费在线观看| 一区二区三区在线不卡| 大肉大捧一进一出好爽动态图| 国产亚洲欧美日韩精品一区二区三区 | 人妻少妇精品无码专区久久| 久久久久久9999| 91香蕉视频网址| 九九精品调教| 在线观看日韩毛片| www.四虎精品| 日韩精品免费一区二区三区| 久久久久久久久电影| 免费在线观看av的网站| 成人自拍视频在线| 在线看成人av电影| 综合毛片免费视频| 精品免费99久久| 激情无码人妻又粗又大| 日韩午夜精品| av噜噜色噜噜久久| 日本欧美在线视频免费观看| 欧美日韩在线免费| 日韩av成人网| 97精品一区| 国产精品aaa| 四虎永久在线精品免费网址| 亚洲欧洲日韩女同| 久久午夜夜伦鲁鲁一区二区| 精品综合久久88少妇激情| 久久精品国产精品亚洲| 中文字幕精品无| 91美女片黄在线| 国产美女作爱全过程免费视频| 国产乱子精品一区二区在线观看| 亚洲欧美日韩久久久久久| 精品一区二区三区四| 国内精品写真在线观看| 亚洲永久一区二区三区在线| 高清不卡av| 日韩国产精品一区| 日韩免费视频一区二区视频在线观看| 国产99久久精品| 经典三级在线视频| 粉嫩一区二区三区在线观看| 中文字幕av一区二区三区谷原希美| 欧美一二三区视频| caoporn国产一区二区| 国产精品成人久久电影| 99re8这里有精品热视频免费 | 欧美中文娱乐网| 中文在线а√天堂| 日韩电影大片中文字幕| 日韩女优在线观看| 成人av手机在线观看| 欧美精品卡一卡二| 欧美偷窥清纯综合图区| 91国产中文字幕| 日本国产在线| 日本高清成人免费播放| 无码一区二区三区在线| 免费日韩av片| 性欧美精品一区二区三区在线播放 | 99亚洲视频| 麻豆亚洲一区| 激情亚洲影院在线观看| 国产亚洲欧美另类中文| 亚洲一级黄色大片| 亚洲欧美色图小说| 在线观看免费视频黄| 国产精品日韩| 日韩在线三区| 在线免费观看亚洲| 欧美大尺度在线观看| 丰满少妇在线观看bd| 午夜久久福利影院| 国产精品无码午夜福利| 久久国产66| 色呦呦网站入口| 加勒比视频一区| 国产成人精品免费视频| 香蕉视频网站在线观看| 678五月天丁香亚洲综合网| 久久这里只有精品国产| 91免费小视频| 一本一道久久a久久综合蜜桃| 一精品久久久| 欧美日韩天天操| 精品国产三区在线| 2021国产精品视频| 天堂资源在线中文| 精品久久久久av影院| 亚洲欧美日韩激情| 亚洲人成精品久久久久久| 欧美在线一级片| 久久爱另类一区二区小说| 日韩av中文字幕第一页| av中文一区| 波多野结衣成人在线| 中文字幕在线免费观看视频| 久久精品99无色码中文字幕 | 99v久久综合狠狠综合久久| 日日碰狠狠丁香久燥| 午夜精品偷拍| 日韩欧美亚洲区| 国产伦精品一区二区三区免费优势| 国产成人jvid在线播放| 青草视频在线免费直播 | 美国十次了思思久久精品导航| 日本精品福利视频| 狠狠色狠狠色综合婷婷tag| yy111111少妇影院日韩夜片| 99热播精品免费| 欧美一区二区三区……| 1区2区3区在线视频| 中文在线不卡视频| 日韩三级电影网| 欧美zozozo| 97在线播放免费观看| 欧美日韩国产精品一区二区不卡中文| 成年人网站在线观看视频| 久久伊人蜜桃av一区二区| 中文在线字幕观看| 久久精品国产亚洲a| 色一情一乱一伦一区二区三区日本| 国产精品jizz在线观看美国| 一区二区三区电影| 国内精品视频在线观看 | 久久精品亚洲人成影院| 日本婷婷久久久久久久久一区二区| 国产精品视频3p| 99精品99久久久久久宅男| 青青在线精品| 国产美女精品免费电影| 韩日精品一区| 国产不卡av在线免费观看| 忘忧草在线影院两性视频| 欧美激情欧美激情在线五月| 污视频在线免费观看网站| 久久国产一区二区三区| 一区二区三区视频在线观看视频| 国产亚洲精品久久久| 欧美另类自拍| 亚洲欧美制服第一页| 亚洲 欧美 激情 另类| 亚洲精品白浆高清久久久久久| 亚洲第一第二区| 欧美videos中文字幕| www.成人免费视频| 日韩美女在线视频| 亚洲国产精彩视频| 亚洲精品一区二区三区香蕉| 亚洲精品一区二区三区蜜桃| 日韩美一区二区三区| 欧美熟妇交换久久久久久分类| 欧美不卡123| 香蕉久久国产av一区二区| 日韩成人av在线| 男女视频在线观看| 夜夜嗨av色综合久久久综合网| 97最新国自产拍视频在线完整在线看| 亚洲午夜精品视频| 三级外国片在线观看视频| 三级精品视频久久久久| 久久久久久久久免费视频| 欧美成人sm免费视频| 国产精品国精产品一二| 97精品一区二区视频在线观看| 最近高清中文在线字幕在线观看1| 欧美亚洲在线播放| 精品肉辣文txt下载| 成人激情视频在线播放| 亚洲亚洲一区二区三区| 极品日韩久久| 欧美三级情趣内衣| mm131午夜| 国产欧美大片| 不卡av免费在线| 国产麻豆精品theporn| 亚洲美女在线播放| 久久精品欧美日韩精品| 亚洲色偷偷综合亚洲av伊人| 亚洲综合另类小说| 亚洲欧美日韩激情| 欧美一区二区三级| 美女毛片在线看| 久久亚洲精品一区二区| 电影在线观看一区| 国产精品综合网站| 成人午夜大片| 亚洲欧洲免费无码| 亚洲国产免费看| 亚洲污视频在线观看| 大桥未久av一区二区三区中文| 中文字幕一区二区三区人妻不卡| 国产精品久久久久永久免费观看| 九热这里只有精品| 欧美四级电影网| 女人18毛片水真多18精品| 一本色道久久综合亚洲精品小说| av片哪里在线观看| 日韩免费黄色av| 一区二区三区亚洲变态调教大结局 | 亚洲精品欧美综合四区| 国产精品乱子伦| 91精品综合久久久久久| 久草福利在线| 国产做受69高潮| 二区三区精品| 台湾成人av| 亚洲深夜av| 欧美日韩一区二区区| 国产精品沙发午睡系列990531| 国产乡下妇女做爰毛片| 69堂成人精品免费视频| 国产精品ⅴa有声小说| 高清视频欧美一级| 国产亚洲亚洲国产一二区| 欧美一区二区三区精美影视| 国产精品v欧美精品v日本精品动漫| 91人人澡人人爽人人精品| 99视频一区二区| 欧美激情国产精品免费| 欧美日韩国产综合一区二区| 日韩专区一区二区| 欧美精品久久久久久久久久| 国产高清亚洲| 亚洲黄色一区二区三区| 首页亚洲欧美制服丝腿| 色天使在线视频| 亚洲网友自拍偷拍| 99久久久国产精品无码免费| 日日摸夜夜添一区| 精品日本视频| 日韩影院一区| 日韩精品每日更新| 免费网站在线高清观看| 精品久久久久久久久中文字幕| www.四虎在线观看| 欧美成人午夜影院| 精品国产亚洲一区二区三区在线| 一区二区三区av在线| 美女mm1313爽爽久久久蜜臀| 在线观看免费黄色网址| 91黄色免费看| 国产成人天天5g影院在线观看| 欧美自拍视频在线| 亚洲图片久久| 超碰av在线免费观看| 国产色一区二区| 一二三区免费视频| 国产一区二区三区四区福利| 日韩电影av| 亚洲国产精品综合| 极品销魂美女一区二区三区| 手机免费观看av| 91精品国产综合久久国产大片| 免费大片黄在线观看视频网站| 成人精品久久一区二区三区| 91影院成人| 白丝校花扒腿让我c| 一区二区激情小说| 少妇人妻偷人精品一区二区 | 成人在线免费高清视频| 国产91在线观看| 久久久久久少妇| 国产一区二区三区在线观看网站| 黄色成人在线视频| 中国一级黄色录像| 国产很黄免费观看久久| 亚洲精品国产精品乱码| 亚洲天堂网站在线观看视频| 草民电影神马电影一区二区| 成年人黄色在线观看| 国产成人精品aa毛片| 国产成人自拍视频在线| 在线精品播放av| 国语精品视频| 国产av国片精品| 中文字幕精品三区| va婷婷在线免费观看| …久久精品99久久香蕉国产| 九九热爱视频精品视频| 欧洲美女亚洲激情| 性欧美疯狂xxxxbbbb| www亚洲人| av成人在线电影| 日本怡春院一区二区| 亚洲国产精品久| 亚洲精品永久免费精品| 伊人久久大香伊蕉在人线观看热v| www.夜夜爱| 国产欧美1区2区3区| 丰满人妻一区二区三区无码av | 国产在线播放精品| 九九九在线观看视频| 夜夜爽夜夜爽精品视频| 可以在线观看的av网站| 亚洲综合小说区| 三级一区在线视频先锋| 欧美三级日本三级| 亚洲人成在线一二| 日韩欧美中文在线观看| 久久久国产欧美| 亚洲国产综合91精品麻豆 | 性色av香蕉一区二区| 欧美成人自拍| 久久精品成人av| 欧美精品一区在线观看| 色综合视频一区二区三区日韩| 精品中文字幕av|