欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

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

vConsole + MCP:讓AI直接讀取H5日志與網(wǎng)絡(luò)請(qǐng)求 1. 移動(dòng)端調(diào)試的困局為什么AI看不見你的H5日志做過H5開發(fā)的人都有一個(gè)共同的痛頁(yè)面在手機(jī)上跑日志在手機(jī)里而你坐在電腦前。Chrome DevTools 的遠(yuǎn)程調(diào)試雖然能用但限制極多——需要USB連接、需要開啟開發(fā)者模式、部分瀏覽器內(nèi)核根本不支持、iOS上的Safari Inspector還經(jīng)常斷連。更別提那些嵌在App WebView里的頁(yè)面你連入口都找不到。傳統(tǒng)的做法是在頁(yè)面里手動(dòng)掛一個(gè)vConsole然后在手機(jī)屏幕上戳來戳去。這個(gè)方案本身沒問題vConsole確實(shí)是移動(dòng)端調(diào)試的利器它能在頁(yè)面上生成一個(gè)懸浮面板展示console日志、網(wǎng)絡(luò)請(qǐng)求、DOM結(jié)構(gòu)、Storage等信息。但問題在于這些信息只有人眼能看到AI看不到。現(xiàn)在大家都在用AI輔助debug你把代碼貼給AIAI幫你分析問題。但AI能拿到的只有你手動(dòng)復(fù)制粘貼的那幾行日志上下文嚴(yán)重缺失。你告訴AI接口報(bào)錯(cuò)了AI問你報(bào)什么錯(cuò)你再去vConsole里翻翻到了再貼過去。這個(gè)來回過程極其低效而且經(jīng)常漏掉關(guān)鍵信息——比如請(qǐng)求頭里的某個(gè)字段、響應(yīng)體的完整結(jié)構(gòu)、報(bào)錯(cuò)前后的日志順序。MCPModel Context Protocol的出現(xiàn)改變了這個(gè)局面。MCP本質(zhì)上是一套讓AI模型能夠調(diào)用外部工具的協(xié)議標(biāo)準(zhǔn)你可以把它理解成給AI裝了一雙手。通過MCPAI不再只能被動(dòng)地接收你粘貼的文本而是可以主動(dòng)去調(diào)用工具、獲取數(shù)據(jù)、執(zhí)行操作。把vConsole和MCP結(jié)合起來就意味著AI可以直接讀取H5頁(yè)面上的日志和網(wǎng)絡(luò)請(qǐng)求不需要你手動(dòng)搬運(yùn)。這篇文章要講的就是怎么把這兩件事串起來。核心思路是在H5頁(yè)面里集成vConsole通過WebSocket把vConsole捕獲的日志和請(qǐng)求數(shù)據(jù)實(shí)時(shí)推送到一個(gè)本地服務(wù)再把這個(gè)服務(wù)封裝成MCP Server讓AI通過MCP協(xié)議直接查詢。整條鏈路打通之后你只需要對(duì)AI說幫我看看剛才那個(gè)頁(yè)面為什么白屏AI就能自己去拉日志、分析請(qǐng)求、定位問題。適合閱讀這篇文章的人有H5開發(fā)經(jīng)驗(yàn)的前端工程師、正在探索AI輔助開發(fā)流程的技術(shù)人、對(duì)MCP協(xié)議感興趣但還沒找到落地場(chǎng)景的開發(fā)者。不需要你精通WebSocket或MCP協(xié)議細(xì)節(jié)我會(huì)把每一步的原理和操作都講清楚。2. 拆解這條鏈路vConsole、WebSocket與MCP各自扮演什么角色2.1 vConsole的能力邊界與數(shù)據(jù)出口vConsole是騰訊開源的一個(gè)輕量級(jí)移動(dòng)端調(diào)試面板壓縮后只有幾十KB對(duì)頁(yè)面性能影響極小。它的核心能力包括Console面板捕獲所有console.log/warn/error/info輸出包括對(duì)象展開Network面板記錄所有XMLHttpRequest和fetch請(qǐng)求的URL、方法、狀態(tài)碼、請(qǐng)求頭、響應(yīng)頭、響應(yīng)體、耗時(shí)Element面板查看和修改DOM結(jié)構(gòu)Storage面板查看Cookie、LocalStorage、SessionStorageSystem面板顯示UA、屏幕尺寸、網(wǎng)絡(luò)類型等關(guān)鍵點(diǎn)在于vConsole提供了一個(gè)插件機(jī)制和事件系統(tǒng)。你可以通過vConsole.VConsolePlugin自定義插件也可以直接hook它的內(nèi)部方法來獲取數(shù)據(jù)。但更優(yōu)雅的方式是利用vConsole的vConsole.core對(duì)象它暴露了一些內(nèi)部API。不過直接hook vConsole內(nèi)部API有個(gè)問題版本升級(jí)可能導(dǎo)致API變化。所以更穩(wěn)妥的方案是自己攔截console方法和XHR/fetch把數(shù)據(jù)同時(shí)輸出給vConsole和WebSocket。這樣即使vConsole升級(jí)你的數(shù)據(jù)通道也不受影響。具體做法是在頁(yè)面加載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對(duì)于網(wǎng)絡(luò)請(qǐng)求攔截XMLHttpRequest的open和send方法以及fetch函數(shù)。這里要注意的是攔截必須在vConsole初始化之前完成否則vConsole會(huì)先捕獲到原始方法。2.2 WebSocket作為實(shí)時(shí)數(shù)據(jù)通道的選型理由為什么用WebSocket而不是HTTP輪詢?cè)蚝芎?jiǎn)單日志和請(qǐng)求是實(shí)時(shí)產(chǎn)生的輪詢有延遲且浪費(fèi)資源。WebSocket建立一次連接后可以雙向通信服務(wù)端可以主動(dòng)推送指令比如開始錄制、清空日志客戶端可以實(shí)時(shí)上報(bào)數(shù)據(jù)。WebSocket的心跳機(jī)制也是必須考慮的。移動(dòng)端網(wǎng)絡(luò)環(huán)境復(fù)雜連接可能因?yàn)榍泻笈_(tái)、網(wǎng)絡(luò)切換等原因斷開。標(biāo)準(zhǔn)做法是客戶端每隔30秒發(fā)送一個(gè)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秒。這樣既不會(huì)頻繁重連造成服務(wù)端壓力也不會(huì)在短暫斷網(wǎng)后長(zhǎng)時(shí)間失聯(lián)。2.3 MCP Server的角色定位與協(xié)議要點(diǎn)MCP Server在這條鏈路里的角色是數(shù)據(jù)中轉(zhuǎn)和查詢接口。它做三件事接收WebSocket客戶端上報(bào)的日志和請(qǐng)求數(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ù)定義的提示模板這個(gè)場(chǎng)景下用得少一個(gè)典型的MCP工具定義長(zhǎng)這樣{ name: get_logs, description: 獲取指定時(shí)間范圍內(nèi)的console日志, inputSchema: { type: object, properties: { since: { type: number, description: 起始時(shí)間戳毫秒不傳則返回最近100條 }, level: { type: string, enum: [log, warn, error, info], description: 日志級(jí)別過濾 }, keyword: { type: string, description: 關(guān)鍵詞搜索 } } } }AI通過MCP協(xié)議調(diào)用這個(gè)工具時(shí)會(huì)傳入?yún)?shù)MCP Server執(zhí)行查詢并返回結(jié)果。整個(gè)過程對(duì)AI來說是透明的它只需要知道我有一個(gè)工具可以查日志。3. 從零搭建vConsole數(shù)據(jù)上報(bào)與MCP Server的完整實(shí)現(xiàn)3.1 頁(yè)面端改造在不破壞原有調(diào)試體驗(yàn)的前提下增加數(shù)據(jù)出口頁(yè)面端的改造原則是最小侵入。你不需要修改業(yè)務(wù)代碼只需要在頁(yè)面入口處引入一個(gè)獨(dú)立的腳本。這個(gè)腳本做四件事初始化WebSocket連接攔截console方法攔截XHR和fetch初始化vConsole保持原有調(diào)試面板可用先看WebSocket連接的建立。這里有一個(gè)細(xì)節(jié)連接地址不能硬編碼。開發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境的服務(wù)器地址不同而且同一頁(yè)面可能在多個(gè)環(huán)境下運(yù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ī)訪問頁(yè)面時(shí)只需要在URL后面加上?debug_host192.168.1.100:8765就能把數(shù)據(jù)推到你的開發(fā)機(jī)上。攔截XHR的代碼需要小心處理因?yàn)楹芏嗫蚣鼙热鏰xios內(nèi)部就是用XHR實(shí)現(xiàn)的。攔截不當(dāng)可能導(dǎo)致請(qǐng)求失敗或數(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可能非常大必須截?cái)喾駝tWebSocket消息可能超過服務(wù)端的接收限制。一般截取前10000個(gè)字符就夠了足夠AI分析問題。對(duì)于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()是因?yàn)閞esponse body只能被讀取一次不clone的話業(yè)務(wù)代碼就讀不到了。3.2 服務(wù)端實(shí)現(xiàn)用Node.js同時(shí)承載WebSocket和MCP服務(wù)端選Node.js的原因很簡(jiǎn)單前后端同語(yǔ)言調(diào)試方便生態(tài)成熟。核心依賴只有兩個(gè)ws用于WebSocketmodelcontextprotocol/sdk用于MCP。先初始化項(xiàng)目mkdir vconsole-mcp-server cd vconsole-mcp-server npm init -y npm install ws modelcontextprotocol/sdk服務(wù)端的主邏輯分兩塊WebSocket服務(wù)接收數(shù)據(jù)MCP服務(wù)暴露查詢接口。兩者共享同一個(gè)數(shù)據(jù)存儲(chǔ)。數(shù)據(jù)存儲(chǔ)用簡(jiǎn)單的內(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ù)的實(shí)現(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的實(shí)現(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頁(yè)面的console日志, inputSchema: { type: object, properties: { since: { type: number, description: 起始時(shí)間戳 }, level: { type: string, enum: [log, warn, error, info] }, keyword: { type: string }, limit: { type: number, default: 100 } } } }, { name: get_requests, description: 獲取H5頁(yè)面的網(wǎng)絡(luò)請(qǐng)求記錄, inputSchema: { type: object, properties: { since: { type: number }, urlKeyword: { type: string }, status: { type: number }, limit: { type: number, default: 50 } } } }, { name: clear_data, description: 清空所有日志和請(qǐng)求記錄, 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客戶端接入方式不同但核心都是配置一個(gè)MCP Server的啟動(dòng)命令。以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)鍵點(diǎn)是MCP Server通過stdio通信所以AI客戶端會(huì)以子進(jìn)程的方式啟動(dòng)你的Node.js腳本。這里有一個(gè)容易踩的坑stdio模式下不能用console.log輸出調(diào)試信息因?yàn)閟tdout被MCP協(xié)議占用了。調(diào)試信息必須用console.error輸出到stderr否則會(huì)干擾MCP協(xié)議通信導(dǎo)致AI客戶端解析失敗。4. 實(shí)戰(zhàn)驗(yàn)證用AI定位一個(gè)真實(shí)的H5白屏問題4.1 構(gòu)造一個(gè)典型的白屏場(chǎng)景為了驗(yàn)證整條鏈路我構(gòu)造了一個(gè)典型的H5白屏問題頁(yè)面加載時(shí)調(diào)用一個(gè)用戶信息接口接口返回的數(shù)據(jù)結(jié)構(gòu)跟前端預(yù)期不一致導(dǎo)致渲染時(shí)報(bào)錯(cuò)頁(yè)面白屏。問題代碼大概長(zhǎng)這樣async function initPage() { const res await fetch(/api/user/info); const data await res.json(); // 預(yù)期data.user.name但實(shí)際接口返回的是data.data.userName document.getElementById(username).textContent data.user.name; }這段代碼在data.user為undefined時(shí)會(huì)拋出TypeError導(dǎo)致后續(xù)渲染中斷頁(yè)面白屏。4.2 讓AI自己拉日志和請(qǐng)求頁(yè)面在手機(jī)上打開后vConsole面板會(huì)顯示報(bào)錯(cuò)同時(shí)數(shù)據(jù)通過WebSocket推到了MCP Server?,F(xiàn)在我在AI客戶端里輸入幫我看看最近這個(gè)H5頁(yè)面為什么白屏了先拉一下最近的錯(cuò)誤日志和網(wǎng)絡(luò)請(qǐng)求。AI會(huì)調(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會(huì)調(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。整個(gè)分析過程不需要我手動(dòng)復(fù)制任何日志。4.3 對(duì)比傳統(tǒng)流程的效率差異傳統(tǒng)流程下這個(gè)問題的排查步驟是在手機(jī)上打開頁(yè)面看到白屏打開vConsole切到Console面板看到報(bào)錯(cuò)截圖或復(fù)制報(bào)錯(cuò)信息切到Network面板找到接口請(qǐng)求查看響應(yīng)體復(fù)制響應(yīng)體打開AI對(duì)話窗口粘貼報(bào)錯(cuò)和響應(yīng)體描述問題AI分析后給出結(jié)論整個(gè)過程至少需要5-6次手動(dòng)操作耗時(shí)2-3分鐘。而通過MCP鏈路只需要對(duì)AI說一句話AI自己完成數(shù)據(jù)拉取和分析耗時(shí)10-20秒。更重要的是AI拿到的是完整數(shù)據(jù)不會(huì)因?yàn)槭謩?dòng)復(fù)制遺漏關(guān)鍵信息。4.4 幾個(gè)實(shí)測(cè)中發(fā)現(xiàn)的細(xì)節(jié)問題第一個(gè)問題日志順序錯(cuò)亂。WebSocket消息是異步到達(dá)的如果頁(yè)面瞬間產(chǎn)生大量日志服務(wù)端接收順序可能跟實(shí)際產(chǎn)生順序不一致。解決方案是在每條日志里帶上客戶端時(shí)間戳服務(wù)端按時(shí)間戳排序后再返回給AI。第二個(gè)問題循環(huán)日志導(dǎo)致數(shù)據(jù)爆炸。有些頁(yè)面會(huì)在定時(shí)器里不斷打日志幾秒鐘就能產(chǎn)生上千條。如果不加限制內(nèi)存和磁盤都會(huì)被撐爆。解決方案是在頁(yè)面端做采樣同樣的日志內(nèi)容在1秒內(nèi)只上報(bào)一次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; }第三個(gè)問題敏感信息泄露。請(qǐng)求體里可能包含密碼、token等敏感字段。如果這些數(shù)據(jù)被推送到服務(wù)端并持久化到磁盤存在安全風(fēng)險(xiǎn)。解決方案是在頁(yè)面端做脫敏處理對(duì)包含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 增加主動(dòng)執(zhí)行能力遠(yuǎn)程執(zhí)行JS基礎(chǔ)的查詢功能只能讓AI看但如果AI能做調(diào)試效率會(huì)更高。比如AI發(fā)現(xiàn)某個(gè)變量值不對(duì)可以直接在頁(yè)面里執(zhí)行一段JS來驗(yàn)證假設(shè)。實(shí)現(xiàn)方式是在MCP Server里增加一個(gè)eval_js工具通過WebSocket向頁(yè)面發(fā)送指令頁(yè)面執(zhí)行后把結(jié)果返回// MCP Server端 { name: eval_js, description: 在H5頁(yè)面中執(zhí)行JavaScript代碼并返回結(jié)果, inputSchema: { type: object, properties: { code: { type: string, description: 要執(zhí)行的JS代碼 } }, required: [code] } }頁(yè)面端收到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 })); } } };這個(gè)功能非常強(qiáng)大但也有風(fēng)險(xiǎn)。必須限制執(zhí)行權(quán)限只允許在開發(fā)環(huán)境使用生產(chǎn)環(huán)境要禁用??梢栽陧?yè)面端加一個(gè)開關(guān)只有URL參數(shù)里帶了debug1才啟用eval功能。5.2 日志與請(qǐng)求的關(guān)聯(lián)分析單獨(dú)看日志和單獨(dú)看請(qǐng)求有時(shí)候很難定位問題。比如一個(gè)接口報(bào)錯(cuò)但日志里沒有明顯異常。這時(shí)候需要把請(qǐng)求和它前后的日志關(guān)聯(lián)起來。實(shí)現(xiàn)思路是在頁(yè)面端記錄每條日志和請(qǐng)求的序列號(hào)服務(wù)端按序列號(hào)排序。查詢時(shí)如果AI指定了某個(gè)請(qǐng)求就返回該請(qǐng)求前后各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在分析問題時(shí)能看到完整的上下文而不是孤立的一條日志或一個(gè)請(qǐng)求。5.3 多頁(yè)面同時(shí)調(diào)試的支持實(shí)際項(xiàng)目中一個(gè)H5應(yīng)用可能有多個(gè)頁(yè)面或者同時(shí)打開多個(gè)WebView。如果所有頁(yè)面的數(shù)據(jù)都混在一起AI很難區(qū)分。解決方案是在WebSocket連接建立時(shí)客戶端發(fā)送一個(gè)頁(yè)面標(biāo)識(shí)const pageId ${location.pathname}_${Date.now()}; ws.onopen () { ws.send(JSON.stringify({ type: register, pageId, url: location.href })); };服務(wù)端按pageId分組存儲(chǔ)數(shù)據(jù)。MCP工具增加pageId參數(shù)AI可以指定查詢哪個(gè)頁(yè)面的數(shù)據(jù)。如果不指定就返回所有頁(yè)面的匯總但每條數(shù)據(jù)都帶上pageId標(biāo)識(shí)。5.4 與Playwright MCP的聯(lián)動(dòng)如果你同時(shí)在使用Playwright MCP做自動(dòng)化測(cè)試可以把兩者結(jié)合起來。Playwright負(fù)責(zé)操作頁(yè)面點(diǎn)擊、輸入、導(dǎo)航vConsole MCP負(fù)責(zé)收集頁(yè)面運(yùn)行時(shí)的日志和請(qǐng)求。AI可以在執(zhí)行完一個(gè)操作后自動(dòng)拉取該操作產(chǎn)生的日志和請(qǐng)求驗(yàn)證是否符合預(yù)期。這種聯(lián)動(dòng)方式特別適合做回歸測(cè)試AI自動(dòng)跑一遍核心流程然后檢查有沒有報(bào)錯(cuò)日志、有沒有失敗的請(qǐng)求。比人工寫斷言靈活得多因?yàn)锳I可以根據(jù)上下文判斷這個(gè)報(bào)錯(cuò)是否正常。6. 踩過的坑與穩(wěn)定性優(yōu)化6.1 WebSocket連接在移動(dòng)端的斷連問題移動(dòng)端瀏覽器在切后臺(tái)、鎖屏、網(wǎng)絡(luò)切換時(shí)WebSocket連接大概率會(huì)斷開。而且不同瀏覽器的行為不一致有些會(huì)立即觸發(fā)onclose有些會(huì)靜默斷開onclose延遲很久才觸發(fā)。解決方案是雙保險(xiǎn)客戶端心跳 服務(wù)端超時(shí)檢測(cè)??蛻舳嗣?0秒發(fā)ping服務(wù)端如果60秒沒收到任何消息就主動(dòng)關(guān)閉連接??蛻舳藱z測(cè)到連接關(guān)閉后用指數(shù)退避重連。還有一個(gè)細(xì)節(jié)頁(yè)面從后臺(tái)恢復(fù)時(shí)要立即檢查連接狀態(tài)??梢酝ㄟ^visibilitychange事件監(jiān)聽document.addEventListener(visibilitychange, () { if (!document.hidden ws.readyState ! WebSocket.OPEN) { reconnect(); } });6.2 大數(shù)據(jù)量下的性能問題當(dāng)頁(yè)面產(chǎn)生大量日志時(shí)WebSocket消息可能非常大。比如一個(gè)接口返回了1MB的JSON直接通過WebSocket發(fā)送會(huì)導(dǎo)致消息分片增加延遲。解決方案是在頁(yè)面端做壓縮和截?cái)?。?duì)于超過10KB的響應(yīng)體只發(fā)送前10KB并標(biāo)記truncated: true。如果AI需要完整數(shù)據(jù)可以通過另一個(gè)工具get_full_response按請(qǐng)求ID查詢服務(wù)端從磁盤讀取完整數(shù)據(jù)。另外日志上報(bào)要做批量處理。不要每產(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的啟動(dòng)與調(diào)試技巧MCP Server通過stdio通信調(diào)試起來不太直觀。我的做法是同時(shí)啟動(dòng)一個(gè)HTTP調(diào)試端口在開發(fā)階段可以通過瀏覽器或curl直接調(diào)用MCP工具驗(yàn)證邏輯是否正確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ù)是否正常上報(bào)。另一個(gè)坑是MCP Server的進(jìn)程生命周期。AI客戶端啟動(dòng)時(shí)會(huì)拉起MCP Server進(jìn)程客戶端關(guān)閉時(shí)會(huì)殺掉進(jìn)程。如果你的WebSocket服務(wù)也在同一個(gè)進(jìn)程里客戶端關(guān)閉后WebSocket服務(wù)也會(huì)停止頁(yè)面就斷連了。解決方案是把WebSocket服務(wù)和MCP Server拆成兩個(gè)獨(dú)立進(jìn)程MCP Server通過HTTP或Unix Socket向WebSocket服務(wù)查詢數(shù)據(jù)。6.4 安全邊界什么時(shí)候不該用這套方案這套方案的核心是把頁(yè)面運(yùn)行時(shí)數(shù)據(jù)暴露給本地服務(wù)。在開發(fā)環(huán)境沒問題但在生產(chǎn)環(huán)境絕對(duì)不能用。幾個(gè)必須遵守的原則生產(chǎn)環(huán)境構(gòu)建時(shí)通過環(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ī)連電腦確保在同一個(gè)可信局域網(wǎng)內(nèi)且調(diào)試完成后立即關(guān)閉服務(wù)敏感數(shù)據(jù)脫敏必須在頁(yè)面端完成不要依賴服務(wù)端處理我在實(shí)際項(xiàng)目中會(huì)把調(diào)試腳本的引入邏輯放在構(gòu)建工具的配置里通過process.env.NODE_ENV判斷生產(chǎn)構(gòu)建時(shí)直接不打包這個(gè)腳本。這樣即使有人手動(dòng)在URL里加參數(shù)也不會(huì)有任何調(diào)試代碼執(zhí)行。這套方案我用了大概三個(gè)月從最初的簡(jiǎn)單日志轉(zhuǎn)發(fā)到后來加上請(qǐng)求攔截、eval執(zhí)行、多頁(yè)面支持基本上覆蓋了H5調(diào)試的常見場(chǎng)景。最大的感受是AI輔助debug的前提是AI能拿到足夠的數(shù)據(jù)而MCP正好解決了數(shù)據(jù)通道的問題。vConsole負(fù)責(zé)采集WebSocket負(fù)責(zé)傳輸MCP負(fù)責(zé)暴露給AI三者各司其職組合起來就是一個(gè)完整的AI輔助調(diào)試閉環(huán)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
成人短视频在线观看| 五月丁香婷婷基地| 丁香五月久久| 九九精品丁香花| 丁香五月天激情综合| 五月色婷婷亚洲 | 五月色婷婷在线观看| 97人人干视频| 亚洲中文字幕在线观看| 日韩操人| 性一交一乱一交A片久久四色| 久久婷五月综合色| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 99精品视频免费观看| 大香蕉综合| 狠狠色丁香乆乆| 狠狠狠狠狠狠狠狠| 亚洲国产成人综合| 人妻AV在线观看| 亚洲综合婷婷五月| 深爱婷婷色| 99日精品视频| 久久婷狠狠色| 色色色色色色色色五月先| 热久久这里只有三级视频| 久久伊人大香蕉| 99精品久久久久| 天天狠狠色| www,五月天com| 艹天天射| 97极品在线| 五月综合激情久久| 婷婷丁香五月在线观看91| 777精品久无码人妻蜜桃| 久久综合影院| 色婷婷导航| 97色色视频| 久久免费婷婷视频| 99久在线精品99re8热| 五月五丁香婷婷| 五月丁色AV| 99九九热在线观看| 久久九九怡红院| 欧美婷婷日本| tingtingseav| 精品久久99码| 色综合99色| 五月丁香婷婷综合| 天天爽天天操| 色噜噜狠狠色综无码久久合欧美| 午夜少妇在线观看视频| 最新国产AV| 国产精品久久久久9999小说| 色综合播放| 色色三级视频| 强奸幻女毛片| 日韩啪啪视频| 日本五月婷婷久久久六月丁香| 九九碰九九爱97超碰| 九九热中文| 中文精品在| 粉嫩av懂色av蜜臀av熟妇| 亚州操操| 婷婷五月天影视| 色婷婷丁香五月天在线视频| 性生活久久人妻| 岛国在线观看91| 久草热8精品视频在线观看| 9久热| www.99视频| 99这里都是精品| 强壮的公次次弄得我高潮A片日本 | 91啪啪| 嫩草AV久久伊人妇女超级A| 午夜成人片400| 99国产精品久久久久久久久久久 | 久久ri精品| www.wuyuetian啪啪| 无码AV大香线蕉伊人| 国产高清视频91九九九久久久| 色五月婷婷丁香凹凸| 天天做天天要天天爽| 五月天激情中文字幕| 青草激情综合| 97人人射| 欧美色97| 九玖欧洲亚洲| 色综合激情| 中文字幕欧美日韩VA免费视频| 婷婷色五月大香蕉在线| 五月婷婷黄色| 丁香五月激情啪啪| 99国产精品久久久久久久久久久| 婷婷趴趴| 色五月丁香伊人| 久久婷婷亚洲| 亚洲视频综合网| 激情 婷婷| 久久这里这里有精品免费视频| 亚洲狠狠操| 五月婷婷六月色| 99热国产| 91大神操美女| 亚洲天天| 久久五月天影院| 99操中文视频| 色综合激情| 丁香六月在线| 五月丁香六月成人| 色婷婷亚洲综合av| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 天天色天天日| 日本婷婷色| 久久婷婷亚洲| 婷婷六月综合基地| 久久九九re热| 人妻久久久久久久久久| 农村熟妇高潮精品A片| 色五月中文字幕| 婷婷五月天成人动漫 | 欧美婷婷六月丁香综合色连续高潮抽搐| 国产精品A片| 99热精品在线| 婷婷精品在线| 色播综合| 色播五月丁香| 国产超碰在线| 五月丁香啪啪网| 99热精品中文字幕| 国产黄色av| 情涩婷婷五月天| 99视频35精品视频在线观看| 五月停停999| 色噜噜婷婷| 一点色成人网| 天天舔天天插天天干| 99热18| 婷婷精品性性性性性性性| 99亚洲精品| 婷婷九九| www.99在线| 久久刺激网| 久久精品性爱| 婷婷九月亚洲| 日日色综合| 热99精品视频五月| 五月丁香亭亭| 日日射天天射| 另类亚洲电影| 午夜九九九九九九九九九九九九九| 国产欧美大香蕉一区| 丁香花五月天| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 99视频在线观看地址| 麻豆科斗777| 五月丁香| 99在线视频精品| 九九色色| 欧美爆乳一区二区三区| 五月婷婷综合影院| 日本久久精品| 综合狠狠五月婷婷| 色色综合热| 亚洲激情婷婷| 97综合在线| 91欧美| 五月丁香六月婷婷综合在线| 丁香婷婷六月天| 欧美成人精品三区综合A片| 欧美狠狠草| 久久五月视频| 五月婷婷开心丁香| 日本啪啪网| 丁香五月天激情| 色综天天综合| 久久久亚洲成人无码A片| 五月激情网综合| 天天肏天天肏| 五月婷婷基地| 欧美色九| 亚洲 五月 婷婷 成人| 六月婷婷天堂| 五月综合无码| 九九热国产| 99在线视频女女视频| 婷婷人人操| 久9热| 国产性爱在线| 亚洲精品亚洲人成人网| 一区二区三区四区无码| 激情床戏| 天堂网操| 五月综合激情网| 天天操夜夜橾| www.狠狠狠.com| 一级黄色片看看| 最新va在线播放| 五月丁香婷婷基地| 色五月婷婷五月| 色狠狠五月天| 日韩视频女神99| 久久免片| 丁香五月天电影| 精品视频这里只有精品| 伊人婷婷91| 婷婷丁香熟妇综合网| 婷婷丁香激情综合色情| 五月丁香六月激情综合啪啪| 大香蕉婷婷丁香天堂AV| 久久亭亭电影| 国产99久久久国产精品免费看| 少妇搡BBBB搡BBB搡毛茸茸 | 久久九九大香蕉电院| 成人婷婷| 久大香蕉| 女人天堂久久| 31色区视频免费看| 欧美性猛交99久久久久99按摩| 干一干xxxx| 99只有这里是精品| 777丁香六月青青草婷婷综合久月| 99超碰在线免费| 99精品国产在热久久| 99视频精品在线| 婷婷在线操| 五月天婷婷网站888| 67194线路二在线观看| 99精品久久| www色综合亚洲92| 99热在线观看| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | www九九免费视频| 日本99视频| 久久九九国产精品怡红院| 精品人妻久久久久久久| 天天干天天操天天干天天操天天干天天操 | www.99免费视频| 国产成人综合亚洲| 91se精品国产| 99干免费视频| 五月丁香色停停啪啪啪| 日韩青青| 男人的天堂在线婷婷| 99精品偷自拍| 淫五月停停| 久久精彩视频| 99热久久这里只有精品| 欧美A级成人婬片免费看理论| 亚洲va成人va成人va在线观看| 人妻久久婷婷| 亚洲色99| 欧美成人猛片AAAAAAA| 亚洲人妻av伦理| 六月丁香激情网| 成人片在线播放| 婷婷五月天福利| 色丁香五月| 综合一本道| jiuse91在线| 成人精品网站在线观看| 婷婷丁香社区| 色婷婷久久| 婷婷综合在线| www.五月婷婷久久.com| 能直接看的AV网站| 久碰婷婷视频| 五月激情天| 久久激情视频| 99惹 精品在线| 色婷婷丁香女女| 嫩草AV久久伊人妇女超级A| 曰韩少妇内射免费播放| 热99.com婷婷| 99er这里只有精品| 99精品久久久久久久婷婷久久 | 久久国产高潮白浆免费观看99| 另类婷婷五月天啪帕帕| 久久99精品久久久久久噜噜| 婷婷五月在线综合| 色五月综合网| 成人av免费观看| 色激情五月天| 亚洲AV无码成人电影| 啪啪东京热| 久9热视频在线观看| 操一区| 五月丁香婷婷综合在线| 79色色色色| www.99热在线| 五月色丁香激情| 婷婷五月无码| 99碰碰| 91人人爱| 婷婷色五月婷婷姐妹| 狠狠操天天操综合| 97性视频| 婷婷热色| 激情影院内射| 久久99综合网| 日本WwW色偷偷丁香花久久久京东热| 嫩草哈哈操| 六月婷久久| 99热香港| aa久久| 中文字幕在线免费看线人| 91av视频在线观看最新网址| 色综合色欲综合天天免费 | 伦乱天堂| 五月激情久久| 中文字幕网伦射乱中文| 色婷婷丁香综合中文字幕| 天天在线天天综合网色| 九九综合九九| 91欧美日韩| 色婷婷狠狠| 99无吗| 亚洲无码99| 丁香六月欧美| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 婷婷丁香77777| 五月亭亭六月天| 久久丁香五月天| 久久五月天激情婷婷| 丁香婷婷久久 | 五月天激情综合网| 亚洲色色色色| 精品夜夜澡人妻无码AV| AV堂狠狠干| 婷婷狠狠色| 亚洲妇女熟BBW| 久久伦乱| 激情亚洲婷婷| 97碰碰在线观看视频| 亚洲无码成人性爰网| www,色婷婷| 玖玖@三月天天丁香婷婷| 思思热天天看| 91精品久久久久久综合五月天| 99久高清视频| 五月婷婷综合在线视频小说| 丁香五月婷婷老师网站| 久久久人妻门| 91婷婷丁香五月亚洲| 丁香五月六月久久综合 | 五月丁香久久| 2013AV天堂| 色五月成人在线| 亚洲乱码日产精品BD在线观看| 99色色| 激情六月天婷婷| 五月婷A V在线| 人人草成人视频| 亚洲国产成人在线| 色五月婷婷av| 成人看片网站| 伊人丁香婷婷东京| 九九色中文| 天天日日爽| AV色色天堂中文| 激情婷婷狠狠干| 99热在线观看| 五月天成人在线| 欧美大片| 五月婷婷开心综合| 九九热婷婷| 丁香六月婷婷综合缴| 久久久噜噜噜操操操| 97色色色视频| 4399在线观看免费毛片| 九九黄色网| 婷婷丁香久久| 夫妇交换刺激做爰| 精品久久66| 岛国午夜视频| 五月丁香大香蕉| 精品久久婷婷五月天| 五月婷久久| 国产成人VA| 亚洲春色奇米影视| 五月天另类视频| 伊人五月天97| 深爱五月天| WWW五月天| 亚洲日比视频| 丁香五月婷婷亚洲综合精品| 全网最新网黄大秀直播高清,主播国产录屏在线 | 色五月丁香总合网| 久久五月激情综合| 99福利视频| 婷婷丁香五月天综合在线日韩| 五月天艹天天| 婷婷九月综合| 婷婷五月色丁香在线看| 熟女人妻视频| 色婷婷免费视频| 婷婷色在线| 亚洲色五月天在线| 久久久久久久久久久97| 人妻体体内射精一区二区| 丁香五月激情视频在线| 91人人澡人人爽人人看| 青草青草视频2免费观看| 夜夜爽天操| 天天综合网~91综合网| 狠狠精品干练久久久无码中文字幕 | 日本99视频| 丁香五月老师| 9久国产精品| 亚洲蜜桃精久久久久久久久久久久| 五月天精品综合| 亚洲六月婷婷| 在线免费观看激情视频| 丁香五月社区| 亚洲啪啪网| 婷婷一本和五月丁香| 一区三区视频有限公司| 国产3p露脸普通话对白| 亚洲午夜av| 五月香六月婷| 激情综合网五月天天| 丁香婷婷久久综合在线| 天天天天操| 色婷婷五月天偷拍| 婷婷五月天激情视频| 天天日夜夜欢| 免费成人中文字幕| 九色综合网| www99热| 九九热这里只有精品6| 人妻系列久久久久久久久久久| 丁香六月婷婷色播| 1769在线观看欧美国产| 久爱综合| 久久婷婷六月综合| 99久久综合| 五月色俺婷婷| 5月婷婷激情6月| 99精品热视频| 五月狠狠| 亚洲国产黄色电影| 五月天婷婷狂暴白浆| 思思热视频在线观看| 思思热在线播放| 丁香婷婷射| 大香网伊人久久综合| 丁香花五月天婷婷成人社区| 色婷亚洲| 婷婷丁香综合| 天天久久综合| 五月丁香六月欧美综合| 丁香五月AV在线| 日本九九视频| 色综合香蕉视频| 色婷婷精| 丁香九月色| 中文字幕乱码亚洲精品一区| 久久免费精彩视频| 中文字幕乱码亚洲精品一区| 丁香六月婷| 色五月婷婷av| 九九99在线免费在线观看视频| 激情www| 五月丁香无码| 婷婷五月天激情网站| 色五月婷婷开心| 五月婷伊人| 精品视频这里只有精品| www.狠狠狠.com| 色六月天天激情综合网| 婷五月天天| 天天爽在线视频| 久久资源网五月婷| 97人人操人人爽| 庭庭久久内射| 大香蕉婷婷| 中文无码婷婷| 激情色中文| 五月色婷婷在线观看| 婷婷丁香五月天婷婷| 婷婷五月亚洲综合| 这里只有在线精品| 思思久热6| 欧美久久婷婷| 久久99大全| 久婷婷婷| 97啪啪| 亚洲婷婷基地| 色婷婷影视| JAPANRCEP老熟妇乱子伦视频 | 欧洲电影在线观看免费版英语版| 蜜桃婷婷丁香综合久久开心亚洲| 97色精品视频| 欧美色99| 亚洲性爱干干| 激情开心五月天婷婷基地丁香社区| 丁香六月无码| 婷婷久久99| 色五月婷婷网| av在线免费播放观看| 亚洲一级AV在线免费播放| 国产免费av在线| 五月久熟女| 亚州精品色情在线观看| 久色资源网| 色综合五月天| 在线理论片| av首页在线| 久久丝袜婷婷| 国产视频久色| WWW,五月| 亚洲午夜成人av电影网| 久久9热| Av性爱网站| 五月丁香色婷| 激情综合网址| 丁香五月色情av| 五月 成人 婷婷| 再次出发二| 色五月播五月| 亚洲精品一区中文字幕乱码| 日本情色一区二区| 99色热视频| 这里只有精品视频在线看| 五月婷婷综合在线| 日本人妻伦在线中文字幕| 天综合日日夜综合7799| 久久久久亚洲A∨成人乱码电影| 天天插天天| AV操逼网| 色五月色情| 综合久久婷婷五月丁香| 日韩久热| a毛片二逼wwwwwwwwww| 午夜婷婷| 日韩啪| 五月天丁香婷婷视频网址| 久久精品99久久| 99热精品9| 亚洲操操| 97在线/亚洲| 五月丁香婷爱在线| 亚洲精品国产熟女久久久| 婷婷久久影院| 2025色婷婷| 亚洲激情久久| 人人操97| 久久婷婷久久| 97碰人人操| 天天日天天做天天操| 久久婷婷色| www.日韩国产| 丁香五月天激情视频| 欧美成人一区二区三区在线视频| 91日综合欧美| 啪啪小说五月天| 欧美人与性动交CCOO| 六月99天天婷婷激情综合| 久热这里只有精品99re| 碰超亚洲| 丁香5月婷婷| 69精品人人人人| 国产欧美日韩性爱| 日韩999| 色呦呦美女| 天天日综合| 丁香五月天影院| 丁香婷婷伊人| 六月婷婷综合网2| 五月婷免费视频久久久| 禁欲电影完整版在线播放| 91精品久久久久久| 99热欧美| 五月天色狠狠| 激情六月婷婷| 成人av免费观看| 狠狠爱综合网| 久久这里都是精品免费| EEUSS鲁片一区二区三区| 婷婷综合在线视频| 五月花婷婷| 老师高潮流白浆喷水的A片| 丁香五月激情综合网激情五月| 婷婷成人视频| 狠狠五月丁香色婷| 国产操B| 99久久综合精品五月天| 色婷婷啪啪综合网| 女人天堂AV| 五月丁香激情综合六月涩涩爱| 99riAv1国产在线观看| 偷拍91九色| 超碰操网| 激情五月婷婷综合网| 婷婷不干网| 热99精品视频| 国产免费一区二区三区三州老师F1F1.CC | 欧美久久九九| 婷婷五月天天爽| 国产激情视频在线观看| 精品一二三区久久AAA片| 国产va在线视频| 任我肏视频精品| 色5月丁香婷婷| 一起草Av| 91丁香色| 婷婷五月综合体验看| 夜夜 操无码| 情欲禁地| 色99视频| 97亚洲色 torrent magnet| 国产毛片操B| 丁香六月激情| 丁香五月天婷婷久久综合| 91丨九色丨首页| 日日干日日| 思思久久网| 五月婷三级片| 久草A片| 国产肥白大熟妇BBBB视频| 亚洲激情网站| 久久9精品| 丁香88AV五月婷婷| 综合色五月天| α久久| 美女激情综合| 久久婷婷五月综合色区| 亭亭五月色男人| 五月丁香婷婷激情澎湃四射| 日韩久久视频| 97干在线看| 五月花婷婷| 亚洲综合激情五月久久| 三级成人网站| 无码人妻激情| 婷婷五月综合中文字幕| 激情五月天网站| www.五月天婷婷| 99热在线中文字幕| 久操人妻| 亚洲九九婷婷| 久9精品视频在线| 五月大香蕉| 五月丁香黄色视频| 日日射天天射| 色婷婷XXXXX| 婷婷色五月激情强奸四射| 国产真实乱了老女人视频 | 91久久久久久久久18| www.99热这里精品| 婷婷五月天熟妇| 亚洲午夜AV| 日韩大片艹艹| 超91在线视频| 久久R激情| 婷婷亚洲综合| 99热这里全是精品| 狼人婷婷久久| 婷婷久久精品| 久久偷拍综合五月天| 久热这里精品免费| 丁香五月瑟瑟| 日韩好吊操| 91玖玖| 99资源在线视频| 丁香五月天社区婷婷| 九九婷婷激情综合网| 丁香五月天激情综合| 久久婷网| 色婷操逼| 九月丁香婷婷综合| 久热91精品| 九九狠狠干| 99啪视频在线观看| 婷婷五月天毛片| 久久久9久| 91干婷婷| 五月婷婷色白丝| 婷婷综合国产| 婷婷丁香五月天色色| 色婷婷影视99| 久久区区一二三av| 激情五月天综合网| 91色涩| 97碰久久| 色五月激情问网站| 色五月婷婷在线视频| 日韩AAA| 五月婷婷精品视频| 久久婷婷五月天激情唯美| 狠狠狠夜夜夜| 国产色色视频| 丁香五月色情| 激情小说五月天| 最近免费中文字幕大全高清大全1| 校花娇喘呻吟校长陈若雪视频| 日日躁夜夜躁狠狠久久AV| 亚洲六月综合激情久久下卡| 色色色丁香| 影音先锋91男人资源在线播放| 亚洲av无码精品色午夜| 色五月婷婷操逼| 六月丁香av| 五月婷婷深深爱爱| 思思热再线视频| 色色色com| 六月撸婷婷| 深爱五月激情五月| 182tv992tv人之初午夜免费观看| 五月天婷婷色色首页| 欧美视频五区| 精品无码色| 色色欧美色色| 色色色色色色色色综合网| 久久久久久人妻| 婷婷黄色网| 五月婷婷|欧美| 免费国产VA国产免费| 色婷亚洲| 99无码视频| 丁香五月瑟瑟| 色五月激情综合网| 激情五月,深深爱五月| 九九热中文| yazhou seshipin| 日日.c| 另类天堂| 中文字幕黄色片| 97操| 热的国产,热的综合,热的有码| 色XX综合网| 大香蕉伊人久久| 婷婷五月花| 老师把我爽高潮了免费A片| www.久久久久| 色亚洲激情| 五月丁香成人网| 日本色色影院| 青草视频在线蜜臀| 九热精品| 夜色.cnm| 91日本在线观看| 人人摸人人干人人做| 开心婷婷五月| 亚洲av无码精品色午夜| 丁香五月狠狠综合欧美| 狠狠狠狠狠狠狠狠| av一区免费看| 婷婷五月丁香五月天| 大香蕉婷婷色| 激情五月天99色| 亚洲综合视频一下| AV人人操| 激情丁香六月| 99热这里只有精品3| 中国女人内射6XXXXX| 欧美三级欧美一级| 色婷婷丁香五月| 伊人99久久| 天天爱天天日| 久久伊人五月天| 涩涩婷婷五月| 自拍盗摄 另类| 亚洲国产精品二二三三区| 超碰超碰在线| 五月婷婷六月天| 2021日韩无码| 操操操Av| 五月天激情日色在线| 午夜电影网VA内射| 狠狠精品干练久久久无码中文字幕| 96精品国产综合久久久久久| 俺去啦综合网| 激情综合网激情五月婷婷| 亚洲综合丁香五月| 伊人五月天| 亚洲午夜精品久久久久久人妖| 色五月偷偷| 成人人操| 欧美大香蕉视频| 男人視頻站| 五月天激情网图片| 色婷婷AⅤ| 欧美激情VA永久在线播放| 色九九九综合| 激情五月天色婷婷| 日笨久久网| 丁香六月av| 成人丁香| 久久久久99精品成人网站| 日本色色网站| 欧美天堂久久| 国产激情综合五月久久| 欧美激情综合| 综合久| 婷婷成人五月天一区| 色婷婷小说| 久久这里只有欧美| 日韩有码一区| 最新av在线观看| 91一起操| www色色色com| 婷婷色播色五月五色五月天色妇| 色色色综合色| 亚洲性图一区二区| 日韩三级视频一区二区| 久久9热| 超碰在线人人| 无码激情AAAAA片-区区| www激情网| www久久久久| 97视频91| 久久精品国产色| 久久久精品婷婷五月天| 五月天色不卡| 六月婷婷网| 亚洲精品V天堂中文字幕| 色五月婷婷五月天激情综合| 五月丁香婷婷激情影院欧美| 激情五月天在线视频| 日本美女天天日天天爽| 日本三级第一页| 玖玖综合色| 亚洲 激情 中文| 激情宗合 激情宗合| 久久婷婷五月天懂色| 色五月婷婷开心| 超级碰人人操人人干| 91久久久久久久久18| 777久久综合视频| 在线色婷婷| 五月激情六月综合| 五月丁香亚洲综合网| 97色色婷婷五月天| 日日夜夜狠狠| 播播网色播播| 日韩三级片一区二区| 日噜噜色| 狠狠做婷婷| 五月天婷婷在线AN| 97干在线视频| 色爱综合五月| 一级性爱视频| www色综合| 丁香六月AV| 黄页免费一级视频懂色| 国产熟妇的荡欲午夜视频| 天天噜噜| 99热精品9| 超碰啪啪网| 国产婷婷色综合AV蜜臀AV| 99爱在线视频| 影音先锋 91工厂| 色婷六月| 97久久视频| www激情| 综合五月亭亭9| 九月丁香婷婷| www.色色色com| 激情五月婷婷| 五月天激情久久| 欧美综合激情五月天| www,五月天com| 久久码久久无清| 久久国产一区二区三区| www九九| 亚洲天天| 丁香六月 人妻| 99操中文视频| 九九九干精品| 久久xx| 国产激情久久久| 人妻啪啪啪| 99视频精品全部免费观看| 综合网啪啪| 国产精品 的国产| 九久久九精品视频| 婷婷五月天影院| 97干在线视频| 欧美日韩91| 久久人人看| 激情五月天色播| 色播五月丁香| 婷婷五月激情欧美大胆视频| 中文字幕成人| 97人人操人人爽| 玖玖婷婷五月| 五月丁香五月婷婷| 九九视频在线| 六月丁香五月天| rr天天操| 成人精品亚洲性爱| 激情五月丁香婷婷| 国产激情婷婷| 伊人婷婷五月天| 色色网站免费| 五月丁查人人| 九九久久这里只有精品XB| xxxx五月| 玖玖精品资源| 99久久66| 就要去操亚洲成人精品五月天丁香婷婷| www.91九色| 色婷婷五月综合在线| 99内射视频| 怡红院91a√| 亚洲av无码精品色午夜| 开心五月综合激情网| 五月婷婷丁香大陆免费| 超碰免费人人| 蜜臀丁香黄色婷婷五月天| 五月天婷婷日日爱| 99热久只有| 国产日日操夜夜操的肉棒视频| 能看的AV网站| 九九在线这里只有精品视频 | 91超碰在线播放| 丁香无月在线观看| 婷婷五月丁香五月丁香| 丁香婷婷久久老熟女综合网| 五月天婷婷成人资源站| 五月色丁香视频精品| 久久人妻伦理| 午夜丁香六月婷| 久8色色| 丁香五月激情视频在线| 日本色色视频| 天天噜| 久久色情| 国产精品扒开腿做爽爽爽A片唱戏| 色吧婷婷五月亚洲| 国产精品涩涩涩视频网站| 在线观看视频1区| 人妻av在线| 久久久久视剧HD| 婷婷久久免费| 99精品视频免费在线播放| 99精品爱| 深爱五月天| 疯狂做受XXXX高潮A片| 碰超亚洲| 久久最新色| 欧美激情五月天婷婷| 激情婷婷丁香五月| 美国色五月天婷婷资源站| 成人av免费观看| 久久精品99国产精品日本| 五月丁香六月在线| 九九热最新| 久久免费精彩视频| 在线综合啪| 久99视频在线观看| 色亚洲婷婷| 丁香五月婷婷AV在线| 天天操天天操天天操天天操天天操| 潘金莲AAAAAAAAAA| 色狠狠色综合久久久绯色AⅤ影视 大香蕉五月天婷婷丁香91 | 久久AAAA片一区二区| 久久只有18视频| 激情五月天色网站| 国产伦亲子伦亲子视频观看| 婷婷涩涩五月天| 五月色婷婷综合丁香精品无遮挡| 亚洲日日日| 久久精品99国产精品日本| www:99热视频| 五月丁香六月激情网| 蜜桃人妻无码AV天堂三区| 97精品人人A片免费看| 五月丁香综合影院| 狠狠色情婷婷| 激情综合五月天| 熟妇高潮一区av| 九九热视频首页/这里只有精品| 婷婷五月激情五月激情| 五月婷婷激情网| www.com色播五月天| 天天干肏夜夜| 九九 激情 网| 久久激情四射| 色黑鬼导航| 丁香 久久| 欧美A A A A A| 激情婷婷五月天网址| 九热视频在线精品15| 国产精品 的国产| 99自拍视频在线| 欧美成人va| 色www99| 亭亭丁香久久五月| 色色色综合色| 婷婷五月天久| 亚洲五月婷天天操| 欧美激情综合| 日本wwww在线| 婷婷六月天精品| 丁香五月天啪啪| 91九色在线视频| 色婷婷在线视频| 伊人狼人干| 五月丁香六月婷婷中合网| 久热伊人| 日本WWW九九九| 五月婷婷 六月丁香| 五月丁香| 婷婷五月69| 亚洲午夜AV| 啊v视频在线观看| 国产激情在线| 色综合九九色综合88| 五月婷婷六月丁香在线| 久热视频97AV在线观看| 丁香伊人综合| 亚洲精品又粗又大又爽A片| 性天堂久久| 色欲五月婷婷| www.99.色| 五月天玖玖狠狠色色| 亚洲精品V天堂中文字幕| 精品一二三区视频立| 丁香五月天堂| 丁香婷婷偷拍| 91人人爱| 综合九九| 久草婷婷视频| 人妻视频在线| 五月婷在线影院| 激情综合网五月丁香| 99综合自拍| 色色色色五月| 99色在线观看免费| 亚洲精品又粗又大又爽A片| av中文在线| www.夜夜| 五月天精品综合在线| 97一区二区| 丁香婷婷六月男男| 99re在线视频| 91狠狠色丁香婷婷综合久久精品| 大香蕉五月婷婷| 99久久9| 能看的AV网站| 日韩aⅴ视频| 婷婷五月综合网| 操操碰| 欧美情色电影一区二区| 五月婷婷久| 日本欧特黄色刺激一区影视久精品无码| 色热久| 色五月天天在线观看资源站| 三人荫蒂添的好舒服A片| 日日操人人操| WWW.久久久久久久| 伊人五月天在线| 狠狠色狠狠色综合日日91 | 黄色三级日本| 婷婷五月花| 99热6这里只有精品| www、丁香五月天| 男妓跪趴把舌头伸进我的嘴巴| 99热这里只有精品50| 伊人五月天久久| 婷婷久久网| 99.色| www,超碰| 国产精品18久久久| www.yw色| 亚洲 精品 综合 精品| 国产性爱色| 综合色五月| 日韩人妻操逼视频| 色情五月丁香| 五月Huangsewang| 超碰在线免费9| 99热国产国产| 亚洲婷婷久久综合| 看片视频在线免费日产在线看| 五月婷六月丁香| 婷婷丁香在线| 老司机视频lsj爱就色| 婷婷五月激情丁香| 婷婷五月天成人网站| caop在线视频| 在线91日韩| 99操| 丁香五月天电影| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 丁香五月婷婷婷桃花影院| 啪啪91| 人人摸人人| 天干干夜夜操| 在线观看亚洲视频影院| 亚洲综合激| 97色色色| 日韩三级高清无码| AVDV久久| 丁香花五月天激情| 秋霞三及片| 丁香六月婷婷综合麻豆| www.99在线| 成人一区在线观看| 婷婷狠狠综合网入口| 激情五月婷婷五月丁香五月开心五月| 日本精品99网站| 日韩国产在线免费观看| aV直接看| 在线色色| 99精品网| 丁香婷婷五月| 五月之婷婷| 色综合xx| 伊人大香五月天| 久久之人妻| 99资源在线视频| 婷婷五月中文字幕| 蒲京久久无码视频| 欧美激情性做爰免费视频| 五月天综合| 99在线观看视频| 色婷婷婷婷| 欧美英丁香开心快乐六月天网| www.sd-xiangsu.cpm| 国产精品黑丝| 人人摸人人操人人爱| 五月丁香六月婷婷欧美综合| 色色色色色综合| 另类 在线| 夜夜操夜夜操| 99九九视频| 狠狠撸激情综合丁香五月天俺来啦| www。88热在线视频免费观看| 丁香五月天导航| 久久在这里99| 黄网在线免费观看| 久久久A级视频| 另类图片五月天激情| 欧美97超碰| 清纯唯美 激情四射| 五月丁香婷婷欧美色图视频五月丁香777电影 | 色噜久| 色综合久网| 狠狠狠狠青草| 婷婷激情综合色五月久久91| 色综合久久无码| www.九九婷婷| 五月丁香趴趴| AV动漫不卡无码免费| 91互操| 4399人妻无码久久久| 色婷婷天堂| 色婷婷丁香五月天| 亚洲激情网站无码| 情婷婷五月天在线| 思思久热6| 桃色五月天| 午夜爱爱网站| 五月激情婷婷在线| 久久久com| 99热这里有精品| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 五月天开心网| 五月丁香亭亭操逼| 超碰99热| 国产成人AV| 婷婷不卡基地| 国产97色在线 | 日韩| 一级无码作爱片| 91avse| 五月丁香六月婷婷亚洲激情综合| 天天射天天射一道本日本社区| 日本婷婷色日| 九月婷婷综合| 九九热视频在线观看| 激情操逼婷婷| 色婷婷色综合激情91| 亚洲成人网在线观看| 天天狠天天狠| 夜夜综合色| 亚洲网站999| 久99热| 婷婷五月天99综合网站| 亚洲成Av人片乱码色第1集| 97资源欧美日韩大香蕉超碰一区| 日本久久综合| 成人久久天天x资源站| 六月激情婷婷| 色婷婷六月| 五月丁香六月激情| 五月丁香六月激情网站| 欧美啪啪五月天| 色播五月婷婷综合| 九月色婷婷综合| 亚洲色热| 色五月激情五月| 1024国产在线| 嫩草视频。| 玖玖婷婷视频| 五月天激情综合网站| 天天搞天天色综合| 可以看的av网站| 色婷婷啪啪| 99国产小视频2013| 丁香五月婷婷六月| av九九| 九九超碰人人| 五月婷婷xxx| 亚洲五月情| 久久只有18视频| 日本在线观看91| 久操b网| 这里只有精品无码| 天天揷综合网| 中文久久婷婷| 成人午夜天| 九九伊人网| 思思热在线视频精品| 精品无码久久久久久久久| 久久狠婷婷| 99这里只有精品在线观看| 色啪影院| 91热手机在线| 激情五月天之六月婷婷| 亚洲激情综| 大香蕉在线观看9| 天天操天天日天天爽| 丁香六月婷婷综合在线| www五月| 香蕉久久国产AV一区二区| 丁香五月婷婷婷婷欧美综合| 亚洲激情免费视频| 五月婷婷激情综合| 操日视频| 亚洲性色XXXXX| 狠狠干夜夜干| 中文字幕精品在线观看| 五月天成人小说| 婷婷五月丁香色色| 成人色站,在线视频,看片-SS1AV| 婷婷丁香五另类网站| 怡春院久操| 五月丁香五月综合欧美| 日本色色影片| 丁香婷婷人妻综合网| 婷婷五月天影院| 色色激情网| 日日杆天天| 91精品国产综合久久蜜芽解析速度| 内射激情在线| 国产3p露脸普通话对白| 五月婷婷在线短视频| 久久久精品色| αV电影| 激情五月天电影| 亚洲一二三网| 九热视频这里只有精品| 精品成人无码A片观看香草视频| 噜噜色五月| 丁香五月婷婷激情网| 国产精品视频免费看| 日韩人妻无码精品| 日本在线播放97| 26uuu亚洲精品国产| 婷婷操无码| 亚洲色色香蕉| 婷婷久久爱| 这里只有精品视频免费在线观看| 综合激情四射一theav|