久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

vConsole + MCP:讓AI直接讀取H5日志與網(wǎng)絡(luò)請求

vConsole + MCP:讓AI直接讀取H5日志與網(wǎng)絡(luò)請求 1. 移動端調(diào)試的困局為什么AI看不見你的H5日志做過H5開發(fā)的人都有一個共同的痛頁面在手機(jī)上跑日志在手機(jī)里而你坐在電腦前。Chrome DevTools 的遠(yuǎn)程調(diào)試雖然能用但限制極多——需要USB連接、需要開啟開發(fā)者模式、部分瀏覽器內(nèi)核根本不支持、iOS上的Safari Inspector還經(jīng)常斷連。更別提那些嵌在App WebView里的頁面你連入口都找不到。傳統(tǒng)的做法是在頁面里手動掛一個vConsole然后在手機(jī)屏幕上戳來戳去。這個方案本身沒問題vConsole確實是移動端調(diào)試的利器它能在頁面上生成一個懸浮面板展示console日志、網(wǎng)絡(luò)請求、DOM結(jié)構(gòu)、Storage等信息。但問題在于這些信息只有人眼能看到AI看不到。現(xiàn)在大家都在用AI輔助debug你把代碼貼給AIAI幫你分析問題。但AI能拿到的只有你手動復(fù)制粘貼的那幾行日志上下文嚴(yán)重缺失。你告訴AI接口報錯了AI問你報什么錯你再去vConsole里翻翻到了再貼過去。這個來回過程極其低效而且經(jīng)常漏掉關(guān)鍵信息——比如請求頭里的某個字段、響應(yīng)體的完整結(jié)構(gòu)、報錯前后的日志順序。MCPModel Context Protocol的出現(xiàn)改變了這個局面。MCP本質(zhì)上是一套讓AI模型能夠調(diào)用外部工具的協(xié)議標(biāo)準(zhǔn)你可以把它理解成給AI裝了一雙手。通過MCPAI不再只能被動地接收你粘貼的文本而是可以主動去調(diào)用工具、獲取數(shù)據(jù)、執(zhí)行操作。把vConsole和MCP結(jié)合起來就意味著AI可以直接讀取H5頁面上的日志和網(wǎng)絡(luò)請求不需要你手動搬運。這篇文章要講的就是怎么把這兩件事串起來。核心思路是在H5頁面里集成vConsole通過WebSocket把vConsole捕獲的日志和請求數(shù)據(jù)實時推送到一個本地服務(wù)再把這個服務(wù)封裝成MCP Server讓AI通過MCP協(xié)議直接查詢。整條鏈路打通之后你只需要對AI說幫我看看剛才那個頁面為什么白屏AI就能自己去拉日志、分析請求、定位問題。適合閱讀這篇文章的人有H5開發(fā)經(jīng)驗的前端工程師、正在探索AI輔助開發(fā)流程的技術(shù)人、對MCP協(xié)議感興趣但還沒找到落地場景的開發(fā)者。不需要你精通WebSocket或MCP協(xié)議細(xì)節(jié)我會把每一步的原理和操作都講清楚。2. 拆解這條鏈路vConsole、WebSocket與MCP各自扮演什么角色2.1 vConsole的能力邊界與數(shù)據(jù)出口vConsole是騰訊開源的一個輕量級移動端調(diào)試面板壓縮后只有幾十KB對頁面性能影響極小。它的核心能力包括Console面板捕獲所有console.log/warn/error/info輸出包括對象展開Network面板記錄所有XMLHttpRequest和fetch請求的URL、方法、狀態(tài)碼、請求頭、響應(yīng)頭、響應(yīng)體、耗時Element面板查看和修改DOM結(jié)構(gòu)Storage面板查看Cookie、LocalStorage、SessionStorageSystem面板顯示UA、屏幕尺寸、網(wǎng)絡(luò)類型等關(guān)鍵點在于vConsole提供了一個插件機(jī)制和事件系統(tǒng)。你可以通過vConsole.VConsolePlugin自定義插件也可以直接hook它的內(nèi)部方法來獲取數(shù)據(jù)。但更優(yōu)雅的方式是利用vConsole的vConsole.core對象它暴露了一些內(nèi)部API。不過直接hook vConsole內(nèi)部API有個問題版本升級可能導(dǎo)致API變化。所以更穩(wěn)妥的方案是自己攔截console方法和XHR/fetch把數(shù)據(jù)同時輸出給vConsole和WebSocket。這樣即使vConsole升級你的數(shù)據(jù)通道也不受影響。具體做法是在頁面加載vConsole之前先包裝原生的console方法const originalLog console.log; const originalWarn console.warn; const originalError console.error; function sendToServer(type, args) { const payload { type: type, timestamp: Date.now(), args: Array.from(args).map(arg { try { return typeof arg object ? JSON.stringify(arg) : String(arg); } catch (e) { return [Unserializable]; } }) }; ws.send(JSON.stringify(payload)); } console.log function(...args) { originalLog.apply(console, args); sendToServer(log, args); }; // 同理處理warn和error對于網(wǎng)絡(luò)請求攔截XMLHttpRequest的open和send方法以及fetch函數(shù)。這里要注意的是攔截必須在vConsole初始化之前完成否則vConsole會先捕獲到原始方法。2.2 WebSocket作為實時數(shù)據(jù)通道的選型理由為什么用WebSocket而不是HTTP輪詢原因很簡單日志和請求是實時產(chǎn)生的輪詢有延遲且浪費資源。WebSocket建立一次連接后可以雙向通信服務(wù)端可以主動推送指令比如開始錄制、清空日志客戶端可以實時上報數(shù)據(jù)。WebSocket的心跳機(jī)制也是必須考慮的。移動端網(wǎng)絡(luò)環(huán)境復(fù)雜連接可能因為切后臺、網(wǎng)絡(luò)切換等原因斷開。標(biāo)準(zhǔn)做法是客戶端每隔30秒發(fā)送一個ping幀服務(wù)端回復(fù)pong幀。如果連續(xù)3次沒有收到pong就認(rèn)為連接斷開觸發(fā)重連。let heartbeatTimer null; let pongReceived true; function startHeartbeat() { heartbeatTimer setInterval(() { if (!pongReceived) { console.warn(WebSocket heartbeat lost, reconnecting...); ws.close(); reconnect(); return; } pongReceived false; ws.send(JSON.stringify({ type: ping })); }, 30000); } ws.onmessage (event) { const data JSON.parse(event.data); if (data.type pong) { pongReceived true; } };重連策略采用指數(shù)退避第一次1秒后重連第二次2秒第三次4秒最多到30秒。這樣既不會頻繁重連造成服務(wù)端壓力也不會在短暫斷網(wǎng)后長時間失聯(lián)。2.3 MCP Server的角色定位與協(xié)議要點MCP Server在這條鏈路里的角色是數(shù)據(jù)中轉(zhuǎn)和查詢接口。它做三件事接收WebSocket客戶端上報的日志和請求數(shù)據(jù)存入內(nèi)存或本地文件暴露MCP工具Tools讓AI可以查詢這些數(shù)據(jù)提供資源Resources讓AI可以讀取完整的日志文件MCP協(xié)議的核心概念包括ToolsAI可以調(diào)用的函數(shù)比如get_logs、get_requests、clear_logsResourcesAI可以讀取的數(shù)據(jù)源比如logs://latest、requests://allPrompts預(yù)定義的提示模板這個場景下用得少一個典型的MCP工具定義長這樣{ name: get_logs, description: 獲取指定時間范圍內(nèi)的console日志, inputSchema: { type: object, properties: { since: { type: number, description: 起始時間戳毫秒不傳則返回最近100條 }, level: { type: string, enum: [log, warn, error, info], description: 日志級別過濾 }, keyword: { type: string, description: 關(guān)鍵詞搜索 } } } }AI通過MCP協(xié)議調(diào)用這個工具時會傳入?yún)?shù)MCP Server執(zhí)行查詢并返回結(jié)果。整個過程對AI來說是透明的它只需要知道我有一個工具可以查日志。3. 從零搭建vConsole數(shù)據(jù)上報與MCP Server的完整實現(xiàn)3.1 頁面端改造在不破壞原有調(diào)試體驗的前提下增加數(shù)據(jù)出口頁面端的改造原則是最小侵入。你不需要修改業(yè)務(wù)代碼只需要在頁面入口處引入一個獨立的腳本。這個腳本做四件事初始化WebSocket連接攔截console方法攔截XHR和fetch初始化vConsole保持原有調(diào)試面板可用先看WebSocket連接的建立。這里有一個細(xì)節(jié)連接地址不能硬編碼。開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境的服務(wù)器地址不同而且同一頁面可能在多個環(huán)境下運行。解決方案是通過URL參數(shù)傳遞function getWsUrl() { const params new URLSearchParams(location.search); const debugHost params.get(debug_host); if (debugHost) { return ws://${debugHost}/ws; } // 默認(rèn)連接本地 return ws://127.0.0.1:8765/ws; }這樣你在手機(jī)訪問頁面時只需要在URL后面加上?debug_host192.168.1.100:8765就能把數(shù)據(jù)推到你的開發(fā)機(jī)上。攔截XHR的代碼需要小心處理因為很多框架比如axios內(nèi)部就是用XHR實現(xiàn)的。攔截不當(dāng)可能導(dǎo)致請求失敗或數(shù)據(jù)丟失。正確做法是保存原始方法在原始方法執(zhí)行前后插入邏輯const OriginalXHR window.XMLHttpRequest; function interceptXHR() { const originalOpen OriginalXHR.prototype.open; const originalSend OriginalXHR.prototype.send; OriginalXHR.prototype.open function(method, url, ...rest) { this._debugMethod method; this._debugUrl url; this._debugStartTime Date.now(); return originalOpen.apply(this, [method, url, ...rest]); }; OriginalXHR.prototype.send function(body) { this._debugBody body; this.addEventListener(loadend, () { const duration Date.now() - this._debugStartTime; sendToServer(request, [{ method: this._debugMethod, url: this._debugUrl, status: this.status, duration: duration, requestBody: this._debugBody, responseBody: this.responseText?.slice(0, 10000), requestHeaders: this._debugRequestHeaders, responseHeaders: this.getAllResponseHeaders() }]); }); return originalSend.apply(this, [body]); }; }注意responseText可能非常大必須截斷否則WebSocket消息可能超過服務(wù)端的接收限制。一般截取前10000個字符就夠了足夠AI分析問題。對于fetch的攔截類似但要注意fetch返回的是Promise需要在then鏈中插入邏輯const originalFetch window.fetch; window.fetch function(...args) { const startTime Date.now(); const url typeof args[0] string ? args[0] : args[0].url; const method args[1]?.method || GET; return originalFetch.apply(this, args).then(response { const clone response.clone(); clone.text().then(text { sendToServer(request, [{ method: method, url: url, status: response.status, duration: Date.now() - startTime, responseBody: text.slice(0, 10000) }]); }); return response; }); };這里用response.clone()是因為response body只能被讀取一次不clone的話業(yè)務(wù)代碼就讀不到了。3.2 服務(wù)端實現(xiàn)用Node.js同時承載WebSocket和MCP服務(wù)端選Node.js的原因很簡單前后端同語言調(diào)試方便生態(tài)成熟。核心依賴只有兩個ws用于WebSocketmodelcontextprotocol/sdk用于MCP。先初始化項目mkdir vconsole-mcp-server cd vconsole-mcp-server npm init -y npm install ws modelcontextprotocol/sdk服務(wù)端的主邏輯分兩塊WebSocket服務(wù)接收數(shù)據(jù)MCP服務(wù)暴露查詢接口。兩者共享同一個數(shù)據(jù)存儲。數(shù)據(jù)存儲用簡單的內(nèi)存數(shù)組加文件持久化const fs require(fs); const path require(path); const DATA_DIR path.join(__dirname, data); if (!fs.existsSync(DATA_DIR)) fs.mkdirSync(DATA_DIR); class LogStore { constructor() { this.logs []; this.requests []; this.maxSize 5000; this.loadFromDisk(); } addLog(log) { this.logs.push(log); if (this.logs.length this.maxSize) { this.logs this.logs.slice(-this.maxSize); } this.persist(logs); } addRequest(req) { this.requests.push(req); if (this.requests.length this.maxSize) { this.requests this.requests.slice(-this.maxSize); } this.persist(requests); } queryLogs({ since, level, keyword, limit 100 }) { let result this.logs; if (since) result result.filter(l l.timestamp since); if (level) result result.filter(l l.type level); if (keyword) { result result.filter(l l.args.some(arg String(arg).includes(keyword)) ); } return result.slice(-limit); } persist(type) { const file path.join(DATA_DIR, ${type}.json); fs.writeFileSync(file, JSON.stringify(this[type], null, 2)); } loadFromDisk() { try { const logsFile path.join(DATA_DIR, logs.json); if (fs.existsSync(logsFile)) { this.logs JSON.parse(fs.readFileSync(logsFile, utf8)); } const reqFile path.join(DATA_DIR, requests.json); if (fs.existsSync(reqFile)) { this.requests JSON.parse(fs.readFileSync(reqFile, utf8)); } } catch (e) { console.error(Failed to load data from disk:, e.message); } } }WebSocket服務(wù)的實現(xiàn)const WebSocket require(ws); const store new LogStore(); const wss new WebSocket.Server({ port: 8765 }); wss.on(connection, (ws) { console.log(Client connected); ws.on(message, (message) { try { const data JSON.parse(message); if (data.type ping) { ws.send(JSON.stringify({ type: pong })); return; } if (data.type log) { store.addLog({ timestamp: data.timestamp, type: data.args[0]?.startsWith([error]) ? error : log, args: data.args }); } if (data.type request) { store.addRequest({ timestamp: Date.now(), ...data.args[0] }); } } catch (e) { console.error(Failed to process message:, e.message); } }); ws.on(close, () console.log(Client disconnected)); });MCP Server的實現(xiàn)需要用到SDK提供的Server類const { Server } require(modelcontextprotocol/sdk/server/index.js); const { StdioServerTransport } require(modelcontextprotocol/sdk/server/stdio.js); const server new Server( { name: vconsole-mcp, version: 1.0.0 }, { capabilities: { tools: {}, resources: {} } } ); server.setRequestHandler(tools/list, async () ({ tools: [ { name: get_logs, description: 獲取H5頁面的console日志, inputSchema: { type: object, properties: { since: { type: number, description: 起始時間戳 }, level: { type: string, enum: [log, warn, error, info] }, keyword: { type: string }, limit: { type: number, default: 100 } } } }, { name: get_requests, description: 獲取H5頁面的網(wǎng)絡(luò)請求記錄, inputSchema: { type: object, properties: { since: { type: number }, urlKeyword: { type: string }, status: { type: number }, limit: { type: number, default: 50 } } } }, { name: clear_data, description: 清空所有日志和請求記錄, inputSchema: { type: object, properties: {} } } ] })); server.setRequestHandler(tools/call, async (request) { const { name, arguments: args } request.params; if (name get_logs) { const logs store.queryLogs(args); return { content: [{ type: text, text: JSON.stringify(logs, null, 2) }] }; } if (name get_requests) { let requests store.requests; if (args.since) requests requests.filter(r r.timestamp args.since); if (args.urlKeyword) { requests requests.filter(r r.url.includes(args.urlKeyword)); } if (args.status) requests requests.filter(r r.status args.status); requests requests.slice(-(args.limit || 50)); return { content: [{ type: text, text: JSON.stringify(requests, null, 2) }] }; } if (name clear_data) { store.logs []; store.requests []; store.persist(logs); store.persist(requests); return { content: [{ type: text, text: Data cleared }] }; } }); const transport new StdioServerTransport(); server.connect(transport);3.3 把MCP Server接入AI客戶端MCP Server寫好了怎么讓AI用上不同的AI客戶端接入方式不同但核心都是配置一個MCP Server的啟動命令。以Claude Desktop為例配置文件在~/Library/Application Support/Claude/claude_desktop_config.jsonmacOS或%APPDATA%\Claude\claude_desktop_config.jsonWindows{ mcpServers: { vconsole: { command: node, args: [/path/to/vconsole-mcp-server/index.js] } } }配置完成后重啟AI客戶端AI就能看到get_logs、get_requests這些工具了。如果你用的是支持MCP的其他客戶端比如某些IDE插件、命令行工具配置方式類似都是指定命令和參數(shù)。關(guān)鍵點是MCP Server通過stdio通信所以AI客戶端會以子進(jìn)程的方式啟動你的Node.js腳本。這里有一個容易踩的坑stdio模式下不能用console.log輸出調(diào)試信息因為stdout被MCP協(xié)議占用了。調(diào)試信息必須用console.error輸出到stderr否則會干擾MCP協(xié)議通信導(dǎo)致AI客戶端解析失敗。4. 實戰(zhàn)驗證用AI定位一個真實的H5白屏問題4.1 構(gòu)造一個典型的白屏場景為了驗證整條鏈路我構(gòu)造了一個典型的H5白屏問題頁面加載時調(diào)用一個用戶信息接口接口返回的數(shù)據(jù)結(jié)構(gòu)跟前端預(yù)期不一致導(dǎo)致渲染時報錯頁面白屏。問題代碼大概長這樣async function initPage() { const res await fetch(/api/user/info); const data await res.json(); // 預(yù)期data.user.name但實際接口返回的是data.data.userName document.getElementById(username).textContent data.user.name; }這段代碼在data.user為undefined時會拋出TypeError導(dǎo)致后續(xù)渲染中斷頁面白屏。4.2 讓AI自己拉日志和請求頁面在手機(jī)上打開后vConsole面板會顯示報錯同時數(shù)據(jù)通過WebSocket推到了MCP Server。現(xiàn)在我在AI客戶端里輸入幫我看看最近這個H5頁面為什么白屏了先拉一下最近的錯誤日志和網(wǎng)絡(luò)請求。AI會調(diào)用get_logs工具傳入level: error拿到類似這樣的結(jié)果[ { timestamp: 1712345678901, type: error, args: [ TypeError: Cannot read properties of undefined (reading name), at initPage (app.js:15:45) ] } ]然后AI會調(diào)用get_requests傳入urlKeyword: /api/user/info拿到[ { timestamp: 1712345678800, method: GET, url: /api/user/info, status: 200, duration: 120, responseBody: {\code\:0,\data\:{\userName\:\張三\,\userId\:123}} } ]有了這兩條信息AI就能直接給出結(jié)論接口返回的字段是data.data.userName但代碼里訪問的是data.user.name字段路徑不匹配導(dǎo)致TypeError。整個分析過程不需要我手動復(fù)制任何日志。4.3 對比傳統(tǒng)流程的效率差異傳統(tǒng)流程下這個問題的排查步驟是在手機(jī)上打開頁面看到白屏打開vConsole切到Console面板看到報錯截圖或復(fù)制報錯信息切到Network面板找到接口請求查看響應(yīng)體復(fù)制響應(yīng)體打開AI對話窗口粘貼報錯和響應(yīng)體描述問題AI分析后給出結(jié)論整個過程至少需要5-6次手動操作耗時2-3分鐘。而通過MCP鏈路只需要對AI說一句話AI自己完成數(shù)據(jù)拉取和分析耗時10-20秒。更重要的是AI拿到的是完整數(shù)據(jù)不會因為手動復(fù)制遺漏關(guān)鍵信息。4.4 幾個實測中發(fā)現(xiàn)的細(xì)節(jié)問題第一個問題日志順序錯亂。WebSocket消息是異步到達(dá)的如果頁面瞬間產(chǎn)生大量日志服務(wù)端接收順序可能跟實際產(chǎn)生順序不一致。解決方案是在每條日志里帶上客戶端時間戳服務(wù)端按時間戳排序后再返回給AI。第二個問題循環(huán)日志導(dǎo)致數(shù)據(jù)爆炸。有些頁面會在定時器里不斷打日志幾秒鐘就能產(chǎn)生上千條。如果不加限制內(nèi)存和磁盤都會被撐爆。解決方案是在頁面端做采樣同樣的日志內(nèi)容在1秒內(nèi)只上報一次const recentLogs new Map(); function shouldReport(content) { const now Date.now(); const lastTime recentLogs.get(content); if (lastTime now - lastTime 1000) { return false; } recentLogs.set(content, now); // 清理過期記錄 if (recentLogs.size 1000) { for (const [key, time] of recentLogs) { if (now - time 5000) recentLogs.delete(key); } } return true; }第三個問題敏感信息泄露。請求體里可能包含密碼、token等敏感字段。如果這些數(shù)據(jù)被推送到服務(wù)端并持久化到磁盤存在安全風(fēng)險。解決方案是在頁面端做脫敏處理對包含password、token、authorization等關(guān)鍵詞的字段進(jìn)行掩碼function sanitize(obj) { if (typeof obj ! object || obj null) return obj; const sensitiveKeys [password, token, authorization, secret, cookie]; const result Array.isArray(obj) ? [] : {}; for (const [key, value] of Object.entries(obj)) { if (sensitiveKeys.some(k key.toLowerCase().includes(k))) { result[key] ***REDACTED***; } else if (typeof value object) { result[key] sanitize(value); } else { result[key] value; } } return result; }5. 進(jìn)階玩法讓MCP Server不只是查日志5.1 增加主動執(zhí)行能力遠(yuǎn)程執(zhí)行JS基礎(chǔ)的查詢功能只能讓AI看但如果AI能做調(diào)試效率會更高。比如AI發(fā)現(xiàn)某個變量值不對可以直接在頁面里執(zhí)行一段JS來驗證假設(shè)。實現(xiàn)方式是在MCP Server里增加一個eval_js工具通過WebSocket向頁面發(fā)送指令頁面執(zhí)行后把結(jié)果返回// MCP Server端 { name: eval_js, description: 在H5頁面中執(zhí)行JavaScript代碼并返回結(jié)果, inputSchema: { type: object, properties: { code: { type: string, description: 要執(zhí)行的JS代碼 } }, required: [code] } }頁面端收到eval指令后執(zhí)行ws.onmessage (event) { const data JSON.parse(event.data); if (data.type eval) { try { const result eval(data.code); ws.send(JSON.stringify({ type: eval_result, id: data.id, result: String(result) })); } catch (e) { ws.send(JSON.stringify({ type: eval_result, id: data.id, error: e.message })); } } };這個功能非常強(qiáng)大但也有風(fēng)險。必須限制執(zhí)行權(quán)限只允許在開發(fā)環(huán)境使用生產(chǎn)環(huán)境要禁用??梢栽陧撁娑思右粋€開關(guān)只有URL參數(shù)里帶了debug1才啟用eval功能。5.2 日志與請求的關(guān)聯(lián)分析單獨看日志和單獨看請求有時候很難定位問題。比如一個接口報錯但日志里沒有明顯異常。這時候需要把請求和它前后的日志關(guān)聯(lián)起來。實現(xiàn)思路是在頁面端記錄每條日志和請求的序列號服務(wù)端按序列號排序。查詢時如果AI指定了某個請求就返回該請求前后各10條日志function getContextAroundRequest(requestId, windowSize 10) { const allEvents [ ...store.logs.map(l ({ ...l, eventType: log })), ...store.requests.map(r ({ ...r, eventType: request })) ].sort((a, b) a.timestamp - b.timestamp); const index allEvents.findIndex(e e.id requestId); if (index -1) return []; return allEvents.slice( Math.max(0, index - windowSize), Math.min(allEvents.length, index windowSize 1) ); }這樣AI在分析問題時能看到完整的上下文而不是孤立的一條日志或一個請求。5.3 多頁面同時調(diào)試的支持實際項目中一個H5應(yīng)用可能有多個頁面或者同時打開多個WebView。如果所有頁面的數(shù)據(jù)都混在一起AI很難區(qū)分。解決方案是在WebSocket連接建立時客戶端發(fā)送一個頁面標(biāo)識const pageId ${location.pathname}_${Date.now()}; ws.onopen () { ws.send(JSON.stringify({ type: register, pageId, url: location.href })); };服務(wù)端按pageId分組存儲數(shù)據(jù)。MCP工具增加pageId參數(shù)AI可以指定查詢哪個頁面的數(shù)據(jù)。如果不指定就返回所有頁面的匯總但每條數(shù)據(jù)都帶上pageId標(biāo)識。5.4 與Playwright MCP的聯(lián)動如果你同時在使用Playwright MCP做自動化測試可以把兩者結(jié)合起來。Playwright負(fù)責(zé)操作頁面點擊、輸入、導(dǎo)航vConsole MCP負(fù)責(zé)收集頁面運行時的日志和請求。AI可以在執(zhí)行完一個操作后自動拉取該操作產(chǎn)生的日志和請求驗證是否符合預(yù)期。這種聯(lián)動方式特別適合做回歸測試AI自動跑一遍核心流程然后檢查有沒有報錯日志、有沒有失敗的請求。比人工寫斷言靈活得多因為AI可以根據(jù)上下文判斷這個報錯是否正常。6. 踩過的坑與穩(wěn)定性優(yōu)化6.1 WebSocket連接在移動端的斷連問題移動端瀏覽器在切后臺、鎖屏、網(wǎng)絡(luò)切換時WebSocket連接大概率會斷開。而且不同瀏覽器的行為不一致有些會立即觸發(fā)onclose有些會靜默斷開onclose延遲很久才觸發(fā)。解決方案是雙保險客戶端心跳 服務(wù)端超時檢測??蛻舳嗣?0秒發(fā)ping服務(wù)端如果60秒沒收到任何消息就主動關(guān)閉連接??蛻舳藱z測到連接關(guān)閉后用指數(shù)退避重連。還有一個細(xì)節(jié)頁面從后臺恢復(fù)時要立即檢查連接狀態(tài)??梢酝ㄟ^visibilitychange事件監(jiān)聽document.addEventListener(visibilitychange, () { if (!document.hidden ws.readyState ! WebSocket.OPEN) { reconnect(); } });6.2 大數(shù)據(jù)量下的性能問題當(dāng)頁面產(chǎn)生大量日志時WebSocket消息可能非常大。比如一個接口返回了1MB的JSON直接通過WebSocket發(fā)送會導(dǎo)致消息分片增加延遲。解決方案是在頁面端做壓縮和截斷。對于超過10KB的響應(yīng)體只發(fā)送前10KB并標(biāo)記truncated: true。如果AI需要完整數(shù)據(jù)可以通過另一個工具get_full_response按請求ID查詢服務(wù)端從磁盤讀取完整數(shù)據(jù)。另外日志上報要做批量處理。不要每產(chǎn)生一條日志就發(fā)一次WebSocket消息而是攢夠10條或每隔500毫秒發(fā)一次let logBuffer []; let flushTimer null; function bufferLog(log) { logBuffer.push(log); if (logBuffer.length 10) { flushLogs(); } else if (!flushTimer) { flushTimer setTimeout(flushLogs, 500); } } function flushLogs() { if (logBuffer.length 0) return; ws.send(JSON.stringify({ type: logs_batch, logs: logBuffer })); logBuffer []; clearTimeout(flushTimer); flushTimer null; }6.3 MCP Server的啟動與調(diào)試技巧MCP Server通過stdio通信調(diào)試起來不太直觀。我的做法是同時啟動一個HTTP調(diào)試端口在開發(fā)階段可以通過瀏覽器或curl直接調(diào)用MCP工具驗證邏輯是否正確const http require(http); if (process.env.DEBUG_MCP 1) { http.createServer((req, res) { if (req.url /logs) { res.end(JSON.stringify(store.queryLogs({ limit: 50 }))); } else if (req.url /requests) { res.end(JSON.stringify(store.requests.slice(-50))); } }).listen(8766); }這樣在接入AI客戶端之前可以先通過http://localhost:8766/logs確認(rèn)數(shù)據(jù)是否正常上報。另一個坑是MCP Server的進(jìn)程生命周期。AI客戶端啟動時會拉起MCP Server進(jìn)程客戶端關(guān)閉時會殺掉進(jìn)程。如果你的WebSocket服務(wù)也在同一個進(jìn)程里客戶端關(guān)閉后WebSocket服務(wù)也會停止頁面就斷連了。解決方案是把WebSocket服務(wù)和MCP Server拆成兩個獨立進(jìn)程MCP Server通過HTTP或Unix Socket向WebSocket服務(wù)查詢數(shù)據(jù)。6.4 安全邊界什么時候不該用這套方案這套方案的核心是把頁面運行時數(shù)據(jù)暴露給本地服務(wù)。在開發(fā)環(huán)境沒問題但在生產(chǎn)環(huán)境絕對不能用。幾個必須遵守的原則生產(chǎn)環(huán)境構(gòu)建時通過環(huán)境變量徹底移除調(diào)試腳本W(wǎng)ebSocket服務(wù)只監(jiān)聽本地回環(huán)地址127.0.0.1不要監(jiān)聽0.0.0.0如果必須跨設(shè)備調(diào)試手機(jī)連電腦確保在同一個可信局域網(wǎng)內(nèi)且調(diào)試完成后立即關(guān)閉服務(wù)敏感數(shù)據(jù)脫敏必須在頁面端完成不要依賴服務(wù)端處理我在實際項目中會把調(diào)試腳本的引入邏輯放在構(gòu)建工具的配置里通過process.env.NODE_ENV判斷生產(chǎn)構(gòu)建時直接不打包這個腳本。這樣即使有人手動在URL里加參數(shù)也不會有任何調(diào)試代碼執(zhí)行。這套方案我用了大概三個月從最初的簡單日志轉(zhuǎn)發(fā)到后來加上請求攔截、eval執(zhí)行、多頁面支持基本上覆蓋了H5調(diào)試的常見場景。最大的感受是AI輔助debug的前提是AI能拿到足夠的數(shù)據(jù)而MCP正好解決了數(shù)據(jù)通道的問題。vConsole負(fù)責(zé)采集WebSocket負(fù)責(zé)傳輸MCP負(fù)責(zé)暴露給AI三者各司其職組合起來就是一個完整的AI輔助調(diào)試閉環(huán)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久月天| 日本高清电影欧美色图| 黑人精品XXX一区一二区| 国产1727欧美| oumeisetupian| 337p大胆噜噜噜噜噜91Av| 国产精品一区二区亚洲人成毛片| 久久综合97| 综合天天。| 美女大乳久久久久久久女人18| 插欧洲美女欧美精品| 88xx成人精品视频| 黄片www视频免费| 无卡一区=区| 亚洲码和欧洲精品激情系列| 午夜呻吟欧美| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 96久久科窝| 色色色天美视频| 性爱视频啪啪啪啪| 秋霞久久亚洲精品成人| 亚洲性爱成人| 乱伦熟妇一区二区| 岛国黄片网站| 国产精品人人爽人人做可爱福利| 国产女人与拘做受视频免费| 国产精品69人妻无码久久久| 东北丰满熟女国产一区| 亚洲欧美综合区自拍另类| 被窝影院午夜看片无码| 成人a大片在线观看| 人人妻碰人人免费| 免费又黄又裸乳的视频| 中国国产精品一区视频| 中字乱伦AV| 日本欧美成人片AAAA| 五月天大香蕉| 嗯嗯啊啊视频在线看| 天天干少妇| 久久超碰爱| 久久精彩视频9| 91最新综合| 久久久久久性爱视频| 夜夜高潮夜夜爽| 亚洲第一色页夜| 91黑丝美女| 啊啊啊不要好爽日韩无码一区| 亚洲熟女乱熟乱熟妇综合网二区| 91n处女在线观看| 久久9精品| 成人性爱免费播放| 91精品国产日韩欧美综合| 无码精品人妻一区二区三区妖精| 伊人色综合网电影| 打av高清| 97欧美色综合| 欧美亚洲情色| 色色色欧美| 久9视频| 97人人草| 97色97好| 亚洲综合嫩| 人妻天天爽天天爽三区| 婷婷午夜成人色中色| 国产九九九九九九九九| 密桃99999| 美女啊啊啊啊啊啊啊| 99热aaa| 亚洲丝袜在线观看| 中字幕人妻一区二区三区| 亚一综合久久久久久久久久| 六月丁香久久| 国产25页| 亚洲欧洲自拍| 久久精品国产亚洲AV无码做| 人妻天堂综合网| surenchaopeng| 青青草综合在线| 翔田千里爆乳巨臀无码| 日本国产成人亚洲精品无码| 国产四虎在线| 久久日韩肥臀| 91c色| 97视频网站在线观看| 欧美第一页| 麻豆久久精品亚洲精品88| 美女午夜福利免费视频| 精品一区96| 精品人妻一区二区三区蜜桃视频| 欧美黄色大片在线观看 | 大香蕉伊人75| 嫩草影院在线观看精品| 欧美日韩亚洲高清不卡一区二区三区| 91久久国外网| 亚洲AV成人无码一二三久久 | 天久久久噜噜噜久久国产精品爽爽 | 盗摄女人妻在线| 啊啊啊啊啊在线观看网址 | 日韩欧洲操屄视频| 在线黄页看毛片| 婷婷九月丁香| 粉嫩av在线一区二区| 中文字幕亚洲欧美在线不卡| 黄片qw| 亚洲色图久久成人| 精品福利| 99热这里只有精| 日韩9区| 亚洲精品日日夜夜52| 欧美色自拍| 国产精品久久aV| 黄色网址久久精品欧美喷水| 亚洲欧美成人网站AAA| 五月丁香综合啪啪| 中文字幕一区二区三区字幕| 偷拍亚洲| 亚洲成人福利电影免费| 在线黄色污污网站| av天堂精品久久| 91伊人影视综合| 老司机福利青青草| 乱理日韩中文| 久艾草在线精品视频在线观看| 国产精品一二三区福利| 九九碰九九爱97超| 青青草原综合久久大伊人精品| 亚州综合网| 人妻天堂综合网| 中文字幕乱亚洲美女精品一区| 九九热在线精品视频| 久久有码视频| 日韩久久超碰色| 91午夜无码| 97超碰人操| 偷窥自拍A片| 国产又粗又长又大的视频| 尹人大香蕉视频在线| 久久久无码视频| 97人肏| 亚洲国产丝袜熟女av| 精品妇女一区二区三区| 波多野结衣AV无码一区| 九九免费影片| 农村妇女一级二级三级视频| 日韩欧美成人午夜福利| 伊人欧美大香蕉视频| 天天做天天爱天天高潮| 国产大陆天天艹| 五月天婷婷社区| 丰满翘臀美女影院视频| 美国人人操人人操| 人妻丝袜美腿中文字幕| 九九精品网| 少妇99成人麻豆| 一类无码操逼视频| 色y情视频免费看| 午夜久久久| 四虎永久在线精品免费网址 | 强奸乱伦AV网站| 欧美色图亚洲色,麻豆| 精品久久久久久亚洲| 我要去看2个日本美女.com曹逼| 精品然女一区二区| 屌逼麻豆| 中日韩久久久| 天天做日日做| 啊啊啊想要| 中文字幕第23区| 2010男人的天堂| 国产亚洲精品第一最新| 收看日本人日bb| 久久久久久人| 日韩亚洲97| 九九视品黄色| 亚洲欧洲另类| 美女自卫慰黄网站免费| 国产欧美日韩精品中文| 日本一区二区亚洲综合| 亚欧无码线免费观看视频| av影院十区| 五十路人妻在线| 91天美传媒精品| 91扒丝袜综合在线| 熟女啪啪视频| 人妻日日夜夜精品| 啊啊啊啊在线观看网址| 精品久久久久,69国产成人精| 久久激情亚洲精品无码?V | 亚洲免费日韩在线一区二区| 国产最新AV| 日韩午夜啪啪视频| 国产精品一级片在线看| 色9999日韩国产| 中文字幕一区二区三区高清| 亚洲一区日韩精品| 日韩欧洲操屄视频| 色吧5亚洲| 天久久久噜噜噜久久国产精品爽爽 | 91亚洲网站| 久久久久久无码人妻中文字幕| 国产专区路线| 欧美久久毛片基地| 人妻人妻天天碰| 九九热超碰97亚洲最新香蕉| 是还免费视频1727我| 玖玖爱一区在线| 亚州乱码中文字幕综合久久久| 婷婷五月天激情网| 欧美久久婷婷| 成人资源中文字幕在线观看| 九九五月天| 夜夜嗨一区二区三区三州加勒比 | 99热婷婷| 啊啊啊啊视频免费| 天美一二三在线观看Av| 操亚州| 色女免费在线观看视频网址| 中文字幕av一区二区三区人妻少妇 | 久久精品28| 2017天天插| 91成人无码| 亚洲国产综合图区中文字幕| 热99这里有精品综合久久| 插入逼91| 尤物黄色在线观看网站| 在线看免费无码AV天堂的| 翔田千里av一区二区三区| 99久热| 插入综合网| 日韩精品高清资源在线| 亚洲色丰满少妇高潮| 操曰本熟女| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 欧美性爱www免费版| 国产高清26uuu| 操逼视频亚洲| 97天天摸天天碰| 欧美熟妇乱码在线一区| 色踪合AV| 人人爱人人乐人人操| 韩国一级婬片A片无码天美| 国产综合网站在线播放 | 一级特级aaaa毛片免费观看| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 国产乱伦一二三区| 亚洲AO在线| 走光一区92下载| 校园春色AV天堂| 强奸乱伦AV网址| 国产伦精品一区二区三区在线观| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | av亚欧| 性久久| 青青草日韩无码| 伊人网在线观看| 色69大色97香蕉| 国产自制av蜜乳| 夜间福利片1000无码| 国产 码在线成人网站| 啊嗯好大视频在线观看| 久久国产精品m码| 不卡av在线中文字幕| 大香蕉啪啪网| 玖玖爱伊人玖玖爱| 午夜操逼不卡| 一区黄二区黄| 青青草公开在线免费不卡视频| 97超碰磁| 日韩中文字幕av在线播放| 伊人九九九| 五月婷婷丁香中文字幕| 九九热视频这里只有精品| 97网色| 久久久久国产一区二| 超碰97网址| 97干在线| 日韩精品 资源| 999久久久久久久久| 日本高清_区二区三区| 日本不卡码黄色| 91亚洲综合| 99中出在线| 人妻丝袜二区| 91精品91久久久中77777| 天天爽入口| 天天激情干| 国产高清不卡视频| 国产女s强制榨精视频| 黄页18禁| 国产精品内射婷婷一级二| 五月婷婷激情| 91P0RNY大屁股人妻| 无码91| 日韩欧美加勒比| 大香樵伊人网| 欧美日韩国产一区二区小黄片大全| 日日日日日| 伊人麻豆传媒| 韩日男人的天堂| 在线毛片片免费观看| 青娱乐导航AV| 91精品亚洲内射孕妇| 欧美性爱一区| 日韩午夜精品一区二区三区电影| 夜夜免费视频| 天天综合,91综合永久| 国语少妇精| 色色色色色色色色色色色色色色综合| 在线日韩精品一区二区三区| 骚逼一区二区| 成人免费不卡在线视频| 国产99999| 国产精品熟女AV中文字幕在线播放| 人人操人人色网| 九一屌逼| 成人美女av| 亚洲97资源| 少妇毛片久久| 婷婷去俺也去六月色| 亚洲在线A| 久久乐| 欧美呦呦性爱| 欧美色图第一页| 一区二区精品更新提醒| 欧美人人AAA| 欧美美女视频| 龙兴卡官方查询| 亚洲中文字幕av| 中欧人妻丝袜中文字幕 | 男人a天堂手机在线版| 加勒比无码毛片| 亚洲男人天堂2019| 青椒国产97在线熟女| 久久久免费高清中文视频| 丁香五月激情综合| 思思热免费在线视频| av橘色网站| 久久久久七视频| 婷婷五月综合在线| 国产操伦| 欧美精品三级黄片| 久久久免费视频18| 制服诱惑亚洲一区二区三区在线观看| 欧插网站| 99热精品在线| 99精品视频在线观看免费| 青草成人免费视频一COm| 欧美熟女妇同| 色性荡荡荡荡视频| 蜜桃臀av在线观看| 国产福利小视频高清在线观看| 亚洲激情综合另类| 97在线播放| 色男人色天堂东京热| 按摩中文字幕| 国模限制级电影| 性爱乱伦网址| 手机在线播放国产福利| 午夜视频黄| 99精品人妻| 99色在线| 人妻人久久精品中文字幕| 国产精品午夜成人福利| 久操 高清| 亚洲色图久久成人| 天天做天天爱天天爽| 久久久精品无码亚免费| 国产日韩精品人妻久久久久色欲网站| 99久久精品无码一区二区毛片免费| www国产精品| 高颜值美女口爆高潮浪叫| 后入式五六区| 97伦乱| 色阁阁AV综合网| 麻豆国产成人精品| 色悠久久久av| 久久精品中文字幕女同| 97欧美色综合| 色与欲影视天天看综合网| 黄色一区三区| 热热色青青草| 91爱| 亚洲一区二区三区春色| 久久这里只精品免费福利| 成人精品在线免费视频| 成人av福利在线观看| 18禁止看精品中文字幕| 日韩中文字幕视频| 午夜男人av| 日韩图区 偷拍| 亚洲天堂AV在线播放| 亚洲国产婷婷在线播放| 成人 日本A片无码8888| 久久久久婷婷| 日韩偷拍色图| 99国产精品免费| 日韩精品第3页| 亚州国产成人精品女人久久 | 全免费a敌肛交毛片免费| 国产一区二区在线电影| 免费观看的av| 色色99| 97热视频在线观看| 熟妇人妻丰满久久久久久久无码| 亚洲国产精品无码AV久久| 日韩操p| 永久免费发布性爱网| 巨爆乳肉感一区二区三区竹菊影视 | 亚洲第91页| 九九热午夜欧亚国产视频| 国产一区二区在线看| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 无码99| 97公开久久| 极品一区二区三区免费| 国产精品操| 777AV电影| 无套内射性感少妇视频| 秋霞男人网| 日韩97视频| 国产400孕妇孕交群| 久久精品国产AV一区二区三区| 插日本熟女视频| 久久精品人体| 俺去啦自拍| 操b在线观看| 岛国片在线观看视频亚洲| 人人手机欧洲亚洲国产人妻| 国产一区二区精品久久久不卡蜜臀| 国产成年女黄特黄| 亚洲色诱惑| 亚洲色丰满少妇高潮| 欧美天堂在线| 久久久国产亚洲精品系列| 好吊妞转入那个网| 青青草一区二区三区四| 亚洲A曰本VA欧美VA视频| 天天色播| 欧美色图在线视频少妇| 强奸乱伦免费网站| 青青青国产| 精品一级| 99无码视频| 国产蜜臀在线| 久草免费福利在线播放| 成人女人国产| 国产精品 视频| 超碰人人干| 九九免费影片| 无码精品一区二区三区潘金莲| 亚洲精品丝袜| 人人搞人人插人人操| 丁香六月婷| 97视频在线观看网站| 国产成人99久久亚洲综合| 艹我哪美一区无码| 91美女片在线| 超碰亚洲欧美日韩无| 婷婷人妻激情| 中文激情网| 干美女人妻| 在线强奷到舒服的无码视频 | 亚洲在饯| 偷拍亚洲高清图片| 日韩免费簧片| 性色av一区二区| 夜夜操美女| 操逼内射干逼白丝91| 免费视频在线一区二区不卡| 中文字幕精品丝袜| 国产久久免费精品视频| 欧美色图下一页| 啪啪啪东京| 欧美大战久久久伊人| 国产一区自拍欧美日韩| 一二三四视频在线社区中文字幕| 一级特级aaaa毛片免费观看| 黄久久| 九九黄色网| 美女性91| 操操操操操操| 亚洲天堂AV在线播放| 亚洲色图自拍| 亚洲天堂久久| 91免费看一区二区三区| 日日夜夜模| 手机看av网站在线看| 天美av在线| 天天日日舔舔| 人人操人人插人人摸人人干| 欧美人妻熟女在线| 欧美性天天影视| 黄视频免费| 91青青在线视频| 99爱爱| 青娱乐休闲视频在线观看| 精品97久久综合| 久草免费在线一区二区| 久久久久久久精| 欧美中文狠| 日韩激情啪啪| 久操视频在线观看| 国产成人精品午夜福利| 久久精品欧美一区蜜桃| 欧美性爱日韩性爱| 国产精品96久久久久久| 日本幼女18+| 日日躁狠狠躁天天躁精品| 天天综合精品| 久久透逼视频| 五月天精品| 天天插天天插| 嗯啊抽插大香蕉网页| 久久久女人| 精品十三区| 麻花传媒免费网站在线观看| 啊啊啊啊操死我| 97在线观看免费视频l| 欧美有码亚洲中文字幕一区二区三区四区 | 免费看片黄| 九九av| 欧美三级一级| 成年女人18级毛片毛片免费观看| 久久中文字幕不卡人妻| 少妇特黄一区二区三区| 亚洲。日韩。欧美| 91艹B视频| 国产色图乱伦| 欧美综合中文| 超碰这里有精品| 乱理日韩中文| 人人爽天天爽| 婷婷丁香六月| 亚洲蜜桃V妇女| 久久精品国产亚洲妲己影视| 91熟女丨老女人| 亚洲涩图欧美| 91美女在线视频| 熟女丝袜视频| 色色色色色色色色色色色色色色综合| 国产做?爰片久久毛片?片美国| 成人无码在线超碰网| 丁香九月婷婷| 中文字幕乱码在线观看| 久久精品成人| 伊人久久亚洲色欲综合网站| 97中文字幕色| 欧美一二在线| 国产丰满熟夫69mpp| 亚洲。日韩。欧美| 日韩一999精品| 欧美另类色图片| 色噜噜狠狠色综合日日| 国产97色在线| 国产福利精品最新在线| 精品黑人一区二区| 大香蕉综合在线| 日本岛国黄色网址| 五月婷婷激情综合| 嗯嗯啊啊视频在线看| 日日夜夜干| 操狠狠| 秋霞男人网| 亚州综合色图| 91劲爆| 亚洲另类色综合网站| 人妻精品一区一区三区蜜桃91| 亚洲清纯唯美| 青草地一本线一区二区三区| 97欧美视频| 人人操人人摸avav| 国产综合网站在线播放 | 欧美,日韩,中文,另类| 久久精品操| 国产精品乱码久久| 欧美真人抽搐一进一出gif| 岛国片在线播放| 国产人妖视频一区在线观看| 久久草在线综合视频| 亚洲第一综合| 超碰91在线| 看日韩黄片| 加勒比在线观看一区二区| 亚洲黄色网址视频| 在线 制服丝袜中出 人妻| 97免费在线视频在线观看| 欧美永久激情一区二区| 日本一久是| 亚洲熟女诱惑| 国产女人与拘做受视频免费| 人人扣人人操| 日日A∨| 亚洲丝袜二区在线| 综合亚洲欧美精品日韩?v| 日本女优在线视频福利| 久操黄色视频| 舔人妻中文免费视频| 色香AV| 午夜精品五区| 97玖玖人妻| 一本色道久久综合狠狠操| 国产毛片片精品天天看视频| 午夜黄色免费在线观看| 国产白嫩精品久久| 亚洲天堂久久| 啪啪AV导航| 天天肏美女| 亚洲 欧美 日本 国内 首页| 人人做天天爱| 91欧美高清| 精品白丝一区| 中文字幕在线观看永久| 99这里有精品| 国产91美女视频| 免费自拍三级综合| 另类图片五月| 99精品九九九九九九| 亚洲一区二区三区中文字幕| 亚洲男人的天堂一区二区| 高清无码91| 亚洲AV噜噜狠狠网址蜜桃动漫| 天天综合精品| 97资源久久| 91丨九色丨熟女高潮| 久操影视| www..com操老师| 91天天综合网,天天综合网| 男人天堂东京热| 香蕉婷婷| 日本欧美不卡| 久草五月| 熟女少妇视频| 99在线精品观看99| 日韩精品亚洲一二三| 综合欧美激情网| 淫乱图区| 欧美另类综合久久| 免费啊啊啊| 欧美一级久久久久久久大片动画| 四虎国产成人精品免费一女五男| A级片日韩欧美国产欧美视频精选观看| 国产丝袜视频| 国产老女人久久毛| 天天综合AV| 欧美人黑A片无码免视费| 日本高清电影欧美色图| 国产精品久久久久久久久久久久| 男人夜色天堂ss| 青青久久艹| 欧美久久九九| 国内毛片欧美香蕉精品| 中文字幕av久久爽Av| 欧美日韩插逼视频| 97资源免费视频| 日韩人妻播放| 亚洲少妇综合| 人妻熟女字幕一区二区| 亚州欧美色图| 97色97好| 日韩人妻 中文字幕| 日本免费一区二区不卡| **一级毛片国产| 欧美精品黑人猛交高潮| 精品久久久av| 久久久久久一日韩字幕无码| 97欧美久久久久久久| 成人在线视频网| 综合网91| 伊人亚洲综合| 九九av| 国产精品福利资源在线尤物| 天堂资源站| 超碰人人草| 97久久网| 超碰免费欧美7| 99色热| 久久久久久久九九九九九九| 吊色| www.四虎在线| 日韩Va亚洲va欧美Ⅴa久久| 91亚洲黄色网| 亚洲综合码| 成年人一级黄色毛片大全在线观看| 亚洲图片 欧美电影| 久久9久9久99久9久9| 搡老人老9丨女老熟人| 九久9精品| 精品无码人妻一区二区免费蜜桃| 激情九月婷婷| 樱花蜜乳av| 99re视频在线播放青草| 欧美色66| 人妻熟女午夜精品在线| 在线看的av| 国产97视频| 欧美在线视频观看一二三四区高清| 婷婷香蕉| 伊人久操| 最新av中文字幕高清| 久久久久久99999国产精品| 天天日日日射| 91日韩在线| 欧美日韩国产高清在线一二三区| 91欧洲国产成人久久精品网站| 天天综合网亚洲综合网| 九九拍拍精品视频在线播放 | 男人天堂导航| 99精品人人爽| 综合激情97 | 欧美成人精品欧美一级乱黄一区二…| 欧洲精品人妻| 97在线欧洲| 3571色综合一区二区二区| 激情干在线| 操逼免费视频无码国产| 肉动漫无遮挡h在线观看| 国产精品乱码久久久久久久久| 亚洲91网站| 欧美 日韩 国产传媒| 欧美夜夜狠| AA丁香综合激情| av天堂手机版追回 | 超碰视97中文| 97视频www| 99国产精品免费| 成人熟女视频一区二区三区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 一区二区三区在线资源| 超碰99热| 狠狠综合| 男人的天堂啪啪| 欧美操人| 黑丝内射一区二区三区| 色婷婷综合网| 大香交伊人网| 日韩啪啪啪啪啪| 日本狠狠干| 亚洲激情网| 超碰免费在线| 大香蕉色十月| 香一区二区三区| 嗯嗯啊啊用力视频免费| 欧美亚洲影视| 国产成人主播| 天天热精品| av影院十区| 外站AV在线| 日本人妻最新在线中| 精品三级在线专区| 国产日韩欧美操逼视频| 操逼片国产| 黄色欧美性爱视频| av九九| 久久理论字幕视频| 美骚妇av高清在线| 一区二区三区在线日韩影院观看| 久久有码视频| 亚洲天天综合| 日韩精品在线观看观看| 天天干天天操天天干天天操 | 91九九| 91看黄片| 青娱乐久久艹| 色蜜AV| 美女主播色欲91抠b在线播放| 天天干干天天干干| 手机看av网站在线看| 天天爽天天| 亚射在线| 亚洲成人AB| 精品久久久久久中文字幕视频免费| 亚洲日韩在线a不卡99精品| 国产AV激情无码久久无码| 91精品久久久久久77777| 九色 人妻 大香蕉| 嗯嗯啊啊好大好爽| 98久久超碰| 欧美一区二区福利在线| 五月天激情影院| 欧美色图偷拍另类| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 夜夜操青青草| 亚洲激情久久| 丝袜美腿射精91| 五十路熟女人妻一区二区在线观看| 秋霞网—男女啪啪亚洲免费体验区 | 370p日韩欧美亚洲精品| 久久九九99| 高跟伊人julia ann| 性高潮久久久久久久久久久| 先锋影音av先锋一区| 偷窥自拍A片| 成人A片男人的天堂| 亚洲 欧美 日韩另类 麻豆| J?P?NESEHD熟女熟妇伦| 4399成人黄A片| 99精品伊人| 欧美色图色综合| 亚洲日韩精品在线播放| 成人A片男人的天堂| 天天干电影| 最新国产亚洲精品精品国产亚洲综合| 97超碰色屌| 男人的午夜天堂| 丁香色五月 97干| 超碰1997| 日本三级A片网站com| 91在线欧色| 男人的天堂99| 国产视频一区二区免费| WWW.加勒比人妻一区不卡.com| 亚洲高清欧美总合| 在线观看国产黄色| 国产精品不卡一区二区三区| 国产呦精品系列在线观看| AA丁香综合激情| 亚洲在钱| 亚洲欧美国产成人综合不卡| 欧美午夜视频| 亚洲成aⅴ人片不卡无码| 天美AV片| 天天澡天天爽日日AV| 骚鸭AV| 日本在线不卡v二区| 成人欧美日超碰| 国产乱色国产精品免费视| 夜夜高潮夜夜爽高清视频一 | 欧美大香蕉卡久久| 亚洲欧洲自拍| 亚洲综合小说另类图欧美视频激情小说色五月天 | 97视频在线免费观看| 日本久久99| 日本欧美不卡| 亚洲激情网一二三四区| 中日韓欧美高清| 精品久久久久,69国产成人精| 97在线观| 久久久久精| 国产高清亚洲日韩一区 | 91精品微拍福利| 超碰97最新人妻| 亚洲无码免费看| 熟女露脸激情自拍视频| 国产小u女在线观看| 亚洲素人综合| 九九热最新| 2024年最新色情网站在线观看| 蜜桃久久久久久久| 激情 欧美 亚洲 小说| 九九九九九九九九九五码| 亚洲AV无码AV吞精久久久久 | 天天做日日爱夜夜爽| 又黄又硬又粗又长国产视频| 看日韩美女二区三区免费操逼视频 | 9国产超碰| 欧美日韩天堂| 色五月首页| 草草草视频在线免费看| 97这里只精品| 日欧操屄视频| 家庭乱伦麻豆| 久久99深爱久久99精品| 九九aV| 肏逼视频日本| 午夜AV污污污| 91校园春色长篇| 日韩av电影成人在线| 欧美在线 亚洲| 狠狠干综合| 一区操逼| 综合亚州欧美| 天天爽夜夜欢视| 日韩av一级黄片| 欧美色999| 97免费视频在线观看视频| 天天综合精品| 黄片国产精品一区二区| 国产综合久| 青青草大香蕉在线视频| 色99视频| 自怕偷自怕亚洲精品| 久热伊人| 操逼999| 丝袜熟女2P| 亚洲乱码国产乱码精网站| 欧美+日产+中文| 丝袜av一区二区三区| 丁香五月天啪啪| www.99中文字幕| 久久久久9999| 新怡红院| 青木玲在线不卡| 亚洲人成色9999精品久久| 岛国艾薇凹凸视频天堂| 久久狠狠色噜噜狠狠狠狠97| 欧美九一精品久久久熟妇| 97国伦国色| 欧美男人一区| 日韩性爱电影一区| αⅴ天堂| 乱伦一二三| 91综合网在线| 综合大香蕉美。| 97视频620| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 中文字幕丰满人妻日本| 欧美97网| 亚洲 无码 有码 中文字幕| 躁躁日曰躁2020| 一区二区三区 丝袜 高跟 美腿| 五月综合婷婷久久网站| av网站在线观看了| 亚洲av无码成电影在线播放| 97干在线| 亚洲97在线| 久久久青青草| 成人九九| 久久风骚城市人| 国产熟码AV| 中文字幕精品亚洲熟女| 久久爱超碰网| 欧美性生活内射| 婷婷五月天无码| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 国产肏屁眼视频| 国产精品 午夜福利| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 国产后入| 日韩福利电影网| 日本成a人v网站在线观看| 国产97在线 | 亚洲| 激情欧美97| 精品午夜福利| 欧美日韩在线小说| 亚州91| 91欧洲国产成人久久精品网站| 麻豆久久一区二区三区| 丁香九月婷婷| 男啪女色黄无遮挡免费观看| 青青草国产欧美非洲黑人| 国产日韩久久| 中文一区二区三区影院| 欧美精品三级黄片| 亚洲欧美色图小说| 国产毛片久久久久久久| 国模不卡| 亚卅熟女乱色| 大香交伊人网| 怡红院怡春院| 裸体1区| 精品女同一区| 精人妻一区二区三区| 94色色电影网| 国产精品福利资源在线尤物| 第四色奇米影视777| 岛国艾薇凹凸视频天堂| AA丁香综合激情| 97精品国产97久久久久久户外免费| 67194无码不卡| 亚洲视频二区 | 亚洲欧美综合区自拍另类| 在线v中文字幕一区二区三区| 伊人久久婷婷| 老熟女熟妇| 国产精品3| 亚洲日韩电影| 色欲无码人妻日韩欧美精品| 女同性恋久久| 日韩乱码av| 60秒免费小视频| 中国91AV| 熟女这里只有精品6| 探花熟女,姿勢到位,體驗感也到位| 色噜噜综合网| 好吊色一区| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 四虎精品亚洲| A级国产欧美激情在线| 大香蕉一线视频| 91久久久久久久久久久| 色哟哟av网址| 深夜福利黄片| 精品伊人久久久大香线蕉小说| 伊人综合色网| 精品无码一区二区人妻久久蜜桃| 欧美AB在线| 亚洲一本色道中文无码aV天美| 国产欧美日韩在线观看麻豆传媒公司| 亚洲青色欧美| 综合网天天| 国产自偷| 亚洲一区二区三区不卡国产欧美| 综合久久婷婷| 九九九九九九九九九九九九九九九女| 青青操在线视频| 色色色色日本| 日本精品人妻少妇一区二区| 超碰偷拍| 男女性感激情网站| 国产蜜臀精品一区免费尤物| 久久亚州大香蕉| 大学生口爆吞精| 俺去久久| 日比av无码| 97人人操人人摸人人爱| 日本女厕偷拍| 大香蕉中文| 日韩操人| www.acm成人黄色毛片| 日韩无码三级影院| 精品网站9999| 欧美高清第一页| 综合色99| 97超碰欧美手机在线| 正在播放国产精品一区| 亚洲另类久操网| 天天亚洲| 亚洲成人网站在线观看| 人妻喷水| 精品国产肉丝袜在线拍国语| 亚洲视频二区| 日韩熟女乱伦中出| 97干色天堂| 国产毛片片精品天天看视频| 99热| 亚洲天天更新| 美中韩AV综合网| 一区二区三区高清| 国产激情久久| 97人人夜| 色婷婷久久| 亚洲欧美在线丝袜| 五月婷丁香| 亚洲熟女av中文字幕| 五月激情在线| 女人综合网| 亚洲国产精品乱码在线观看| 少妇久久久久久久久| 婷婷日韩一区二区三区中文字幕在线| 欧洲综合色图| 91精品电影18| 激情熟女12P| 欧美久久婷婷| 国产精品一区午夜福利| 亚洲 综合 第一页| a级成人毛片免费视频高清| 少妇精品久久久八区九区| 一区二区视频在线播放| 麻豆区久久久久亚| 91操碰| 97在线观看| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 综合网久久| 亚洲91在线播放影院| 97超色| 婷婷中文字幕| 尤物视频视频官网| 97干天天| 久久久久亚洲Aⅴ无码| 91亚洲黄色网| 中文字暮97| 秋霞一级A片黄色视频| 99re6国产精品99re| 五月丁香六月婷综合成人综合| 超碰欧美97| 天天综合网1| 手机看片1024你懂的国产| 欧美精品黑人猛交高潮| 亚洲人在线成线成人| 日韩色欲久久一二三四区| av天堂手机版追回| 久操国产在线| 1二区9| 亚洲黄色影视| 日韩字幕一区| 91操熟女视频| 黄色成品网站| 麻豆啪啪啪视频| 日韩性爱一级片| 99福利社| 人人摸人人干| 蜜乳av首页| 无码精品久久| 台湾佬大香蕉| 大肉棒导航| 欧美成人9797| 中日韩欧美精品无码AⅤ一区二区| 精品欧美乱码久| 日韩精品三级片长长久久| 久久精品小视频| 岛国片国产成人亚洲播放| 亚洲图片欧美色| 玖玖大干人妻| 2019AV天堂| 七久久久| 欧美成人一区二区三区在线播放| 国产免费一区2区3区| 天美久久久久| 熟女高潮合集-永久久久-成人AV| 日韩精品区二区三区不卡| 国产综合永久精品日韩鬼片| 亚欧高清| 啊啊啊爽爽| 国产精品一区二区麻豆| 色欲人妻一区二区在线| 婷婷月色| 国产男女无套视频免费观看| 一二三四视频中文字幕在线看| 久久久人妻| 欧美激情精品久久久久久| 91高潮喷水美女| 熟女中出视频| 午夜天天碰综合视频| 久久精品99| 最近的最新的中文字幕视频| 久久无码成人| 91人精品妻入口| 欧美激情激情xxxx欧美专区| 国产精选视频| 欧美小说区视频区| 九九九草| 亚洲drav色图| 超碰97最新人妻| 啊啊好多水| 91色噜噜狠狠| 色月天AV导航| 男女打扑克高清网站| 美女黄色一级A视频| 婷婷五月成人| 99热伊人| 超碰99在线观看| 亚洲AV成人在线| 五月天丁香网| 97在线精品| 91九九| 亚洲日韩一区电影| 激情五月天婷婷| 一区二区三区四区色图| 婷婷五月成人| 六九九九| 1024亚洲中文字幕久在线看片你懂的 | 丁香五月性| 五月丁香久久| 九九九九九九九精品视频| 亚洲男人天堂Av| 亚洲国产欧美日韩人妻日中文| 射 色综合| 国产精品对白内射| 色臀aV| 久久伊人亚洲AV无码网站| 中文字幕蜜乳av| 国产精品又黄又猛又粗| 欧美 精品国产制服第一页| 国产二区三区免费视频| 100啪啪视频大全| 三级AV入口| 欧美强奸一区二区诱惑| 日本黄 R色 成 人网站| 国产超碰在线| 九九九综合精品|