亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

CDP協(xié)議+Electron桌面應(yīng)用自動(dòng)化:原理、實(shí)踐與踩坑指南

CDP協(xié)議+Electron桌面應(yīng)用自動(dòng)化:原理、實(shí)踐與踩坑指南 我們團(tuán)隊(duì)最近在做一個(gè)“批量流程自動(dòng)化”的內(nèi)部項(xiàng)目核心訴求是讓一個(gè)Agent能夠像人一樣操作我們公司某款Electron桌面客戶(hù)端自動(dòng)完成錄入、查詢(xún)、導(dǎo)出這一連串動(dòng)作。最開(kāi)始想的是圖像識(shí)別加模擬鍵鼠試了幾天發(fā)現(xiàn)全是坑窗口一遮擋坐標(biāo)就偏、高分屏DPI縮放直接讓點(diǎn)擊位置漂移、頁(yè)面元素稍微變個(gè)樣式腳本就崩。后來(lái)我想到Electron的底層其實(shí)是Chromium既然瀏覽器可以通過(guò)CDP協(xié)議被人遠(yuǎn)程控制那Electron桌面應(yīng)用理論上也應(yīng)該可以。折騰了兩周最終用CDP協(xié)議打通了一條完全不同的路子——不依賴(lài)坐標(biāo)、不依賴(lài)圖像識(shí)別直接通過(guò)協(xié)議精準(zhǔn)操作應(yīng)用內(nèi)的DOM元素。這篇文章就把我從零摸到可用的整個(gè)過(guò)程、代碼和踩過(guò)的坑完整記錄下來(lái)希望能給正在做Agent自動(dòng)化操作桌面應(yīng)用的朋友一些參考。剛開(kāi)始接觸CDP協(xié)議時(shí)我以為它只能調(diào)試網(wǎng)頁(yè)但它的能力邊界其實(shí)遠(yuǎn)超“F12開(kāi)發(fā)者工具”的范疇。依賴(lài)DOM和運(yùn)行時(shí)求值我們不僅能在Electron應(yīng)用內(nèi)讀取任意頁(yè)面數(shù)據(jù)、觸發(fā)點(diǎn)擊和輸入事件還能調(diào)用應(yīng)用內(nèi)已經(jīng)暴露的接口、監(jiān)聽(tīng)網(wǎng)絡(luò)請(qǐng)求、攔截響應(yīng)甚至直接操作應(yīng)用內(nèi)部狀態(tài)。這對(duì)Agent來(lái)說(shuō)是個(gè)巨大優(yōu)勢(shì)它可以像真實(shí)用戶(hù)在頁(yè)面上完成操作又不用依賴(lài)脆弱的視覺(jué)算法穩(wěn)定性高出一個(gè)數(shù)量級(jí)。1. 項(xiàng)目思路為什么選擇CDP方案操作Electron應(yīng)用1.1 桌面應(yīng)用自動(dòng)化的三條技術(shù)路線對(duì)比在動(dòng)手之前我認(rèn)真比較過(guò)市面上主流的桌面自動(dòng)化方案大致分成三類(lèi)。第一類(lèi)是傳統(tǒng)鍵鼠模擬工具這類(lèi)方案的思路是記住屏幕上的固定位置然后通過(guò)調(diào)用系統(tǒng)接口移動(dòng)鼠標(biāo)、執(zhí)行點(diǎn)擊和鍵盤(pán)輸入。優(yōu)點(diǎn)是通用性強(qiáng)幾乎什么軟件都能驅(qū)動(dòng)缺點(diǎn)是穩(wěn)定性極度依賴(lài)窗口狀態(tài)。窗口一移動(dòng)、一最小化、一被遮擋整個(gè)腳本就廢了。再加上高DPI環(huán)境下屏幕坐標(biāo)系會(huì)縮放同一個(gè)按鈕在不同分辨率屏幕上的位置完全不同維護(hù)成本很高。第二類(lèi)是圖像識(shí)別方案原理是持續(xù)截屏然后在截圖中用模板匹配或深度學(xué)習(xí)找目標(biāo)元素。這種方案在游戲自動(dòng)化領(lǐng)域用得比較多因?yàn)橛螒颦h(huán)境里沒(méi)有其他控制通道。但在偏辦公類(lèi)的Electron應(yīng)用里它的問(wèn)題是性能開(kāi)銷(xiāo)大、識(shí)別有延遲、而且對(duì)UI微調(diào)過(guò)于敏感。換個(gè)按鈕圓角、改個(gè)圖標(biāo)配色識(shí)別準(zhǔn)確率就會(huì)斷崖式下降。第三類(lèi)就是我要說(shuō)的CDP協(xié)議方案核心思路是Electron應(yīng)用本質(zhì)上跑著一個(gè)完整的Chromium實(shí)例Chromium天然支持遠(yuǎn)程調(diào)試協(xié)議那我們完全可以繞過(guò)屏幕坐標(biāo)直接通過(guò)協(xié)議讀寫(xiě)應(yīng)用內(nèi)DOM、派發(fā)事件、求值JS代碼。這個(gè)方案的好處是穩(wěn)定性極高元素位置隨便變、窗口隨便移動(dòng)都不影響腳本因?yàn)樗僮鞯氖琼?yè)面內(nèi)部的對(duì)象結(jié)構(gòu)而不是屏幕上的像素坐標(biāo)。1.2 CDP方案解決的核心痛點(diǎn)選擇CDP最直接的原因是它解決了我們項(xiàng)目里兩個(gè)最難纏的問(wèn)題。第一個(gè)問(wèn)題是“窗口遮擋”。我們的Agent需要并發(fā)處理多個(gè)任務(wù)經(jīng)常會(huì)在多個(gè)應(yīng)用窗口之間切換傳統(tǒng)鍵鼠方案一旦遇到后臺(tái)窗口被遮擋就完全束手無(wú)策。而CDP方案操作的是頁(yè)面內(nèi)部結(jié)構(gòu)根本不需要窗口處于前臺(tái)甚至窗口最小化了它照樣能執(zhí)行點(diǎn)擊和輸入。這個(gè)特性對(duì)我們來(lái)說(shuō)至關(guān)重要意味著Agent可以同時(shí)“操作”多個(gè)實(shí)例而不用管哪個(gè)窗口在最上面。第二個(gè)問(wèn)題是“元素定位精度”。用了CDP之后定位一個(gè)輸入框就是一句document.querySelector(#username)的事情穩(wěn)定到不管CSS怎么改都能找到。如果元素加了>[客戶(hù)端] ---HTTP GET /json/list--- [Electron應(yīng)用調(diào)試服務(wù)] ---targetId列表--- [客戶(hù)端] ---WebSocket連接 ws://...--- [Electron應(yīng)用調(diào)試服務(wù)] ---發(fā)送命令 {id:1,method:DOM.enable}--- [客戶(hù)端] ---收到結(jié)果 {id:1,result:{}}---日常使用中90%的命令都是單向請(qǐng)求響應(yīng)模式。協(xié)議里也有事件推送機(jī)制比如頁(yè)面加載完成、DOM節(jié)點(diǎn)更新、控制臺(tái)輸出這些都會(huì)主動(dòng)推給客戶(hù)端這點(diǎn)在我們后面做動(dòng)態(tài)等待的時(shí)候會(huì)很關(guān)鍵。2.2 為什么Electron應(yīng)用天然支持CDPElectron應(yīng)用之所以能直接用CDP協(xié)議控制根本原因是它本身就是基于Chromium外殼的。Electron官方其實(shí)屏蔽了一部分Chromium的調(diào)試能力但只要我們啟動(dòng)的時(shí)候加上一個(gè)遠(yuǎn)程調(diào)試端口參數(shù)完整的CDP功能就會(huì)暴露出來(lái)。具體來(lái)說(shuō)在啟動(dòng)Electron應(yīng)用的時(shí)候加上--remote-debugging-port9222Electron主進(jìn)程就會(huì)在9222端口開(kāi)啟一個(gè)調(diào)試服務(wù)。這個(gè)調(diào)試服務(wù)不僅能發(fā)現(xiàn)所有已經(jīng)打開(kāi)的窗口還能讓外部客戶(hù)端通過(guò)CDP協(xié)議和這些窗口的渲染進(jìn)程建立實(shí)時(shí)通信通道。這里有個(gè)Electron特有的坑要特別注意Electron應(yīng)用可能有多個(gè)窗口而每個(gè)窗口在CDP協(xié)議里都是一個(gè)獨(dú)立的Target。所以連接時(shí)要先通過(guò)HTTP接口拿到所有Target列表再根據(jù)title或url字段篩選出我們要操作的那個(gè)窗口而不是默認(rèn)連接第一個(gè)。有一點(diǎn)值得說(shuō)明Electron渲染進(jìn)程和普通Chrome頁(yè)面在CDP層面上幾乎沒(méi)有區(qū)別原本為瀏覽器自動(dòng)化設(shè)計(jì)的工具和庫(kù)在Electron應(yīng)用上都能無(wú)縫使用。這意味著生態(tài)里現(xiàn)成的Node.js庫(kù)、Python客戶(hù)端在這一場(chǎng)景下都能用。2.3 協(xié)議中Agent操作高頻依賴(lài)的能力域CDP協(xié)議按功能劃分了幾十個(gè)模塊做Agent操作時(shí)不需要所有模塊全用熟練掌握下面幾個(gè)就夠覆蓋95%以上的場(chǎng)景了。Runtime域用來(lái)在頁(yè)面上下文里執(zhí)行任意JavaScript代碼這算是整個(gè)協(xié)議最核心的入口。Runtime.evaluate可以執(zhí)行表達(dá)式并返回結(jié)果Runtime.callFunctionOn可以在指定對(duì)象上調(diào)用函數(shù)。Agent的很多操作本質(zhì)上就是組合各種JS代碼去實(shí)現(xiàn)。DOM域負(fù)責(zé)文檔對(duì)象模型的查詢(xún)和操作。DOM.getDocument拿到文檔根節(jié)點(diǎn)、DOM.querySelector從根節(jié)點(diǎn)往下找目標(biāo)元素、DOMDebugger用來(lái)調(diào)試監(jiān)聽(tīng)等。但我們實(shí)際項(xiàng)目里更多是用Runtime.evaluate直接跑document.querySelector來(lái)代替DOM域接口因?yàn)檫@樣寫(xiě)起來(lái)更自然而且要獲取的上下文信息更直接。Input域是模擬用戶(hù)輸入的關(guān)鍵模塊。Input.dispatchMouseEvent可以派發(fā)鼠標(biāo)按下、釋放、移動(dòng)事件Input.dispatchKeyEvent派發(fā)鍵盤(pán)事件。這套接口模擬的是系統(tǒng)輸入層的事件觸發(fā)的行為比直接調(diào)用JS的element.click()更接近真實(shí)用戶(hù)操作會(huì)觸發(fā)完整的鼠標(biāo)懸停、激活、焦點(diǎn)切換等狀態(tài)流。Page域用來(lái)管理系統(tǒng)頁(yè)面狀態(tài)。Page.navigate跳轉(zhuǎn)導(dǎo)航、Page.reload刷新頁(yè)面、Page.captureScreenshot截圖以及Page.setDeviceMetricsOverride模擬設(shè)備尺寸等。對(duì)Agent自動(dòng)操作桌面應(yīng)用來(lái)說(shuō)Page.captureScreenshot在出了問(wèn)題時(shí)抓現(xiàn)場(chǎng)特別有用。Network域能攔截和查看網(wǎng)絡(luò)請(qǐng)求。Agent在操作過(guò)程中可能需要等待某個(gè)接口返回后才能繼續(xù)下一步這個(gè)域可以監(jiān)聽(tīng)請(qǐng)求響應(yīng)作為操作完成與否的判據(jù)。這些模塊組合起來(lái)就能構(gòu)建一個(gè)完整的自動(dòng)化操作閉環(huán)定位元素、讀取狀態(tài)、執(zhí)行交互、驗(yàn)證結(jié)果、異常兜底。3. 環(huán)境準(zhǔn)備啟動(dòng)帶調(diào)試端口的Electron應(yīng)用3.1 修改Electron應(yīng)用啟動(dòng)方式要讓CDP協(xié)議能連上Electron應(yīng)用第一步是讓?xiě)?yīng)用以調(diào)試模式啟動(dòng)。最簡(jiǎn)單的做法是在應(yīng)用入口文件里通過(guò)app.commandLine.appendSwitch添加參數(shù)也可以直接在終端啟動(dòng)命令后面拼接參數(shù)。在終端里啟動(dòng)的命令是這樣的./your-electron-app --remote-debugging-port9222不過(guò)這種方式有個(gè)不方便的地方如果Electron應(yīng)用的啟動(dòng)是通過(guò)雙擊桌面圖標(biāo)完成的那命令行參數(shù)就傳不進(jìn)去。我們項(xiàng)目里的做法是在Electron主進(jìn)程代碼里強(qiáng)制開(kāi)啟調(diào)試端口這樣不管用戶(hù)怎么啟動(dòng)應(yīng)用調(diào)試服務(wù)都會(huì)自動(dòng)掛在預(yù)設(shè)端口上。// main.js const { app } require(electron) app.commandLine.appendSwitch(remote-debugging-port, 9222) app.commandLine.appendSwitch(remote-allow-origins, *) app.whenReady().then(() { // 正常啟動(dòng)應(yīng)用邏輯 })這里有一個(gè)安全相關(guān)的設(shè)置需要格外注意remote-allow-origins參數(shù)如果你不主動(dòng)設(shè)置新版Chromium會(huì)默認(rèn)校驗(yàn)WebSocket連接的來(lái)源域名。我們一開(kāi)始連接時(shí)一直報(bào)403錯(cuò)誤找了好幾輪才發(fā)現(xiàn)是這個(gè)配置問(wèn)題。本地自動(dòng)化場(chǎng)景直接設(shè)為*通配符就行但如果在公網(wǎng)環(huán)境使用一定要收緊這個(gè)配置。3.2 多實(shí)例運(yùn)行時(shí)的端口規(guī)劃我們的Agent要支持并發(fā)操作多個(gè)Electron實(shí)例所以統(tǒng)一的固定端口滿足不了需求。解決方法是讓每個(gè)應(yīng)用實(shí)例啟動(dòng)時(shí)自動(dòng)分配一個(gè)獨(dú)立端口然后把端口號(hào)傳給Agent調(diào)度器。Electron應(yīng)用可以通過(guò)環(huán)境變量來(lái)指定端口號(hào)const debugPort process.env.DEBUG_PORT || 9222 app.commandLine.appendSwitch(remote-debugging-port, debugPort)調(diào)度端為每個(gè)實(shí)例動(dòng)態(tài)分配可用端口#!/bin/bash BASE_PORT9400 for i in {1..5} do CURRENT_PORT$((BASE_PORT i)) DEBUG_PORT$CURRENT_PORT ./your-electron-app echo Instance $i started on port $CURRENT_PORT done這樣多個(gè)實(shí)例就能并行跑在各自獨(dú)立的調(diào)試端口上Agent可以針對(duì)每個(gè)端口各建一條CDP連接互不干擾。實(shí)測(cè)下來(lái)單機(jī)跑幾十個(gè)實(shí)例沒(méi)有性能瓶頸主要卡在內(nèi)存和CPU資源上。3.3 確認(rèn)調(diào)試服務(wù)已就緒應(yīng)用啟動(dòng)之后需要用命令行驗(yàn)證一下調(diào)試服務(wù)是否正常開(kāi)啟。瀏覽器打開(kāi)或curl請(qǐng)求下面這個(gè)地址curl http://127.0.0.1:9222/json/version如果一切正常會(huì)返回一段JSON里面包含Browser版本號(hào)、webSocketDebuggerUrl和chrome-version這些關(guān)鍵信息。再訪問(wèn)/json/list就能看到當(dāng)前應(yīng)用打開(kāi)的每個(gè)頁(yè)面窗口的詳細(xì)信息了。[ { description: , devtoolsFrontendUrl: /devtools/inspector.html?ws127.0.0.1:9222/devtools/page/xxxxx, id: A8C1E992F502CF11B6E9C56F33756D2A, title: 工作臺(tái), type: page, url: file:///app/index.html, webSocketDebuggerUrl: ws://127.0.0.1:9222/devtools/page/A8C1E992F502CF11B6E9C56F33756D2A } ]我這里會(huì)重點(diǎn)看webSocketDebuggerUrl字段它是后續(xù)建立WebSocket連接的入口。而title字段幫我們從多個(gè)窗口里挑出要控制的那一個(gè)。4. 核心實(shí)操用Node.js手寫(xiě)一個(gè)CDP客戶(hù)端4.1 建立WebSocket連接我選擇用Node.js寫(xiě)客戶(hù)端因?yàn)镋lectron應(yīng)用前端本身就是JavaScript環(huán)境而且Node.js的WebSocket生態(tài)非常成熟。項(xiàng)目里用的庫(kù)是ws它輕量穩(wěn)定在NPM上可以直接安裝。npm install ws創(chuàng)建一個(gè)cdp-client.js文件先實(shí)現(xiàn)最基礎(chǔ)的連接邏輯const WebSocket require(ws) class CDPClient { constructor(wsUrl) { this.wsUrl wsUrl this.ws null this.callbacks new Map() this.eventHandlers new Map() this.commandId 0 } connect() { return new Promise((resolve, reject) { this.ws new WebSocket(this.wsUrl, { maxPayload: 256 * 1024 * 1024 }) this.ws.on(open, () { console.log([CDP] WebSocket connected) resolve() }) this.ws.on(message, (data) { const msg JSON.parse(data.toString()) if (msg.id) { const callback this.callbacks.get(msg.id) if (callback) { this.callbacks.delete(msg.id) if (msg.error) { callback.reject(new Error(msg.error.message)) } else { callback.resolve(msg.result) } } } else { // 事件消息 const handlers this.eventHandlers.get(msg.method) if (handlers) { handlers.forEach((handler) handler(msg.params)) } } }) this.ws.on(error, (err) { console.error([CDP] WebSocket error:, err.message) reject(err) }) this.ws.on(close, () { console.log([CDP] WebSocket closed) }) }) } send(method, params {}) { return new Promise((resolve, reject) { const id this.commandId this.callbacks.set(id, { resolve, reject }) this.ws.send(JSON.stringify({ id, method, params })) }) } on(method, handler) { if (!this.eventHandlers.has(method)) { this.eventHandlers.set(method, []) } this.eventHandlers.get(method).push(handler) } }這個(gè)實(shí)現(xiàn)里藏了一個(gè)特別重要的細(xì)節(jié)maxPayload參數(shù)一定要調(diào)大。Chromium的CDP服務(wù)端默認(rèn)消息大小限制很低但我們的自動(dòng)化場(chǎng)景里經(jīng)常要一次傳輸大量DOM數(shù)據(jù)尤其頁(yè)面復(fù)雜時(shí)DOM.getDocument接口返回的序列化結(jié)果可能達(dá)到幾十MB。不調(diào)大這個(gè)參數(shù)消息一超過(guò)限制WebSocket就會(huì)靜默斷開(kāi)排查起來(lái)讓人非常抓狂。4.2 常用命令封裝連接建立后我會(huì)把高頻操作封裝成一個(gè)個(gè)獨(dú)立方法這樣Agent邏輯層寫(xiě)起來(lái)就像調(diào)用本地函數(shù)一樣自然。class CDPClient { // 獲取文檔樹(shù) async getDocument() { const result await this.send(DOM.getDocument, { depth: -1 }) return result.root } // 通過(guò)選擇器查找元素節(jié)點(diǎn)ID async querySelector(nodeId, selector) { const result await this.send(DOM.querySelector, { nodeId, selector }) return result.nodeId } // 執(zhí)行JavaScript表達(dá)式 async evaluate(expression, awaitPromise true) { const result await this.send(Runtime.evaluate, { expression, awaitPromise, returnByValue: true }) if (result.exceptionDetails) { throw new Error(頁(yè)面執(zhí)行JS出錯(cuò): result.exceptionDetails.text) } return result.result.value } // 模擬鼠標(biāo)點(diǎn)擊基于元素中心坐標(biāo) async clickBySelector(selector) { const expr (() { const el document.querySelector(${selector}) if (!el) return null const rect el.getBoundingClientRect() return { x: rect.left rect.width / 2, y: rect.top rect.height / 2, text: el.innerText } })() const { x, y } await this.evaluate(expr) if (x null) return false await this.send(Input.dispatchMouseEvent, { type: mousePressed, x: Math.round(x), y: Math.round(y), button: left, clickCount: 1 }) await this.send(Input.dispatchMouseEvent, { type: mouseReleased, x: Math.round(x), y: Math.round(y), button: left, clickCount: 1 }) return true } }這里關(guān)于點(diǎn)擊坐標(biāo)有個(gè)需要說(shuō)清楚的關(guān)鍵細(xì)節(jié)頁(yè)面里的getBoundingClientRect()拿到的是CSS像素坐標(biāo)而Input.dispatchMouseEvent默認(rèn)按物理像素解釋兩者在非100%縮放比下會(huì)不一致。Electron應(yīng)用頁(yè)面里如果設(shè)置了zoomFactor或系統(tǒng)DPI縮放坐標(biāo)就會(huì)偏移。穩(wěn)妥的做法是在連接建立后先讀取設(shè)備的縮放比例然后把坐標(biāo)手動(dòng)換算過(guò)去。async getDeviceMetrics() { const metrics await this.send(Page.getLayoutMetrics) const { cssScaleFactor } metrics return { scaleFactor: cssScaleFactor, viewportWidth: metrics.cssLayoutViewport.clientWidth, viewportHeight: metrics.cssLayoutViewport.clientHeight } }拿到cssScaleFactor之后凡是需要派發(fā)鼠標(biāo)事件的坐標(biāo)統(tǒng)統(tǒng)用x / scaleFactor換算后再發(fā)給CDP服務(wù)端就能徹底規(guī)避縮放導(dǎo)致的點(diǎn)擊偏移問(wèn)題。4.3 完整操作流程示例下面給一個(gè)Agent自動(dòng)登錄并執(zhí)行查詢(xún)的完整代碼示例這里模擬的場(chǎng)景是打開(kāi)某個(gè)客戶(hù)管理桌面應(yīng)用自動(dòng)登錄、跳轉(zhuǎn)到客戶(hù)列表頁(yè)、輸入關(guān)鍵字搜索、提取搜索結(jié)果。const CDPClient require(./cdp-client) async function getTargetList(baseUrl) { const res await fetch(http://127.0.0.1:9222/json/list) const targets await res.json() return targets.filter((t) t.type page) } async function startAgent() { const targets await getTargetList(http://127.0.0.1:9222) const target targets.find((t) t.title.includes(客戶(hù)管理)) if (!target) { throw new Error(未找到目標(biāo)窗口請(qǐng)檢查應(yīng)用是否已打開(kāi)客戶(hù)管理界面) } const client new CDPClient(target.webSocketDebuggerUrl) await client.connect() // 啟用相關(guān)域 await client.send(Runtime.enable) await client.send(Page.enable) // 1. 等待頁(yè)面加載完成 await client.send(Page.reload) await waitForPageLoad(client) // 2. 自動(dòng)填充登錄表單 await client.evaluate( document.querySelector(#username).value admin document.querySelector(#password).value 123456 ) // 觸發(fā)React/Vue框架的input事件 await client.evaluate( const input document.querySelector(#username) input.dispatchEvent(new Event(input, { bubbles: true })) ) await client.clickBySelector(.login-btn) // 3. 等待登錄跳轉(zhuǎn) await waitForSelector(client, .customer-list-page, 10000) // 4. 輸入搜索關(guān)鍵字 await client.evaluate( const searchInput document.querySelector(#search-input) const nativeInputValueSetter Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, value).set nativeInputValueSetter.call(searchInput, 張三) searchInput.dispatchEvent(new Event(input, { bubbles: true })) ) await client.clickBySelector(.search-button) // 5. 提取搜索結(jié)果表格數(shù)據(jù) const rows await client.evaluate( (() { const items [] document.querySelectorAll(.customer-table tbody tr).forEach((tr) { items.push({ name: tr.querySelector(.col-name).innerText, phone: tr.querySelector(.col-phone).innerText, status: tr.querySelector(.col-status).innerText }) }) return items })() ) console.log(查詢(xún)到客戶(hù)數(shù)據(jù):, JSON.stringify(rows, null, 2)) // 6. 截圖留檔 const screenshot await client.send(Page.captureScreenshot, { format: png }) require(fs).writeFileSync(result.png, Buffer.from(screenshot.data, base64)) client.ws.close() } async function waitForPageLoad(client) { return new Promise((resolve) { const timer setTimeout(() resolve(), 10000) client.on(Page.loadEventFired, () { clearTimeout(timer) resolve() }) }) } async function waitForSelector(client, selector, timeout 5000) { const start Date.now() while (Date.now() - start timeout) { const exists await client.evaluate(!!document.querySelector(${selector})) if (exists) return true await new Promise((r) setTimeout(r, 200)) } throw new Error(等待超時(shí): 未找到元素 ${selector}) } startAgent().catch((err) { console.error(Agent執(zhí)行出錯(cuò):, err) process.exit(1) })這個(gè)流程跑起來(lái)之后我第一感受是整個(gè)過(guò)程實(shí)在太流暢了。沒(méi)有惱人的坐標(biāo)計(jì)算沒(méi)有脆弱到讓人崩潰的截圖比對(duì)每個(gè)步驟都像在寫(xiě)前端測(cè)試用例。更關(guān)鍵的是調(diào)試體驗(yàn)有了質(zhì)的飛升——CDP協(xié)議自帶的DevTools界面能實(shí)時(shí)看到Agent當(dāng)前操作到了頁(yè)面什么位置出問(wèn)題的時(shí)候打開(kāi)開(kāi)發(fā)者工具立刻就能看清頁(yè)面真實(shí)狀態(tài)。5. 更省力的做法用Puppeteer庫(kù)連接現(xiàn)成的Electron實(shí)例5.1 Puppeteer.connect怎樣復(fù)用已有應(yīng)用人肉手寫(xiě)WebSocket客戶(hù)端的好處是靈活可控所有細(xì)節(jié)都捏在自己手里但日常業(yè)務(wù)開(kāi)發(fā)我更建議直接選用成熟庫(kù)——Puppeteer生態(tài)就是其中一個(gè)相當(dāng)省力的選擇。Puppeteer有個(gè)很實(shí)用的能力不只能自己?jiǎn)?dòng)瀏覽器還能連接一個(gè)已經(jīng)在運(yùn)行的Chromium實(shí)例。這個(gè)模式和我們?cè)贓lectron里用CDP的場(chǎng)景簡(jiǎn)直是天作之合Electron應(yīng)用自己?jiǎn)?dòng)Puppeteer負(fù)責(zé)連上去控制它。這樣Agent代碼寫(xiě)起來(lái)完全不需要關(guān)心WebSocket底層細(xì)節(jié)。const puppeteer require(puppeteer) async function attachToElectron() { const browser await puppeteer.connect({ browserURL: http://127.0.0.1:9222, defaultViewport: null }) const pages await browser.pages() console.log(發(fā)現(xiàn)窗口數(shù)量:, pages.length) // 找到目標(biāo)頁(yè)面 const targetPage pages.find((page) page.title().includes(客戶(hù)管理)) // 現(xiàn)在可以用Page對(duì)象做一切操作了 await targetPage.type(#username, admin) await targetPage.click(.login-btn) await targetPage.waitForSelector(.customer-list-page, { timeout: 10000 }) const data await targetPage.evaluate(() { return document.querySelector(.customer-info).innerText }) console.log(獲取到數(shù)據(jù):, data) }需要重點(diǎn)說(shuō)明一個(gè)參數(shù)defaultViewport: null這個(gè)必須顯式設(shè)置。因?yàn)镻uppeteer默認(rèn)會(huì)給頁(yè)面套一個(gè)800x600的視口如果不關(guān)掉它頁(yè)面布局會(huì)和正常桌面應(yīng)用完全不一樣——某些元素會(huì)被折疊到響應(yīng)式布局的移動(dòng)端形態(tài)里點(diǎn)擊定位全都亂套。連Electron應(yīng)用時(shí)一定要保持應(yīng)用原有的桌面視口。5.2 和手寫(xiě)客戶(hù)端的選型對(duì)比Puppeteer庫(kù)本身還是一層殼它和CDP的關(guān)系可以理解成這樣Puppeteer的API把CDP復(fù)雜的協(xié)議細(xì)節(jié)全部包裝成了緊湊方法page.click對(duì)應(yīng)點(diǎn)擊坐標(biāo)計(jì)算、page.waitForSelector對(duì)應(yīng)輪詢(xún)DOM查詢(xún)、page.evaluate對(duì)應(yīng)運(yùn)行時(shí)求值。該封裝的都封裝好了調(diào)用體驗(yàn)確實(shí)比純手寫(xiě)友好很多。但封裝也意味著控制粒度變粗。如果你需要深度定制協(xié)議行為——比如攔截特定網(wǎng)絡(luò)請(qǐng)求、獲取HTTP響應(yīng)的原始頭部、監(jiān)聽(tīng)復(fù)雜的底層事件流——Puppeteer提供的接口可能又成了阻礙這時(shí)候就得靠page._client().send(Network.getResponseBody)這類(lèi)半私有接口或者干脆自己建WebSocket連接。兩個(gè)方案我給出的適用建議是業(yè)務(wù)邏輯快速驗(yàn)證、Agent原型搭建直接用Puppeteer庫(kù)開(kāi)發(fā)效率最高需要深度定制協(xié)議行為、集成到生產(chǎn)環(huán)境的Agent底座里手寫(xiě)一個(gè)薄客戶(hù)端更可控因?yàn)槊總€(gè)連接狀態(tài)、每條命令的結(jié)果都由你自己管理。我們團(tuán)隊(duì)最終的生產(chǎn)實(shí)現(xiàn)是兩者結(jié)合外部用Puppeteer做交互編排關(guān)鍵底層節(jié)點(diǎn)通過(guò)手寫(xiě)CDP客戶(hù)端做定制擴(kuò)展。各有各擅長(zhǎng)的地方。5.3 連接時(shí)的常見(jiàn)坑Puppeteer連接Electron實(shí)例時(shí)有幾個(gè)點(diǎn)是經(jīng)常踩到的。Puppeteer庫(kù)的版本是一個(gè)關(guān)鍵變量不同大版本的connect實(shí)現(xiàn)細(xì)節(jié)會(huì)有差異。舊版本可能走舊握手流程新版本對(duì)協(xié)議版本的要求也不同。建議優(yōu)先使用當(dāng)前最新的穩(wěn)定版本遇到握手失敗先查版本兼容。連接超時(shí)和環(huán)境變量也要注意默認(rèn)情況下Puppeteer連不上會(huì)很快就報(bào)錯(cuò)可以手動(dòng)加大超時(shí)參數(shù)。同時(shí)檢查啟動(dòng)Electron應(yīng)用的環(huán)境變量里是否設(shè)置了影響Chromium網(wǎng)絡(luò)棧的參數(shù)。還有一個(gè)窗口識(shí)別的問(wèn)題Electron應(yīng)用經(jīng)常會(huì)彈出子窗口、加載iframe、開(kāi)DevTools面板這些都會(huì)在Target列表里多出噪點(diǎn)。找目標(biāo)窗口時(shí)一定要用title字段做精確匹配甚至通過(guò)URL特征過(guò)濾避免連到DevTools或隱藏的后臺(tái)窗口上。6. 實(shí)戰(zhàn)中的棘手問(wèn)題和排查方法6.1 WebSocket連接被403拒絕這個(gè)問(wèn)題的主要原因是前面提到的remote-allow-origins校驗(yàn)。Chrome從某個(gè)版本開(kāi)始對(duì)WebSocket連接有了來(lái)源校驗(yàn)?zāi)J(rèn)拒絕來(lái)自非DevTools前端的連接。Node.js的WebSocket客戶(hù)端發(fā)起的握手請(qǐng)求沒(méi)有合法的Origin來(lái)源會(huì)被服務(wù)端攔下。解決辦法是在Electron主進(jìn)程啟動(dòng)參數(shù)里加上--remote-allow-origins*放開(kāi)來(lái)源限制。如果安全要求比較高也可以把這行參數(shù)改為只允許可信來(lái)源但本地自動(dòng)化場(chǎng)景直接放開(kāi)是最高效的。6.2 獲取不到任何Target列表/json/list接口返回空數(shù)組的原因通常是Electron應(yīng)用沒(méi)有渲染出頁(yè)面窗口。Electron應(yīng)用如果創(chuàng)建了后臺(tái)隱藏窗口或者頁(yè)面還在加載過(guò)程中窗口還沒(méi)注冊(cè)到調(diào)試服務(wù)Target列表就可能短暫為空。處理方案是等待幾秒再刷新列表并過(guò)濾掉type不為page的空條目。還有一種原因是Electron應(yīng)用開(kāi)啟了GPU加速導(dǎo)致的啟動(dòng)異常渲染進(jìn)程崩潰或者卡在初始化階段。用app.disableHardwareAcceleration()關(guān)掉GPU加速再試如果恢復(fù)了就把這個(gè)配置加到生產(chǎn)啟動(dòng)參數(shù)里。6.3 React/Vue框架輸入框值不生效直接給輸入框設(shè)置value屬性然后dispatch事件這是最經(jīng)典的框架綁定失效場(chǎng)景。React或者Vue的受控組件會(huì)維護(hù)自己的內(nèi)部狀態(tài)直接設(shè)置DOM的value屬性框架狀態(tài)完全感知不到表單提交的時(shí)候值始終是空的。解決辦法是用原生屬性描述符的方式觸發(fā)框架的setterconst nativeInputValueSetter Object.getOwnPropertyDescriptor( window.HTMLInputElement.prototype, value ).set nativeInputValueSetter.call(input, 目標(biāo)值) input.dispatchEvent(new Event(input, { bubbles: true }))實(shí)測(cè)下來(lái)這個(gè)方法能穩(wěn)定觸發(fā)React的onChange和Vue的v-model更新。這個(gè)技巧在做Agent自動(dòng)化時(shí)幾乎天天用是繞不開(kāi)的核心技能。6.4 點(diǎn)擊事件不觸發(fā)通過(guò)Input.dispatchMouseEvent派發(fā)鼠標(biāo)事件時(shí)有個(gè)細(xì)節(jié)容易被忽略坐標(biāo)必須換算成相對(duì)視口的坐標(biāo)不能用頁(yè)面的絕對(duì)坐標(biāo)。如果頁(yè)面發(fā)生過(guò)滾動(dòng)絕對(duì)坐標(biāo)點(diǎn)擊的位置就和視覺(jué)上的位置對(duì)不上。另一個(gè)原因是某些按鈕是通過(guò)CSS偽元素覆蓋來(lái)實(shí)現(xiàn)點(diǎn)擊的鼠標(biāo)事件雖然派發(fā)了但事件被覆蓋層攔截掉底層按鈕收不到。這種情況可以先讓Agent檢查一下目標(biāo)元素在視口中的位置有沒(méi)有被其他元素遮擋如果有遮擋就先把遮擋元素移開(kāi)或隱藏再點(diǎn)擊。6.5 執(zhí)行過(guò)程中頁(yè)面跳轉(zhuǎn)過(guò)快頁(yè)面跳轉(zhuǎn)導(dǎo)航時(shí)CDP連接會(huì)自動(dòng)隨著頁(yè)面Target的更新而重建此時(shí)之前建立的連接可能失效。處理邏輯是監(jiān)聽(tīng)Page.frameNavigated事件一旦發(fā)現(xiàn)主框架導(dǎo)航完成就重新獲取文檔樹(shù)和上下文。我之前寫(xiě)過(guò)一個(gè)輪詢(xún)waitForSelector邏輯也遇到過(guò)這個(gè)坑后面加了導(dǎo)航監(jiān)聽(tīng)和重建邏輯后就徹底穩(wěn)定了。Agent在操作過(guò)程中還會(huì)遇到子框架的多層嵌套。定位元素前先確認(rèn)這個(gè)元素是主文檔里的還是iframe里的如果是iframe內(nèi)的元素Runtime.evaluate的計(jì)算上下文要切換成對(duì)應(yīng)的executionContextId不然JS代碼執(zhí)行時(shí)找不到元素。7. 工程化實(shí)踐Agent工具的封裝思路7.1 命令層級(jí)的拆解到這一步CDP連接和基本操作已經(jīng)跑通了。但生產(chǎn)環(huán)境里的Agent不能是系列零散腳本需要工程化地去封裝。我按職責(zé)拆分成了三個(gè)層級(jí)從底層往上依次是連接層、能力層、場(chǎng)景層。連接層負(fù)責(zé)管理WebSocket生命周期、多實(shí)例連接池、斷線重連。能力層基于CDP協(xié)議封裝了元素定位、文本操作、事件派發(fā)、數(shù)據(jù)提取這些通用原子能力。場(chǎng)景層則是根據(jù)具體業(yè)務(wù)流程做的組合比如“登錄流程”、“查詢(xún)流程”、“導(dǎo)出流程”每個(gè)流程都是一串能力層動(dòng)作的有序編排。class AgentConnector { constructor() { this.connections new Map() } async connectInstance(instanceId, port) { const targets await this.getTargets(port) const target targets.find((t) t.title.includes(主窗口)) const client new CDPClient(target.webSocketDebuggerUrl) await client.connect() this.connections.set(instanceId, client) return client } } class ElementActions { constructor(client) { this.client client } async fill(selector, value) { await this.client.evaluate( (() { const el document.querySelector(${selector}) const setter Object.getOwnPropertyDescriptor( window.HTMLInputElement.prototype, value).set setter.call(el, ${value}) el.dispatchEvent(new Event(input, { bubbles: true })) })() ) } async waitText(selector, text, timeout 5000) { /* 輪詢(xún)等待文本出現(xiàn) */ } }7.2 斷線重連與操作補(bǔ)償Electron應(yīng)用理論上不會(huì)頻繁重啟但運(yùn)行幾天后內(nèi)存占用上升、渲染進(jìn)程卡死也是常事。Agent底座必須具備斷線檢測(cè)和自動(dòng)重連能力。我的實(shí)現(xiàn)里把“斷線重連”分成了兩層WebSocket層面的自動(dòng)重連和業(yè)務(wù)操作層面的冪等補(bǔ)償。WebSocket層面監(jiān)聽(tīng)close事件后暫停當(dāng)前任務(wù)按指數(shù)退避策略重新獲取Target列表并重新建立連接。這個(gè)過(guò)程可能失敗幾次但重試個(gè)三五次一般都能恢復(fù)。業(yè)務(wù)層面更復(fù)雜也是經(jīng)驗(yàn)所在。舉個(gè)例子Agent剛點(diǎn)完“提交訂單”按鈕WebSocket斷了重新連上后這個(gè)訂單到底提交成功沒(méi)有頁(yè)面狀態(tài)是什么這時(shí)候需要有一個(gè)“操作驗(yàn)證”環(huán)節(jié)檢查頁(yè)面上的成功提示或狀態(tài)流轉(zhuǎn)判斷操作是否生效。如果沒(méi)生效再按當(dāng)前頁(yè)面狀態(tài)重新定位元素或重新執(zhí)行流程。這個(gè)補(bǔ)償邏輯是個(gè)復(fù)雜的業(yè)務(wù)問(wèn)題但反過(guò)來(lái)也說(shuō)明Agent自動(dòng)化不能只依賴(lài)底層連接更要在業(yè)務(wù)層建立可觀測(cè)、可恢復(fù)的機(jī)制。7.3 并發(fā)控制的策略我們項(xiàng)目后面從單實(shí)例擴(kuò)展到了多實(shí)例并發(fā)并發(fā)控制踩過(guò)的坑也很有參考價(jià)值。CDP連接本身是異步的WebSocket消息可以亂序到達(dá)但CDP協(xié)議要求命令響應(yīng)必須按發(fā)送順序返回嗎其實(shí)不要求每條命令靠id字段關(guān)聯(lián)所以說(shuō)多實(shí)例并發(fā)CDP線程是安全的。真正要注意的是共享資源。Electron應(yīng)用實(shí)例之間如果共享同一個(gè)本地?cái)?shù)據(jù)庫(kù)文件或同一份用戶(hù)配置目錄并發(fā)操作就可能出現(xiàn)文件鎖沖突。我的處理是給每個(gè)實(shí)例分配獨(dú)立的數(shù)據(jù)目錄--user-data-dir/tmp/app-instance-1徹底隔離各自狀態(tài)。這一點(diǎn)在部署時(shí)要格外重視不然跑著跑著某個(gè)實(shí)例就玄學(xué)崩潰。8. 這套方案對(duì)Agent行業(yè)的實(shí)際價(jià)值8.1 從“模擬人”走向“操作對(duì)象”傳統(tǒng)桌面自動(dòng)化軟件的核心思路是想方設(shè)法模擬人的行為——移動(dòng)鼠標(biāo)、敲擊鍵盤(pán)、看著屏幕判斷結(jié)果。而CDP方案本質(zhì)上是直接讀寫(xiě)系統(tǒng)內(nèi)部的對(duì)象模型相當(dāng)于跳過(guò)了模擬路徑直接針對(duì)應(yīng)用的真實(shí)語(yǔ)義結(jié)構(gòu)來(lái)操作。這種轉(zhuǎn)變帶來(lái)的穩(wěn)定性提升不用多說(shuō)更深遠(yuǎn)的意義是讓Agent開(kāi)始具備更準(zhǔn)的“結(jié)構(gòu)理解”。它能知道頁(yè)面上有一個(gè)輸入框叫#phone它的占位符提示是什么它當(dāng)前是否可編輯它的值是否符合校驗(yàn)規(guī)則——這些信息都能通過(guò)一條Runtime.evaluate命令拿到。這個(gè)信息量比單純靠屏幕像素猜目標(biāo)高出好幾個(gè)維度是所有智能決策的基礎(chǔ)。8.2 對(duì)測(cè)試自動(dòng)化和RPA領(lǐng)域的啟發(fā)這個(gè)思路對(duì)自動(dòng)化測(cè)試行業(yè)同樣有很強(qiáng)的參考價(jià)值。傳統(tǒng)UI自動(dòng)化測(cè)試主流方案是各種測(cè)試框架它們各有語(yǔ)法糖但核心思路和CDP是一致的——通過(guò)協(xié)議操作DOM。Electron應(yīng)用如果直接用CDP做測(cè)試優(yōu)勢(shì)是彈窗、系統(tǒng)對(duì)話框、原生菜單都還能繞過(guò)但業(yè)務(wù)功能回歸測(cè)試效率提升直接就是數(shù)量級(jí)的。RPA工具廠商也越來(lái)越多考慮在Electron應(yīng)用上提供CDP通道。既然應(yīng)用是基于Web技術(shù)構(gòu)建的最自然的自動(dòng)化路徑就是Web自動(dòng)化協(xié)議本身而不是做圖像識(shí)別這種吃力不討好的兜底方案?,F(xiàn)在很多RPA產(chǎn)品對(duì)接Electron應(yīng)用都是優(yōu)先走CDP路線實(shí)在沒(méi)有調(diào)試端口才fallback到圖像識(shí)別。8.3 對(duì)未來(lái)AI Agent的啟示我在做這個(gè)項(xiàng)目的過(guò)程中有一個(gè)明顯的體感CDP協(xié)議對(duì)AI Agent來(lái)說(shuō)就像給了它一雙免疫屏幕干擾的精準(zhǔn)手柄。未來(lái)的終端Agent如果要真正具備操作任意軟件完成復(fù)雜任務(wù)的能力應(yīng)用層協(xié)議通道會(huì)比視覺(jué)識(shí)別更可靠也更容易和AI的能力鏈打通?,F(xiàn)在已經(jīng)有智能Agent框架?chē)L試通過(guò)CDP協(xié)議讓大模型直接控制Electron應(yīng)用了大模型輸出意圖Agent框架將其翻譯為CDP命令序列腳本執(zhí)行操作結(jié)果回傳給模型判斷下一步動(dòng)作。這套鏈路一旦跑通AI離真正意義上對(duì)桌面軟件的自主操作就更近了一步。9. 最后的一點(diǎn)心得整套方案做下來(lái)我最大的感受是技術(shù)的核心壁壘往往不在API調(diào)用本身而在于對(duì)底層協(xié)議信息的理解深度。CDP文檔洋洋灑灑幾十個(gè)域真正打開(kāi)能力空間的其實(shí)是理解它的消息模型、事件機(jī)制、上下文限制這些細(xì)節(jié)決定了你能否在復(fù)雜業(yè)務(wù)場(chǎng)景里穩(wěn)定運(yùn)行。具體到這個(gè)方案幾件事值得再做擴(kuò)展連接池和斷線重連已經(jīng)是穩(wěn)定運(yùn)行的基石建議任何Agent項(xiàng)目都優(yōu)先做好這一層每步操作之后都加一層狀態(tài)校驗(yàn)用返回值驅(qū)動(dòng)決策而不是無(wú)腦按時(shí)間線執(zhí)行能省掉大量排查爛攤子的時(shí)間測(cè)試環(huán)境里跑通了先別急著上生產(chǎn)先把異常場(chǎng)景的截圖、日志、記錄全鏈路鋪好出了事才能快速止血操作多實(shí)例時(shí)務(wù)必隔離數(shù)據(jù)目錄和長(zhǎng)期會(huì)話資源否則并發(fā)一上來(lái)就各種靈異現(xiàn)象。如果你計(jì)劃在自己的Electron應(yīng)用上做Agent操作我的建議是最快路徑是先啟動(dòng)應(yīng)用加上調(diào)試端口用Puppeteer連上去寫(xiě)一個(gè)最小Demo把元素定位、事件派發(fā)、數(shù)據(jù)提取跑通再逐步疊加復(fù)雜場(chǎng)景。先把鏈路打通有了真實(shí)手感再談封裝和工程化。CDP這條路一旦走通Agent操作桌面應(yīng)用就不再是卑微的坐標(biāo)游戲而是一場(chǎng)徹底的結(jié)構(gòu)化對(duì)話。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美激情在线观看视频| AV在线性爱| 777琪琪午夜免费A片| 久久综合九九| 蜜桃传媒视频第一区入口在线看| 日本成人电影资源网| 日本 免费 一区二区三区 久久香蕉 | 中文字幕av亚洲精品| 99ri在线视频| 福利视频一区二区微拍| 久偷拍| 日韩欧美日韩| 国产精品经典一卡久久久 | 骚妻少妇精品性色无码四色A V| 操婢日韩| 91精品国久久久久久无码| 黑人精品XXX一区一二区| 人妻一区二区三区四区视频| 九月丁香综合网| 日韩一级二级三级免费看完整版国语版| 精品国产三级av韩国在线| 大香蕉碰碰| 久久嫩草| 无码欧美有限公司| 十八禁的黄污污免费网站| 日韩精品怡红院| 波多野结衣被操50分钟免费视频| 先锋音影AV| 大香蕉视频一二三区| 精品然女一区二区| 国产AV激情无码久久无码 | 日韩人妻网站| 精品国产乱码| 亚洲国产中文字幕| 色婷婷香蕉| 久久久久久九九九九九 | 天天做天天爱天天高潮| 国产成人拍国产亚洲精品| 热天堂一区二区| 一级做a爰片性色毛片久久| 欧美激情视频一区二区三区不卡| 樱花蜜乳av| 亚洲综合九| 日韩啪啪网| 黄骗免费网站| 99国产精品久久久在线播放| 最新国产精品久久精品| 中欧人妻丝袜中文字幕| 啊啊啊好大好湿| 亚洲日韩美女中文字幕乱| 欧美第五页| 综合啪啪| 亚洲码在线中文在线观看| 欧美日韩亚洲五月天婷婷| 日韩去日本高清在| 日韩操啪| 大香蕉99re| JULIA人妻风俗店中出电影| 欧美最婬乱婬爆婬性视频 | 国产精品天美传媒| 日韩激情啪啪| 人人操人人爽人人操人人| 欧美综合制服在线| 亚洲男人bt天堂| 国产精品毛片?v一区二区三区| 国产精品乱码久久久久久久| 九九久久九九久久| 福利视频一区二区微拍| 亚洲综合91| 久热大香蕉网站| 激情丁香五月| 无码伊人久久大杳蕉中文无码| 99精品网| 乱伦3P视频| 台湾佬大香蕉| 玖色av| 色大师网站www永久网站视频| 欧美性爱视频免费一区一A| 天天伊人| 色偷偷综合91久久噜噜| 欧美综合777| 欧美三级一级| 婷婷丁香成人| 日韩av乱伦| 黄片免费视频2019| 中文字幕一区二区三区50路| 亚洲精品久久久久久| 亚洲欧美爆| 日本欧美国内在线| 人人射人人操人人摸| 青娱乐福利99| 99无码狠狠久久| 91高清欧美| 99热日| 美女97超碰| 天天日日舔舔| 99∨VTV| av凤凰久久久| 国产第25页在线观看| 亚洲视频中文一区| 又粗又长又大国产不卡| 91熟女丨老女人| 午夜视频久久久| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | A 天堂| 亚洲黄网在哪免费看| 欧美性xxxxx狂欢| 蜜臀久久99精品久久久久电影| 综合欧美亚洲| 久草免费在线视频| 青青草色AV| 中国熟女91| 骚逼一区二区| 97视频www| 亚洲精品欧美专业| 蜜桃狠狠色伊人亚洲综合| 麻豆精品A片免费观看| 天美av在线观看| 欧美激情综合色综合啪啪五月| 欧美强奸乱能| 多乙久久久久久| αⅴ天堂| 日韩一区二区高清在线观看的| 热无码中文亚洲H一道本一区二区| 91综合在线| 国产传媒日韩| 日韩在线欧美精品一区二区| 干超碰碰熟女| 日韩免费av片高清无码| 久久五月天婷婷丁香中文字幕| 岛国免费视频在线| 亚洲国产奇米影视久久| 亚洲 国产 精品一区| 强奸乱伦中文字幕AV| 色综合久久88色综合久久天天| 欧美 日韩 亚洲 春色| 在线看的av| 三级AV入口| 久久久久免费看少妇A片特黄| 亚洲天堂中文字| 亚洲国产成人福利在线观看| 人妻日日干| 草莓精品视频| 97久久精品亚洲| 天天综合有色网| 大香蕉啪啪啪啪在线| 男人的亚洲天堂| 久久禁| 九九久久久| 人人操,人人液| 中国少妇啪啪视频| 色婷网| 啊啊啊啊啊舒服| 97爱碰| 蜜臀va69| 日韩免费福利在线观看| 一级黄色性爱A级片| 99久久精品国产高潮| 综合啪啪| 超碰99热中文字幕| 嗯~啊~快点 死我视频免费看网站| 国产丸一视频| 久久久久九九九| 黄片qw| 综合操逼| 91在线免费观看处女| 亚洲情色在线| 伊人操| 黄色片一区二区三区四区五区| 色情乱伦AV| 人妻天天操天天爽视频免费| 香蕉免费一区二区三区不读| 亚欧美综合网| 国产精品干干干| 91九九| 97这里都是精品| 日韩欧美三级| 黄色激情电影在线观看| 99激情| 国产25页| 欧美色图综合| 在线观看av区| 久久久久久久国产| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 夜夜操夜夜高潮夜夜爽国产精品区| 超碰97男女| 日本在线一二| av无码av无码专区| 精品黄色电影| 岛国999| 2010男人的天堂| 97久久国产亚洲精品超碰热| 91天天综合日韩欧美| 色逼综合| 青娱乐国产精品| 亚洲人妻久久久| 久久久久久久久久久97| 欧美少妇性爱网站| 久久久久亚洲三级电影| 精品玖九九久| 国产吹潮女在线观看| 免费的av网| 99自拍视频在线观看| 久久9999| 国产不卡免费在线视频| 一区二区三区 丝袜 高跟 美腿| 97色妞| 久区视频| 九九九九九精品视频| 探花精品 一区二区| 久久久免费高清中文视频| 大香蕉在线视频重口味毛片在线| 蜜桃成人1区2区3区| 很很热性爱视频| 亚洲精品国产无码高清| 内射老妇BBWX0C0CK| 国产精品久久久 | 国产精品婬乱一级毛片彝族| 伊人大香蕉在线| 欧美极品女人的天堂| 天美传媒精品久久视频| 97资源免费视频| 久久久久久久久久久久久久9999| 亚洲综合在线视频| 超踫中文字幕| 九九热免费在线国产视频伊人五月| 婷婷综合视频| 麻豆福利视频导航| 日本三级精品| 久久久久九九九| 亚州男人的天堂| 亚洲免费成人在线高清无码视频| 大香蕉色网| 日本综合色图| 综合久久久久久久综合网| 无码丰满熟妇一区二区浪潮AV| 乱伦一区二区三区‘| 欧美性爱三区二区| 日本天天吊| 日本操BAV| 国产乱伦亚洲色图高清无码| 快灬快灬 一下爽蜜桃在线观看| 欧美日韩性爱视屏免费看了| 亚洲操操操无码| 思思热在线视频精品| 亚洲狠| 久久超碰亚洲人| 欧洲精品一二三在线| 麻豆一区二区AV天美| 久9re热视频这里只有精品| 精品v日韩欧美国产| 亚洲天堂另类小说男人| 色欲久久99国产精品久久久久久| 插穴性爱视频在线观看| 大鸡吧尹人在线| 黄片免费久久久久久久| 天天干18禁| 中文字幕88av在线| 综合激情婷婷| 无马一区二区| 97在线视频观看| 成人开心网在线视频| 国产成人拍国产亚洲精品| 亚洲少妇喷视频看| 日日骚网站| 日韩成人在线性爱视频| 欧美宗合网| 亚洲精品精品一区二区| 熟妇人妻丰满久久久久久久无码| 亚洲丝袜色图| 天天天天做夜夜夜夜做| 久久欧美性爱视频| yazhouzaixian| 日韩AV一起草| 欧美青青草视频| 国产精彩女在线观看视频| 九九九免费视频| 久久久草成人网站久久久草成人久久久草久久久 | 福利社区午夜一区二区| 无码操逼天堂| 黑丝少妇在线观看| 自拍内地三级在线观看| 色制服丝袜夫妻av一区| 韩国一级做A片免费的| 91精品伊人久久久大香线蕉91| 色香天天| 一区=区三区视频| 蜜乳Av成人片网站| 极品极品色影院| 国产一区二区免费福利片| 中文字幕久久精品一区| 欧美亚洲中文字幕| 在线观看亚洲成人精品| av橘色网站| 成人无码专区精品视频| 十八禁啪啦拍视频无遮挡| 日韩肏逼视频| 97中文字幕一区| 日韩超碰精品综合| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 婷婷激情五月天小说网| 强奸抽插av| 992大香蕉| 亚洲男人的天堂网| 97超碰天天爱天天爱| 国内毛片免费h片在线| 亚洲一区日韩精品| 超碰成人人人爽人人爽| 最新制服中文第一页| 校园春色综合香蕉| 少妇三P| 青青草原狼av| 老色69| 桃色五月天| 午夜精品视频777| 91人妻素女| 91社操逼| 亚欧国产无码精品在线| 蜜乳性色无码专日粉嫩骚逼AV| 日韩性爱啪啪视频| 国产在线视频午夜精华在| 97综合激情| 国产剧情在线| 色久桃花影院在线观看| 偷拍 欧美 日韩| 欧美天天综合网| 91精品老女人| 日本人妻伦在线中文字幕| 18禁看网站一区| 日本性爱视频一级| 性久久| 91 亚洲 欧美 日韩 国产 综合| 国产www色在线观看| 熟女精品va中文字幕| 黄色网址在线免费观看| 密桃99999| 一区中文字幕二区日韩| 97精品97久久| 91少妇人妻| 久久久精品中文字幕爱豆| AAAAAAAAA黄片| 91丨九色丨国产打屁股| 成人网欧美风情| 九九99久久| 欧美黑人精品在线播放| 翔田千里av一区二区三区| 日本超碰在线国产一区| 国产精品suv一区| 久草老司机| 夜夜嗨视频| 久久精品国产72国产精品福利| 久操大香蕉手机视频在线看| 97超碰中文| 欧美综合天天| 婷婷丁香五月激情啪啪| 69久久久久久久久久久久久| 久久国产乱子伦精品免费女,网站| 黑人免费福利视频| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 精品夜夜澡人妻无码AV| 思思热影视| 欧美日韩精品国产91| 男人的天堂kva| 日韩一性一交一A片俄罗斯 | 中文字幕AV乱伦| 91爽啪| 欧美劲爆第一页| 探花激情视频| 99超碰网| 狠狠操夜夜操蜜桃视频三区| 国产sv美女内射| 一区三区啪啪| 婷婷8月天青娱乐| 五月婷婷激情综合| 久久二| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 欲色综合| 欧美色图天堂在线| 超碰诱惑| 综合五月天| 色婷婷六月丁香七月婷婷| 日本不卡一二区| 国产天天看| 丝袜加勒比| 日本 成 人 小说 电影 一区二区| 中文字幕丰满子伦无码专区在线视频最新 | 曰韩欧美国产传媒麻豆第一区| 国产高清午夜成人在线观看| 国产风韵犹存熟妇三区| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 操逼视频亚洲| 日本污ww视频网站| 熟女中出视频| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 免费草草草草草视频| A男人的天堂| 青青欧美| 婷婷久久大香蕉| 亚洲激情欧美色图 | 大香蕉欧美国产日韩高潮| 国产乱码久久久| 在线人成亚洲视频免费观看| 精品少妇一区二区三区在线视频| 好吊色一区| 国产精品青青草| 国产AAAAAABBBBB| 欧美精品丝袜久久久中文字幕| 女人天堂网| 久久99网站| 久操97| 蜜臀人妻少妇久久在线观看| 大香蕉www.超碰| 日本精品久久久久久久| 青娱乐日韩无码| 伊人九九九| 成人AV素股で擦久久| 国产精品不卡一区二区三区av| 富二代亚洲精品99| 口爆综合网| 91精品国产91久久福利| 综合欧美日韩在线| 激情AV| 福利视频香蕉免费一区二区在线| 嗯嗯啊好大| 最新国产精品久久精品| 蜜臀久久99精品久久久| 亚洲无限观看| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | a级免费在线观看| 亚洲永久永久永久永久一级一级一级精品 | 成人性爱电影一区二区| 亚洲日韩美国人妻| 97狠狠| 密臀AV在线| 综合自拍| 超碰天天久久79| 无码人妻丰满热妇又大又粗| 丰满人妻一区二区三区免费| 天天日夜干| 性影在线视频| 97在线看| 97欧美综合网| 久久精品国产久精国产| 超碰这里有精品| 丁香五月成人| 91爆操视频| 一级二级在线观看| 久久三区四区| 亚洲国产蜜臀系列在线观看| 日韩熟女精品无码专区一区二区| 欧美激情中文字幕另类小说| 五月天婷婷在线看| 国产午夜视频| 超碰欧美97| 五月天加勒比啪| 亚洲中文字幕有码视频一区二区三区| 18禁的网站在线| 日本淫乱女一区二区三区视频| 久久视频少妇美女| 久久久性爱视频| 日韩有码一区三区| 九九黄色网| 大伊香蕉在线视频免费| 手机看片日韩人妻| 99婷婷一区二区| 欧美97色| 清纯唯美激情| 99操逼| 97超色| 黑人精品久久97| 国产精品 午夜福利| 色欧美天天| 九九色热| 操操碰| 日本国产成人亚洲精品无码| 金莲网址| 色欲蜜臀AV| 萌白酱自拍视频| 亚洲欧洲自拍图片专区满春格| 蜜臀久久99精品久久久久久久久| 中文AV制服乱伦| 久久久专区| 99久久网站| 国产精品人妻无码久久久互動交流| 亚欧美天堂在线| 亚洲天堂AV在线播放| 91九色丰满高潮| 亚洲五月丁香花狠狠干一区二区三区 | 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 日韩欧美中文字幕搭讪巨乳美人妻视频| 人妻激情偷乱视频一区二区三区 | 国产久久一区二区午夜| 人妻献身系列第54部| 国产女主播视频在线观看| 97在线视频观看| 日本1区2区不卡视频| 欧美日日人人天天| 视频在线观看一二三区| 欧美,日韩,中文,另类| 97国产成人精品免费视频| 亚洲久久久| 97一区二区三区视频| 激情婷婷五月天| 欧美日韩电影成人在线| 看一级黄色视频| 探花熟女,姿勢到位,體驗感也到位| 人人搞人人插人人操| 五月婷婷hd| 男人天堂.AB| 亚洲人妻一区二区三区| 九热大香蕉| 亚洲在钱| 97久久超碰| 免费一级精品啪啪视频| 色婷婷五月综合激情中文字幕| 99精品网| 综合97亚洲| 97操碰| 国产视频人人网| 亚洲国产精品有声| 中文字幕永久在线| 美女主播色欲91抠b在线播放| AV中文字幕剧情1区2区3| 青青草色AV| 国产丝袜美女在线一区| 日韩精品在线观看网站| 在线观看AV不卡| 国产精品久久久久久久久久久久久久久| 国产三级中文字幕粉嫩| 思思热在线视频免费| 欧美日韩性爱无码| 亚洲天堂另类美腿| 久久9精品网站| 大色综合| 国产无套粉嫩白浆在| 亚洲中文制服诱惑| 男人天堂最新手机版在线青青草| 曰韩人妻中文字幕在线| 婷婷深爱五月| 丝袜美腿校园春色| 久久超碰网| 粉嫩绯色AV一区二区在线| 丁香五月天婷婷姐| 天天性射网| 日本性爱欧美性爱| 丝袜美腿欧美| 操一对老熟妇爽上天视频| 中国一级操逼视频| oumeisetu综合| 亚洲少妇自拍中文字幕懂色| 乱伦色图网址是多少| 欧亚综合一卡二卡中文字幕| 91熟女少妇| 极品综合| 99啪啪视频| 五十路一区无码| 国产无马av| 色香91| 国产毛片在线| 今日头条成人一区二区三区四虎精品| 97视频在线播放| 亚洲五月婷| 综合网亚洲1| 成人性爱av.com| 欧美在线大香蕉| 69XX一中文字幕人妻91| 九九玖玖精品| 91天天综合| 啊啊啊 在线观看| 91天堂| 丁香五月天社区| 丝袜美腿91| 91精品大奶人妻| 不卡六六在线91| 国产精品久久成人免费| 日韩人妻精品| 日韩一级欧美一级在线观看| 夜夜免费视频| 日韩一级片在线看| 久久大香蕉97| 日日夜夜狠狠| 青青色在线观看| 日韩三级网址| 国产亚洲欧美每日在线| 亚洲男人在线观看天堂 | 超碰色97| 狠狠躁AV| 欧美特大AA级黄片| 青青草成人视频在线观看二区| 啪啪啪精品| 久久久99999久网站| 成人aⅴ一区二区三区| 破处bbq| 欧美精品999| 五月天伊人网| 五月婷婷hd| 波多野结衣先锋影音| 中文字幕精品亚洲熟女| 日日干日日| 26uuu最新| 日本人妻天堂网站在线播放| 日本色色色视频| 欧洲亚洲人妻无码久久三区四区| 日韩有码免费视频| se吧提供91精品国产91久久久久久 | 亚洲福利中文字幕在线| 国产AV中文| 91色黑人少妇| 每日更新AV| 丰满人妻一区二区三区免费| 91新在线欧美| 熟女人妻一区二区三区| 伊人骚琪琪亚洲天堂网站| 精品v1区| 久久人人爽人人爽人人片Ⅴ| 青青色在线观看| 亚洲男人的天堂网| 国产在线76页| AAAAAAAAA黄片| 天堂综合网| 精品乱码久久久久| 黑丝内射一区二区三区| 亚洲天堂中文字| 亚洲综合在线第一页| 亚洲一本色码中文字幕| av一区二区三区四区| 成人夜夜| 99操逼| 久久尹人大香焦视| 床上啊啊啊一区二区三区| 欧美大片91| 中文人妻av高清一区| 国产丝袜视频| 大香蕉手机在线| 免费一级a毛片久久久久久鸭绿欲| 色蜜AV| 亚州五月| 色呦呦呦在线观看视频| 日韩欧美经典在线观看| 亚洲图片欧洲图片aⅴ| 男人天堂.AB| 欧美在线亚洲| 亚洲AV操| 黄呦呦在线| 成人精品无码| 午夜免费视频1000| 美女91网址 | 91社操逼| 欧美性爱一区二区三区四区| 热思思免费视频| 久操黄色视频| 97免费视频在线| www色日本| 一二视频神马久久传媒| 天天看天天在线精品| 69精品人人人人| 日韩免费簧片| 久久婷婷在线观看视频| 探花视频免费观看国产专区| 丝袜美腿诱惑亚洲欧美视频在线观看 | 涩综合导航| 日韩天堂av电影在线观看| 美女久久久| 天天91~综合入口| 天天综合网~91| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 日韩免费簧片| 狠狠躁久久躁| 男人的天堂kva| 免费男人的天堂| 一区二区三区一亚洲中文字幕、综合区灬| 不卡啪啪视频| 中文有码9| 久久久国产护士丝袜美腿一| WWW4虎| 久久久久久久久久久久久久久性生活视频 | 欧美国产有色电影| AV老汉| 在线综合 亚洲 欧美中文字幕| www.91色综合| 亚洲另类综合欧美| 九九亚洲视频| 97欧美久久久久久久| 看日韩操逼| 久久精品无码熟妇一区二区三区视频导航 | 一二区在线观看视频| 综合色99| 女色综合| 欧美狠狠鲁| 色官网色综合| 麻豆人妻精品一区二区| 成人免费不卡在线视频| 手机看片1025| 99re9在线| 中文字幕丝袜人妻| 97在线青| 亚洲成人AB| 91美女小视频| 视频一区二区三区精品| 亚州免费啪啪视频| 欧美综合区| 91狠婷| 97 视频在线| 久久久久久久久国产| 亚洲黄色电影| 欧美精品69性爱| 操操操日本的逼| 狠狠色色| 男生女生啊啊啊啊| 曰本道人妻久久久在线不卡色视频| 97在线免费公开视频| 69精品人人人人| 97久久超碰| 亚洲精品蜜桃久久久一区二区三区| 久久久精品网| 国产品精品自在在线午夜免费| 天天爽天天操啊啊啊| 亚洲天堂2020| 搞中出久久| 国内三级自拍小视频在线观看| 伊人AAA| 亚洲限制级| 天天欲望网| 国产传媒午夜理伦精品| 国内三级自拍小视频在线观看| 国产伊人自拍| 美女91av| 日本一级特级毛片视频| 人人摸人人添人人操| 野狼激情网| 国产99999久久精品| 东北女人性交| 天天爽天天| 色婷婷久久综合超碰| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 超碰人人草| 久久97资源 网| 99热精品在线观看| 秋霞网—男女啪啪亚洲免费体验区| 家庭乱伦国产精品| 极品极品色影院| 美女AV一区二区| 好爽视频在线观看视频 | 黄片www视频免费| 亚洲欧美精品福利在线| 国产精品久久久久久久久久久久久久久久久久| 暴力av在线| 天堂俺去俺来也www久久婷婷| 99这里只有精品国产| 欧美亚洲影视| 综合色图区| 超碰人人超在线观看| 免费福利视频中文字幕| 超碰在线一区二区| 国产AV人人夜夜澡人人爽麻豆| av天堂影视中文在字幕在线中文| 91强热人妻| A一区片| 亚洲欧美不卡线| 超碰天天去日穴| 免费97视频| 少妇三P| 九九玖玖精品| 无码免费一区二区三区啪啪| 欧美一级A片在线看视频性色| 色欲av一区二区三区蜜芽| 欧美91在线| 久久中文字幕在线观看| 天天操熟妇| 99热8| 男人把坤坤插入女人的下体| 中文字幕加勒比海高清无码免费视频 | 欧日a| 国产福利在线视频网站| WWW啪啪的com| 最新国内自拍av免费| 青娱乐休闲视频在线观看| 亚洲精品人体| 天天综合色图| 久久欧美性爱视频| 欧美激情片一区二区| 国产极品粉嫩馒头一线天av| 亚洲伊人久久精品狠狠在线| 久久精品国产亚洲AV先锋| 欧美大香蕉卡久久| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 奇米四色网| 性生活无遮挡纯毛片在线看| 人人看人人爰人人操| 嗯嗯啊啊好大好爽| 91成人在线免费视频| 999久久芭蕾| 五月天开心网| 一区二区乱码福利| 粉嫩少妇自慰在线| 国产一级作爱毛片| 中国91AV| 亚洲s在线观看| 日本欧美韩国国产在线| 岛国999| 五月天婷婷基地| 亲子敌伦对白在线播放| 玖玖资源中文字幕制服丝袜| 国产精品极品美女视频| 东京热伊久| 男女打扑克高清网站| 色婷婷六月丁香七月婷婷| 久久综合久色欧美综合狠狠 | 性videos欧美熟妇hdx| 一区二区视频你懂的| 国产吞精a级片激情电影| 嗯嗯啊啊啊好爽| 国产无遮挡| 久久一级无码精品毛片6| 992视频一区| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 国产精品麻豆免费视频| 日韩成人人妻网站| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 日本成人免费一区二区三区| 伊人久久亚洲色欲综合网站| 中文字幕高清20页视频| 97在线精品观看视频| 加勒比无码毛片| 殴美日韩m| 777奇米影视777四色| 无码天堂| 久久中久文96| 亚洲激情 欧美色图| 欧美亚洲中文字幕| 伊人网免费视频| 久超碰这里只有精品| 67194无码不卡| 日本精品第一视频在'| a片 xxxx受爽视频| 天天操福利视频综合网站| 美女高潮视频91| 亚洲欧美经典一区二区| 91搞逼视频| 777超碰| 五月天亚洲网| 欧亚第一综合网| 防屏蔽在线视频| 91强奸乱轮| 九月激情婷婷| 操逼A∨| 亚洲人妻精品一区二区| 国产和美国毛片| 欧美 传媒 麻豆 日韩 偷拍| 99这里只有精品| 亚洲 欧美 手机在线观看| 日韩激情无码影院| 凹凸精品熟女在线观看| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 亚洲日韩AV视色| 一区二区三区激情在线观看| 人妻一区二区三区视频 | 欧美在线干| 一区| 国产精品久久久久久夜夜夜| 婷婷丁香五月综合| 日韩不卡毛片Av免费高清| 日韩99精品视频综合区| 精品国产一区探花在线观看| 久久精品28| 91少妇高潮| 熟妇女伦乱视频视频 | 国产精品天美传媒| 色一情一乱一乱一区91Av| 丰满少妇乱子伦精品无| αⅴ天堂| 北约熟女超碰| 天天懆天天日| 秋霞网—男女啪啪亚洲免费体验区| 综合 亚洲 欧美| 少妇毛片久久| av天天在线观看| 99婷婷| 五月丁香六月婷综合成人综合| 一本一道波多野毛片中文在线| 久艾草在线精品视频在线观看| 日本视频在线中文字幕| 久久老女人| 久久专区| 国产在线视频午夜精华在| 神马久久久久久| 日韩亚洲欧美中文字幕| 四虎精品永久在线播放| 男人天堂网站| 夜夜草天天| 国产精品盗摄 偷窥盗摄| 日韩福利综合一区| 乱伦a片视频| 九月丁香婷婷色| 久操网线| 中字乱伦AV| 99热免费| 九一屌逼| 97日视频| 啊啊啊啊在线播放| 风间由美日韩欧美久久| 亚洲天堂加勒比| 成人羞羞视频国产| 亚洲天天做日日做天天谢日日| 国产一区二区三区视频在线看| 久久av一级av少妇av高潮 | 999九九九九国产动| 中文字幕第7页| 精品午夜福利| 日韩欧洲操屄视频| 国产AV激情无码久久无码| 在线观看国产黄色| 亚洲人妻一区二区三区| 青青草吊丝| 九九九精品一区二区无码| 亚州五月| 亚洲人成在线放东京热| 日韩在线性爱免费视频| 亚洲国产欧美中文永久| www.狠狠干.coom | 狠狠躁AV| 国产精品午夜福利视频| 嗯嗯不要 视频| 91一区二区三区蜜桃| 久久亚洲AV无码专区国产精品| 亚洲综合色婷婷| 国产白嫩精品久久| 国产成人啪一区二区| 欧美夜夜| 天天视频综合在线观看视频| 久久精品人体AV| 老司机午夜福利视频一区二区| 婷婷激情丁香| 亚洲欧美在线观看无码| 激情视频网址| 日日夜夜青青草母狗| 综合五月天| 少妇一级婬片免费放一级a性色.| 91精品黄在线观看| 99青青草国产视频| 超碰99在线| 蜜桃视频成a人v在线| 国模限制级电影| 土豪酒店各种姿势玩弄极品幼稚| 综合网亚洲| 中日高清无码操逼视频| 大香蕉国产中文自拍| 97资源站日韩| 日韩A优精品在线观看| 亚洲欧洲视频小说在线观看| 伊人在线大香蕉二。| 欧亚无码视频| 性爱久久| 97欧美久久久久久久| 强奸乱伦AV一天堂网| 激情五月天网站| 免费看国产大AB| 中文字幕日韩专区精品系列 | 色欲蜜臀AV| 亚洲AV资源| 青草精品视频日本久久久久网站在线| 国产网红精品| 97天天做| 九九九精品| 超碰在线99| 亚欧美色图| 国模不卡| 天天综合网1| 亚洲国产美女久久久久| 青青草中文-久久青草精品一区二区三 | 九九热九九| 嗯~啊~快点 死我视频免费看网站| 人人爱人人乐人人操| 男人的天堂不卡一区二区| 午夜久久久| 能在线播放的国产三级| 麻豆天美制片厂网站视频| 国产精品午夜AV完会免费| 五月花婷婷| 午夜传煤十二区精品| 亚洲欧美激情在线视频| 国产精品乱码久久久久久久| 精品日韩中文在线| 久久鲁夜| 男人天堂黄片| 国产白丝在线| 日逼视频日本| 综合av影片| 亚洲精品xxx| 97精品久久久久中文字幕| 国产成人午夜视频网址| 欧美国产有色电影| 台湾成人无码AV| 狠色婷婷久久一区二区三区_| 国产黄色影片在线观看| 中文字幕日韩情色| 操逼操网| 91人妻Pr| 九九久久国产精品怡红院| 51一区二区三区| 日韩不卡一二三四| 逼逼逼逼操操操操操操操操操午夜剧场| 欧美曰韩国产精品| 蜜乳av一区二区| 9999亚洲精品| 狠狠色狠狠色狠狠五月| 大香蕉之青青草原| 天天做日日做天天欢。| 91久热| 久9热| 欧美少妇色图| 97se综合网| 国产精品毛片?v一区二区三区| 福利一级版子| 无遮挡猛进视频免费无限观看| 96国产精品| 日韩欧美麻豆大片| 搡老熟女免费视频| 日日夜夜国产综合| 婷婷丁香五月天综合东京热| 黑白配性爱AV成| 素人播放一区| 麻豆综合一区av| 青青青艹在线视频| 超碰人妻在线| 中文字幕欧美日韩三级| 蜜臀AV成人精品蜜臀| 深夜激情无码| 久久人| 精品九九九九九九九| 日本熟妇人妻中出视频| 亚洲国产天堂| 安徽熟妇视频| 新版天堂中文资源8在线| 日韩啪啪视频| 淫乱图区 | 天天日老熟妇| 亚洲,日韩,欧美,成人播放 | 日韩精品99久久久久久中文字幕| 在线观看岛国有码| 天天射日日干| av久日| 91婷婷伊人狠人| 一区操逼日比视频| 亚洲精品人体| 色天堂在线观看| 偷拍伦理视频| 日韩欧美中文| yiqicaoav| 免看60秒涩涩视频| 亚洲人在线| 久久草大香蕉| 久久久久人妻二区精品叶可怜| 蜜区区视频79| 啊操爽品善一区二区三区| 狠狠干狠狠色| av绯色| 三上悠亚在线毛片91| 五月天人妻综合| 中出789在线视频| 天天狠| 成人性爱电影一区二区| 99久久精品无码一区二区毛片免费| 欧日韩一二三f区| 九九九九九九九九九五码| 夜夜爽77777| 成人av动漫在线观看| 久久久久久一日韩字幕无码| 亚洲 欧美 色图| 本道在线| 蜜屁Av| 成人日韩中文字幕| 国产一区96在线| 国产伦精品一区二区三区在线观| 女同女同恋久久级三级| 日韩无码极品| 青草一区二区| 新91视频.cmp| 超碰到97情色| 中出后入| 四季AV一区二区凹凸精品小说| 看免费的黄片| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 国产一区二区三区白丝| 欧美一二三| 九九操久久国产免费视频| 九九九九九九免费视频| 激情欧美日韩女同久久| 久久久久久大| 欧美视频在线第3页| 99精品在线播放| 久久久97| 99久久网站| 国产吞精a级片激情电影| 国产黄色 A 片免费看| 俄罗斯一区二区视频在线观看 | 精品大全99999| 99re综合伊人| julia ann久久| 中文字幕伊人| 任你干在线视频| 亚洲欧美日韩中文久久自慰| 熟女网站最新| 亚洲欧洲无码一区夜| 东北女人操比视频| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 人人喜人人妻| 有码免费观看| 佐山爱中文字幕| 女生自91网站| 伦理弟一页| 99re在线视频国产| 亚洲脚交| 极品人妻少妇综合| 玖玖久久久| 欧美综合自拍| 91性高朝久久久久久久久| 强奸乱伦免费网站| 日本东京热加勒比久久| 黑人操一区二区| 亚洲欧美日韩夜夜| 狠狠狠狠狠狠| 在线观看AV不卡| 欧美日本久久精品一区| 亚洲少妇在线影音| 东方亚洲在线操逼天堂| 久久久久久免费电影| 日日躁夜夜躁狠狠躁超爽| 久久超碰97| 午夜a成v人电影| 国产福利小视频高清在线观看| 丝袜美腿制服人妻二区中文字幕| 精品国产肉丝袜在线拍国语| 久久五月天婷婷| 国产精品肉丝自拍| 日韩电影天堂视频一区二区| 大香蕉92| 九久精品| 精品成人无码| 欧美中出1| 九九热男人天堂| 麻豆国产成人精品| 91大香蕉伊人| 日本一区二区亚洲综合| 久操com| 国内毛片无码一级毛片| 综合网,亚洲,欧美| 加勒比海成人视频网| 欧美激情亚洲| 91看黄片| 国产AV超爽| 欧美一区二区情色| 呻吟 欧美 日本 中出| 中文字幕99999| 国产人伦a片信息免费片| 色情婷婷| 最新精品久久蜜桃| 久久久久女教师免费一区| 伊人五月天婷婷| 97香蕉碰碰人妻国产欧美|