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

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看不見(jiàn)你的H5日志做過(guò)H5開(kāi)發(fā)的人都有一個(gè)共同的痛頁(yè)面在手機(jī)上跑日志在手機(jī)里而你坐在電腦前。Chrome DevTools 的遠(yuǎn)程調(diào)試雖然能用但限制極多——需要USB連接、需要開(kāi)啟開(kāi)發(fā)者模式、部分瀏覽器內(nèi)核根本不支持、iOS上的Safari Inspector還經(jīng)常斷連。更別提那些嵌在App WebView里的頁(yè)面你連入口都找不到。傳統(tǒng)的做法是在頁(yè)面里手動(dòng)掛一個(gè)vConsole然后在手機(jī)屏幕上戳來(lái)戳去。這個(gè)方案本身沒(méi)問(wèn)題vConsole確實(shí)是移動(dòng)端調(diào)試的利器它能在頁(yè)面上生成一個(gè)懸浮面板展示console日志、網(wǎng)絡(luò)請(qǐng)求、DOM結(jié)構(gòu)、Storage等信息。但問(wèn)題在于這些信息只有人眼能看到AI看不到?,F(xiàn)在大家都在用AI輔助debug你把代碼貼給AIAI幫你分析問(wèn)題。但AI能拿到的只有你手動(dòng)復(fù)制粘貼的那幾行日志上下文嚴(yán)重缺失。你告訴AI接口報(bào)錯(cuò)了AI問(wèn)你報(bào)什么錯(cuò)你再去vConsole里翻翻到了再貼過(guò)去。這個(gè)來(lái)回過(guò)程極其低效而且經(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裝了一雙手。通過(guò)MCPAI不再只能被動(dòng)地接收你粘貼的文本而是可以主動(dòng)去調(diào)用工具、獲取數(shù)據(jù)、執(zhí)行操作。把vConsole和MCP結(jié)合起來(lái)就意味著AI可以直接讀取H5頁(yè)面上的日志和網(wǎng)絡(luò)請(qǐng)求不需要你手動(dòng)搬運(yùn)。這篇文章要講的就是怎么把這兩件事串起來(lái)。核心思路是在H5頁(yè)面里集成vConsole通過(guò)WebSocket把vConsole捕獲的日志和請(qǐng)求數(shù)據(jù)實(shí)時(shí)推送到一個(gè)本地服務(wù)再把這個(gè)服務(wù)封裝成MCP Server讓AI通過(guò)MCP協(xié)議直接查詢。整條鏈路打通之后你只需要對(duì)AI說(shuō)幫我看看剛才那個(gè)頁(yè)面為什么白屏AI就能自己去拉日志、分析請(qǐng)求、定位問(wèn)題。適合閱讀這篇文章的人有H5開(kāi)發(fā)經(jīng)驗(yàn)的前端工程師、正在探索AI輔助開(kāi)發(fā)流程的技術(shù)人、對(duì)MCP協(xié)議感興趣但還沒(méi)找到落地場(chǎng)景的開(kāi)發(fā)者。不需要你精通WebSocket或MCP協(xié)議細(xì)節(jié)我會(huì)把每一步的原理和操作都講清楚。2. 拆解這條鏈路vConsole、WebSocket與MCP各自扮演什么角色2.1 vConsole的能力邊界與數(shù)據(jù)出口vConsole是騰訊開(kāi)源的一個(gè)輕量級(jí)移動(dòng)端調(diào)試面板壓縮后只有幾十KB對(duì)頁(yè)面性能影響極小。它的核心能力包括Console面板捕獲所有console.log/warn/error/info輸出包括對(duì)象展開(kāi)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)。你可以通過(guò)vConsole.VConsolePlugin自定義插件也可以直接hook它的內(nèi)部方法來(lái)獲取數(shù)據(jù)。但更優(yōu)雅的方式是利用vConsole的vConsole.core對(duì)象它暴露了一些內(nèi)部API。不過(guò)直接hook vConsole內(nèi)部API有個(gè)問(wèn)題版本升級(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)推送指令比如開(kāi)始錄制、清空日志客戶端可以實(shí)時(shí)上報(bào)數(shù)據(jù)。WebSocket的心跳機(jī)制也是必須考慮的。移動(dòng)端網(wǎng)絡(luò)環(huán)境復(fù)雜連接可能因?yàn)榍泻笈_(tái)、網(wǎng)絡(luò)切換等原因斷開(kāi)。標(biāo)準(zhǔn)做法是客戶端每隔30秒發(fā)送一個(gè)ping幀服務(wù)端回復(fù)pong幀。如果連續(xù)3次沒(méi)有收到pong就認(rèn)為連接斷開(kāi)觸發(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í)別過(guò)濾 }, keyword: { type: string, description: 關(guān)鍵詞搜索 } } } }AI通過(guò)MCP協(xié)議調(diào)用這個(gè)工具時(shí)會(huì)傳入?yún)?shù)MCP Server執(zhí)行查詢并返回結(jié)果。整個(gè)過(guò)程對(duì)AI來(lái)說(shuō)是透明的它只需要知道我有一個(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é)連接地址不能硬編碼。開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境的服務(wù)器地址不同而且同一頁(yè)面可能在多個(gè)環(huán)境下運(yùn)行。解決方案是通過(guò)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ī)訪問(wèn)頁(yè)面時(shí)只需要在URL后面加上?debug_host192.168.1.100:8765就能把數(shù)據(jù)推到你的開(kāi)發(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消息可能超過(guò)服務(wù)端的接收限制。一般截取前10000個(gè)字符就夠了足夠AI分析問(wèn)題。對(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通過(guò)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白屏問(wèn)題4.1 構(gòu)造一個(gè)典型的白屏場(chǎng)景為了驗(yàn)證整條鏈路我構(gòu)造了一個(gè)典型的H5白屏問(wèn)題頁(yè)面加載時(shí)調(diào)用一個(gè)用戶信息接口接口返回的數(shù)據(jù)結(jié)構(gòu)跟前端預(yù)期不一致導(dǎo)致渲染時(shí)報(bào)錯(cuò)頁(yè)面白屏。問(wèn)題代碼大概長(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ī)上打開(kāi)后vConsole面板會(huì)顯示報(bào)錯(cuò)同時(shí)數(shù)據(jù)通過(guò)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但代碼里訪問(wèn)的是data.user.name字段路徑不匹配導(dǎo)致TypeError。整個(gè)分析過(guò)程不需要我手動(dòng)復(fù)制任何日志。4.3 對(duì)比傳統(tǒng)流程的效率差異傳統(tǒng)流程下這個(gè)問(wèn)題的排查步驟是在手機(jī)上打開(kāi)頁(yè)面看到白屏打開(kāi)vConsole切到Console面板看到報(bào)錯(cuò)截圖或復(fù)制報(bào)錯(cuò)信息切到Network面板找到接口請(qǐng)求查看響應(yīng)體復(fù)制響應(yīng)體打開(kāi)AI對(duì)話窗口粘貼報(bào)錯(cuò)和響應(yīng)體描述問(wèn)題AI分析后給出結(jié)論整個(gè)過(guò)程至少需要5-6次手動(dòng)操作耗時(shí)2-3分鐘。而通過(guò)MCP鏈路只需要對(duì)AI說(shuō)一句話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é)問(wèn)題第一個(gè)問(wèn)題日志順序錯(cuò)亂。WebSocket消息是異步到達(dá)的如果頁(yè)面瞬間產(chǎn)生大量日志服務(wù)端接收順序可能跟實(shí)際產(chǎn)生順序不一致。解決方案是在每條日志里帶上客戶端時(shí)間戳服務(wù)端按時(shí)間戳排序后再返回給AI。第二個(gè)問(wèn)題循環(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); // 清理過(guò)期記錄 if (recentLogs.size 1000) { for (const [key, time] of recentLogs) { if (now - time 5000) recentLogs.delete(key); } } return true; }第三個(gè)問(wèn)題敏感信息泄露。請(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來(lái)驗(yàn)證假設(shè)。實(shí)現(xiàn)方式是在MCP Server里增加一個(gè)eval_js工具通過(guò)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)限只允許在開(kāi)發(fā)環(huán)境使用生產(chǎn)環(huán)境要禁用??梢栽陧?yè)面端加一個(gè)開(kāi)關(guān)只有URL參數(shù)里帶了debug1才啟用eval功能。5.2 日志與請(qǐng)求的關(guān)聯(lián)分析單獨(dú)看日志和單獨(dú)看請(qǐng)求有時(shí)候很難定位問(wèn)題。比如一個(gè)接口報(bào)錯(cuò)但日志里沒(méi)有明顯異常。這時(shí)候需要把請(qǐng)求和它前后的日志關(guān)聯(lián)起來(lái)。實(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在分析問(wèn)題時(shí)能看到完整的上下文而不是孤立的一條日志或一個(gè)請(qǐng)求。5.3 多頁(yè)面同時(shí)調(diào)試的支持實(shí)際項(xiàng)目中一個(gè)H5應(yīng)用可能有多個(gè)頁(yè)面或者同時(shí)打開(kāi)多個(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é)合起來(lái)。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)跑一遍核心流程然后檢查有沒(méi)有報(bào)錯(cuò)日志、有沒(méi)有失敗的請(qǐng)求。比人工寫斷言靈活得多因?yàn)锳I可以根據(jù)上下文判斷這個(gè)報(bào)錯(cuò)是否正常。6. 踩過(guò)的坑與穩(wěn)定性優(yōu)化6.1 WebSocket連接在移動(dòng)端的斷連問(wèn)題移動(dòng)端瀏覽器在切后臺(tái)、鎖屏、網(wǎng)絡(luò)切換時(shí)WebSocket連接大概率會(huì)斷開(kāi)。而且不同瀏覽器的行為不一致有些會(huì)立即觸發(fā)onclose有些會(huì)靜默斷開(kāi)onclose延遲很久才觸發(fā)。解決方案是雙保險(xiǎn)客戶端心跳 服務(wù)端超時(shí)檢測(cè)??蛻舳嗣?0秒發(fā)ping服務(wù)端如果60秒沒(méi)收到任何消息就主動(dòng)關(guān)閉連接??蛻舳藱z測(cè)到連接關(guān)閉后用指數(shù)退避重連。還有一個(gè)細(xì)節(jié)頁(yè)面從后臺(tái)恢復(fù)時(shí)要立即檢查連接狀態(tài)??梢酝ㄟ^(guò)visibilitychange事件監(jiān)聽(tīng)document.addEventListener(visibilitychange, () { if (!document.hidden ws.readyState ! WebSocket.OPEN) { reconnect(); } });6.2 大數(shù)據(jù)量下的性能問(wèn)題當(dāng)頁(yè)面產(chǎn)生大量日志時(shí)WebSocket消息可能非常大。比如一個(gè)接口返回了1MB的JSON直接通過(guò)WebSocket發(fā)送會(huì)導(dǎo)致消息分片增加延遲。解決方案是在頁(yè)面端做壓縮和截?cái)?。?duì)于超過(guò)10KB的響應(yīng)體只發(fā)送前10KB并標(biāo)記truncated: true。如果AI需要完整數(shù)據(jù)可以通過(guò)另一個(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通過(guò)stdio通信調(diào)試起來(lái)不太直觀。我的做法是同時(shí)啟動(dòng)一個(gè)HTTP調(diào)試端口在開(kāi)發(fā)階段可以通過(guò)瀏覽器或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客戶端之前可以先通過(guò)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通過(guò)HTTP或Unix Socket向WebSocket服務(wù)查詢數(shù)據(jù)。6.4 安全邊界什么時(shí)候不該用這套方案這套方案的核心是把頁(yè)面運(yùn)行時(shí)數(shù)據(jù)暴露給本地服務(wù)。在開(kāi)發(fā)環(huán)境沒(méi)問(wèn)題但在生產(chǎn)環(huán)境絕對(duì)不能用。幾個(gè)必須遵守的原則生產(chǎn)環(huán)境構(gòu)建時(shí)通過(guò)環(huán)境變量徹底移除調(diào)試腳本W(wǎng)ebSocket服務(wù)只監(jiān)聽(tīng)本地回環(huán)地址127.0.0.1不要監(jiān)聽(tīng)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)建工具的配置里通過(guò)process.env.NODE_ENV判斷生產(chǎn)構(gòu)建時(shí)直接不打包這個(gè)腳本。這樣即使有人手動(dòng)在URL里加參數(shù)也不會(huì)有任何調(diào)試代碼執(zhí)行。這套方案我用了大概三個(gè)月從最初的簡(jiǎn)單日志轉(zhuǎn)發(fā)到后來(lái)加上請(qǐng)求攔截、eval執(zhí)行、多頁(yè)面支持基本上覆蓋了H5調(diào)試的常見(jiàn)場(chǎng)景。最大的感受是AI輔助debug的前提是AI能拿到足夠的數(shù)據(jù)而MCP正好解決了數(shù)據(jù)通道的問(wèn)題。vConsole負(fù)責(zé)采集WebSocket負(fù)責(zé)傳輸MCP負(fù)責(zé)暴露給AI三者各司其職組合起來(lái)就是一個(gè)完整的AI輔助調(diào)試閉環(huán)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
狠狠躁AV| 青娱乐av在线| 久久精品一区二区三区四区五区| 欧美第二页午夜| 99超碰色| 日本色婷婷| 强奸乱伦亚洲第一页| 99久久免费看精品国产一区| 亚洲成人妻日韩在线| 婷婷五月天成人| 艹精品| 精品午夜福利| 精品无码久久| 超碰 国产熟女精品一区| 91欧美偷拍| 理论久久婷婷网 8| 日韩三四五区| 97网色| 人妻少妇被猛烈进入中| 人人搞人人插人人操| 色九色久| 99精品九九九九九九| 丁香婷婷激情五月天无毒不卡| 麻豆人妻精品一区二区| AA丁香综合激情| 女人高潮大叫一级毛片| a级理论午夜日本| 国产精品ⅴ无码大片在线看.| 久一区久久蜜桃| 男人的天堂com| 欧美丝袜美女电影一二三四区| 精品人妻一区二区乱码一区二区| 今日头条成人一区二区三区四虎精品| 久热久一区二区三区| 色噜噜人妻av 中文字幕| 操逼日韩无码 | 激情视频图片| 大香蕉伊人75| 成人性爱免费播放| 伊人久久大香线蕉无码| 手机在线播放国产福利| 国产 v乱码一区二| 欧美操逼一二三区| 九九九九九九九九九九九免费国产| 综合久久99| 日本天天操| 爱射综合| 91伊人影视综合| 亚洲自拍欧美国产首页网曝| 久久久久久久久久久久欧美日| 精品一久久久| 日韩电影免费网站麻豆视频| 日本精品加勒比海一区| 夜夜精品视频| 99久久久无码精品国产人| 婷婷在线视频在线观看| 操操操五月天婷婷丁香影院| 裸体美女免费看网站青草| 啊啊啊不要好疼视频| 99久久久er直播网址| 欧美三级中文字幕hd| 91啪啪视频| 在线女人91| 色 亚洲 91| 欧美自拍网| 中文字幕一区二区视频在线观看| 亚洲国产精品9999在线观看| 欧美成人9797| 人妻天天爽| 超碰97人人乐| 一级人妻性爱视频| 极品五月天噜噜| 色娱乐色呦呦夜夜夜夜av| 久久网亚洲| 熟女精品日韩一区二区三区 | 久久xx| 九九精品美女高溯喷水 | 欧美亚洲一级在线观看| 97人妻色| 日韩一级欧美一级国产一级台湾| 免费看日本操逼视频| 后入国产| 成人性爱视频在线看| 欧美精品999| 久久久久密臀一区二区| 国产精品不卡少妇白| 国产精品视频自拍在线| 有码免费观看| 国产精品自拍视频| 亚洲AV成人在线| 欧美一二在线| 欧美日韩在线小说 | 日韩欧美大片免费高清啪啪| 高清国产av无码| 欧美 日韩 婷婷 五月| 射久久| 美国aaaaa一级黄片| 久久黄色网址| 91女色| 精品成人无码| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 欧美综合色站| 亚洲中字幕日本一区二区三区| 亚洲一卡2卡3卡4卡乱码网站 | 精品熟妇视频一区二区| AV免费在线播放一区| 久久久影院| 啊啊啊好大好深| 玖玖草久草99蜜月一区二区三区| 成人美女av| 美女主播色欲91抠b在线播放| 五月婷亚洲精品天堂| 五月天婷婷基地| 天天综合网~91| 在线v中文字幕一区二区三区 | 国产精品第一区第一页| 欧美久久婷| 精品一区二区三区丰满熟女-亚洲欧美一区| 吖在线不卡一区二区国产剧情| 毛片视频白嫩| 久久久亚洲高清不打码| 久久99干一本高清| 色综合五月天| 囯产精品久久久久久久久久二区三区| 国产精品一区人妻精品阁在线| 78m成人视线| 欧美性爱五月天| 欧美日韩亚洲天堂| 亚州色站 日韩电影| 国产精品com| 国产视频一区二区在线观看| 最新国内自拍av免费| 中文字幕丝袜人妻| 精品中文字幕第一页| 日韩在线人妻网站| 一起草日韩| 久久久国产精品亚洲精品| 色网在线视频观看免费| 污电影在线观看| 高清无码国产亚洲| 午夜福利激情在线视频| 曰韩少妇无码| 美性中文综合网| 高清国产av无码| 黄页av| 久久9精品视频| 97se综合| 激情婷婷| 亚洲欧洲综合av在线| 久草久日| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 中文字幕 国产 精品| 色综合91好| 大香蕉十区| 日韩 欧美 视频 在线 一区| 国产精品9999| 怡红院成人av| 四虎AV在线观看| 一区AV| Aa东京男人的天堂| 亚洲美女精品| 九色视频91| 婷婷色综合欧美日韩| 色哟哟1区2区| 五月天婷婷欧美三区| 中文字幕美女91| 97操碰| 色眯眯射| 另类图片五月| 亚洲天堂另类美腿| 欧美亚洲日本激情在线| 视频国产成人精品日本亚洲18| 欧美亚洲厕所精品偷拍91 | 亚洲国产97在线精品一区| 九九久久久久久爱| 操人91| 中文字幕精品一区欧美| 亚洲AV无码乱码| www.acm成人黄色毛片| 国产日本熟女顶级一区二区三区视频| 亚洲精品中文字幕一区在线视频 | 啊啊啊com| 伦理日韩国产久久| 日韩内射视频| 爱爱动态120秒| 亚洲欧美精品福利在线| 免费人成?大片在线播放| 久久精品国产亚洲AV先锋| 中文字幕第23区| 黄色乱论网站| 九九九九九九亚洲| 婷婷97| 丰满的三级少妇欧美久久久| 秋霞蝌科网日本一区| 国产亚洲精品一区二区三区| 色噜噜狠狠色综无码久久合欧美| 天天肏夜夜肏| 国产97在线 | 亚洲| 国产一二三福利视频网| 91模特在线观看| 超碰久久精品| 久久久久久久久久精| 99精品丰满人妻无| 欧美美女啪啪视频| 久久深夜无码| 97精品视频免费| 快点操死我| 91N欧美| 成人综合色网| 国产不卡片| 97蜜桃综合| 夜夜一区二区| 久久啊哟| 天美一二三在线观看Av| 久久超碰免费的| 综合 青草 伊久久 影院 综合| 中文字幕人妻丝袜| www.97在线| 男人天堂.AB| 内射中出日韩在线观看视频| 嫩草影院在线观看精品| 午夜精品视频777| 欧美刺激色黄片免费看| 久久伊人大香蕉| 91熟女熟妇视频网站| 亚洲激情综合| 干B视频伊人网| 亚洲男人的天堂一区二区| 人妻在线臀日韩| 啊啊啊啊二区好大| 亚洲精品国产拍免费91在线| 97日韩欧美| 欧美一区二区三区互相| 久久97| 18精品一区| 亚洲人妖网| 日日日日做夜夜夜夜做无码97| 3级毛片一二| 精品对白久久不卡| 视频国产精品未满十八禁止在线观看| 日韩黄色一区二区三区| 五月天综合网| 天天日日本| 九九九九九九九九九九九蜜桃| 综合网亚洲在线| 色综合一区二区三区| 人人做天天爱| 天天插天天射| 51一区二区三区| 九九九九热| 人人摸.人人色| 欧美精品自慰系列寂寞少妇 | 亚州性色| www黄片免费看com| 曰韩中文人妻视频| 96久久精品一二三区色欲| 天天流夜夜操| 中文字幕精品专区搜索结果91| 91亚洲图片| 欧美性爱中文字幕无线码| 九九热超碰| 综合亚洲情色| 啪啪啪综合网| 久久久国产三级黄色片| 国产精品3| 亚洲在线网站| 久九九九九九九热| 欧美色97| 六月丁香网| 青青草国产一区二区三区| 国产1024在线播放| 熟妇女人妻呻吟久久AV| 美女t无毒不卡不卡| 欧美黄色大片在线观看| 日韩人妻网站| 国产强奸乱伦无码视频| 亚洲色图91欧美日韩| 国产女人9999| 91精品女厕偷拍视频| 91女网站| 水多多映视AV| 在线天堂999| 青草成人免费视频一COm| 大香蕉久| 亚洲成人AB| www成人啪啪18秘 免费| 超碰久久精品| 无码视频黄色网战| 久欲AV| 精品人妻1区| 久久超碰亚洲人| 97超碰超碰| 久7色| 日韩一卡二卡三卡| 五月香婷婷| 久久αⅴ| 日本人妻天堂网站在线播放| 999精品国产高清一区二区| 大香蕉伊人亚洲| 欧美天天性| 亚洲色图超碰在线| 成人AV超碰免费在线| 夜夜操天天肏| 国产精品久久久无码aV去| 亚洲精品一二三四区| 思思热一热婷婷热一热| 大香蕉在线86| 国产精品成人蜜臀AV在线| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 蜜臀久久久国产| 伊人久久在线视频观看| 色综合99999| 欧美专区日本专区| 亚洲一区二区在线观看91| 嗯嗯嗯不要不要免费视频| 久久久性| 九九九九97| 国产亚洲色婷婷久久99精品91| 久久岛国| 天美传媒在线一区| 久久98| 五十路三区在线| 97超级欧美| 九九无码视频| 国产成人无码a| 一级免费精品| 暖暖精品二区三区观看| 亚洲图片欧洲图片aⅴ| 91成人精品| 熟妇亚洲一区二区三区| 激情综合二| 91色花堂| 天天日熟妇| 天天干一区二区| 国产福利在线视频网站| 亚州一区二区| 久九9精品| 992这里有精品| 天天色黄色影院天天操| 人人妻人人爽一区二区三区| 欧美色天堂网在线视频| 五月天丁香| 中文字幕一区二区三区字幕| 超碰97 线线 在现| 超碰97久久国| 中美日韩毛片| 9+1视频网址| www.黄色在线| 亚洲欧洲日本精品中文a∨| 久久超碰av在线| 精品妇女一区二区三区| 美国aaaaa一级黄片| 久久久久9999| 97手机日韩| 91亚洲丝袜| 超碰人妻久久人妻中文97| 99热婷婷| 丁香色五月 97干| 亚洲精品成人动漫在线| 国产精品96| 精品少妇一区二区三区| 亚洲涩涩| 色爽——AV| 999熟女精品| 日本五十路在线| 久久久99久9| 天天影视网综合少妇| 日本中文字幕在线视频| 精品性爱无码在线播放| 日本三级网页| 做爱A级亚欧| 一个人免费视频观看在线WWW| 久久久久白虎| 日曰骚久久精品| 东北操逼| 在线播放中文字幕| 中国91AV| 欧美在线永久天堂| 大黄片做爱的大的| 国语精品av| 亚洲麻豆18发?| 麻豆九九九| 91九色丨国产丨爆乳| www.丁香五月| 激情九月婷婷| 日本在线不卡123| 亚洲色色色| 蜜乳AV色欲AVAV无码| 亚洲成人一区二区精品| Blackedraw视频一区二区| 欧美日韩不卡a片| 377p欧洲日本亚洲大胆| 亚洲暴力强奸AV| 国产精品成人蜜臀AV在线| 浪人综合网| 老司机深夜影院18未满| 操逼网站视频漫画国产| 丰满人妻一区二区三区| 老女人爆菊| 91视频成人福利网站在线一区| 天堂麻豆天美| 亚洲精品人伦一区二区| 超碰97国产欧美| 中文久久久| 亚洲一区中文精品| 无码av永久免费专区网站| 日韩午夜精品一区二区三区电影| 久久激情综合| 国产一区二区三区不卡手机在线| 少妇内射www在线观看视频| 人澡逼| 欧美成人贴图| 日本国产亚洲一区在线观看| 92午夜免费福利视频| 天天做天天爱天天爽| 麻豆AV一区二区| 人妻超碰青青草98| 久久区| 色天使亚洲综合在线观看| 国人欧美精品一区二区| 一区黄二区黄| 性感美女啊啊啊在线| 国产精品美女| 播播亚洲小说亚洲| 97在线欧洲| 超碰偷拍| 免费?级毛片无码?∨蜜芽试看| 久久久久国产精品片区无码直播| 97舔舔| 久久一区二区加油站| 青青五月天| 一起草欧美| 欧美操逼一二三区| 玖玖爱综合网| 欧美日韩大香蕉| 激情接吻视频久久久久久| 久久久久久久久久久久久久久乱码 | 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 99精品九九九九九九| 91天天综合| 操逼逼无码| 欧洲精品在线播放| 亚洲欧洲激情卡通另类文学四射小说网站 | 女人 A一级| 欧美日韩国第一区| 亚洲男人天堂手机版| 日本视频一区二区三区| 91亚洲欧美色图| 亚洲视频精选| 免费综合亚洲中文| 九九九草| 福利视频一区二区微拍| 五月综合久久| 亚洲日韩97| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 久久女女| 一级啊性爱在线视频| 爱欲AV| 欧美草草高清日韩视频| 自拍偷拍 高清无码| 99热超碰| 少妇高潮九九九九| 97福利视频| 一本一道久久综合久久| 国产精品一区二区三区,亚洲综合| 啊啊啊用力在线观看| 超碰97极品9| 久久精品国产亚洲AV无码做| 欧美中文狠| 强奸乱伦 亚洲一区| 丁香激情五月| 1240青青草一区二区三区视频天爱| 性爱乱伦网址| 亚洲脚交| 性做久久久久久免费观看软件| 亚洲色情在线影视| 国产白嫩漂亮KTV在线| 亚洲揄拍网| 园内精品自拍视频在线播放| 日韩中文字幕av在线播放| 蜜臀99久久精品久久久懂爱| 久久久久久亚洲精品不卡人乳| 一级AAA片一区二区三区| 亚洲国产欧美中文永久| 天天做日日做| 九九免费影片| 色综合九九| 成人性交午夜免费片| 91色情黑丝搞鸡在线观看一区二区三区三州| 啊啊啊轻点在线观看| 亚洲最大无码中文字幕网站 | 思思在线免费视频| 蜜桃午夜视频一区二区| 精品久热| 人人操欧美风骚| 日韩AV一区二区三区三州三州| J?P?NESEHD熟女熟妇伦| 东北操逼| 亚洲少妇喷视频看| 嫩呦国产一区二区三区AV| 精品9区| 四虎影院成年人片| 无码高清操逼| 亚洲在线观看| 99在线观看无大码| 天天干,天天日| 亚洲欧洲日本精品中文a∨| 插入粉嫩少妇视频| 欧美不卡在线美女| 在线精品福利免费播放| 三级日本一区二区三区| 精久久久| 上床不卡网站| 久7色| 精品人妻av在线播放| 免费视频观看60秒| 美性中文综合网| 欧美激情综合色综合啪啪五月| 啪啪啪精品| 97超级久久| 试看福利| 亚熟在线| 亚洲无套久久嗯嗯| 国产精品亚洲一区二区三区四区| 天天做天天爱夜夜爽毛片试看| 日韩干B| 欧美一区二区传媒| 中文字幕日韩综合| 久久亚洲av成人无码国产| 国产AAAAAABBBBB| 老熟女91视频| 综合欧美色图| 欧美手机在线综合| 中文字幕一区二区三四五区日日骚| 插入综合网| 午夜色婷婷| 精品亚洲国产成人av网站| 久久大黄片| 国产剧情AV不卡在线观看| 午夜福利一区二区影院| 久热一区二区| 少妇精品久久| 老熟妇91| 九九九九精品精| 天天综合网视频91| 夜夜国自区| 欧美国产操逼| 99日免费视频中文字幕| 青青欧美| 日本高清加勒比| 国产一区二区三区久久精品太古里| 夜夜夜久久| 国产超碰国产97| 天美国产三级传媒| 四虎永久在线精品免费网址| 国产欧美一区二区| 欧美少妇第一页| 天堂资源欧美| 青青草五月天| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 思思视频免费看网站| 操逼网站网站| 桃花色综合影院| 久久伊人亚洲AV无码网站| 久久av无码| 国产三级资源在线观看| 尤物黄色在线观看网站| 久草免费福利在线播放| 欧美强奸乱| 国产精品久久伊人| 亚洲黑丝在线| 97色97好| 久久精品91| 嗯嗯不要 视频| 超碰色老头| 欧美91精品国产自产| 在线观看一级α片刺激高潮视频| 91丨九色丨国产丨人妻在线 | 伊人97色天使| 青青欧洲黑| 草B在线| 成人日韩欧美| 亚洲男人天堂网久久| 10000部十八禁看电影| 亚洲精品一区二区免费在线观看| 人人九九精| 97干在线| 美国aaaaa一级黄片| 99碰碰| 97一区二区蜜臀| 久久99精品九九久久久婷婷| 精品人妻15区| 人妻无一区二区三区| 久久亚洲AV无码专区国产精品| 日本免费亚洲欧美| 天天日日日射| 亚洲色图片区| 成人av影院在线观看| 精品一区二区成人动漫| 怡红院怡春院| 色欲久久99精品久久| 久操91视频| 国产精品久久久三级无码| 色噜噜人妻av 中文字幕| 在线小视频| 99无码狠狠久久| 成年人一级黄色毛片大全在线观看| 91麻豆天美国产欧美| 999 久久久| 亚洲精品97| 天天色综合天天操| 天天干天天日天天射黄色片| 精品国产乱码久久久A| 国产中文大片资源中文字幕| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 91精品国产乱码| 日韩在线观看三级电影| 欧美一级做a爰片免费视频| 国产日韩精品一区二区三区| 高精欧美色| 美国aaaaa一级黄片| 综精品久久久aaaa| 91丝袜在线播放| 大伊香蕉在线视频免费| 欧美亚洲美少妇一区二区| 女人综合网| 久久99综合| 欧美日韩精品一区二区三区高清| 日本免费一区二| 91天天综合日韩欧美| 精品国产肉丝袜在线拍国语| 久久精品电影| 久久久久久国产精品免费网站| 在线啊啊啊啊| 激情文学88| 大香樵伊人网| 久操国产在线| av九九| 91插B网站| 亚洲黄色网址视频| 亚洲人码13| 乳欲人妻办公室奶水| 97综合国产精品高潮久久| 麻豆美女丝袜人妻中文| 精品超碰中文在线| 亚洲色狠| 中美日韩毛片| 久久久久久久九九九九九九| 精品十三区| 黄色大片免费在线| 色娱乐色呦呦夜夜夜夜av| 在线观看免费视频国产| 美腿丝袜高跟网免费视频免费视频| 久久精品国产亚洲AV清纯| 久久久久骚| 亚洲电影中字一区二区| 精品999日本| 亚洲导航深夜福利| 超碰社区97| 五月婷婷六月天| 97碰碰色| 性感女人网页在线观看视频| 婷婷干黄色| 青娱乐手机日韩在线视频| 午夜无码精品免费看性色| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 久久中文字幕在线观看| 亚洲 图片 综合91| 久久亚州精品成人Av无| 99热日| 成人看片网站| 91在线精品一区二区三区| 中文字幕十五区| 国产精品久久久久久久久AV大片| 黄色工厂这里只有精品| ss久久| 国产精品嫩草久久久久| 婷婷激情五月综合| 97视频网站在线观看| 2017人人操,人人摸| 超碰9 7女人 | 欧美成人免费在线观看| 60秒免费小视频| 亚洲第一在线视频| 精品国模无码| 美女上床网站| 久草视频制服诱惑| 国产亚洲精品第一最新| 97超碰护士| 老司机午夜精品福利视频一区二区| 久久婷婷六月综合| 日韩黄片视频试看| 国产精品天堂| 亚洲国产中文字幕| 9久久9综合| 成视频在线观看免费看| 久热在线精品免费观看| 偷拍导航视频网站| 亚州综合图片| 欧美三级不卡| 青娱乐日韩无码| 岛国1区2区3区在线观看| 97伦综合| 98超碰日本| 久久e6只有精品| 柠檬AV导航| 天天操天天干一区二区 | 啊啊啊啊好爽好舒服一区二区易域| 日韩欧美偷拍美女视频| 久久久96| 亚洲天堂久久| 色香伊人| 麻豆伊人网| 九九九九九九亚洲| www色色com| 成人午夜小视频手机在线看| 免费国产电影一区二区| 上特色A在线| 偷窥自拍亚洲| 精品女同一区| 青青草久久在线| 91日产欧美| 欧美中字二区| 色诱avtt| 久草资源在线视频官方总站日韩丝袜美腿| 91粉芽高清在线一区二区| 国产浮力影院第1页| 久久免费99精品久久久久久| 免费岛国一级片| 欧美翘臀视频网站一区二区三区| 97欧美资源| 国产精品另类一区大香蕉| 青娱乐手机日韩在线视频| 久久一区,青青青青草视频在线播放| 丁香九月婷婷| 久久婷婷色| 国产 日韩 另类 视频一区爱| 最新的亚洲无吗| 国产高清精品一区二区三区毛片| 人妻少妇久久中文字幕一区二区 麻豆| 男同专区一区二区三区在线| 97欧美资源| 2017,超碰| 果冻传媒A片麻豆熟妇人妻| 清纯唯美综合亚洲| 亚洲第一视频 欧美风情 日韩| 啊嗯嗯啊好大好爽| 怡红院亚洲怡春院av| 亚洲一区制服诱惑| 日韩在线观看AV| 欧美精品庄| 亚洲久久久久| 麻豆综合一区av| 成人性爱AV在线免费观看| 亚洲密乳AV| 色呦呦呦在线观看视频| 日韩人妻免费精品| 激情综合五月| 日本人体九九九九九九| 中文字幕 一区二区 亚洲无码| 白嫩嫩一区| 97亚洲资源| 天天色踪合| 操逼网站地址| 激情婷婷五月天| 精品v1区| 日本久久久精品电影| 偷拍导航视频网站| 欧美激情综合| 欧美aaaaaaa| 簧片免费看视频| 人人妻人人操人人乐| 久久999久| 九九九九一区| 精品国产一区探花在线观看| 国产精品毛片?v一区二区三区| 少妇高潮对白在线观看| 免费观看欧美日韩操逼视频| 青久操| 精品人妻高清麻豆av| 试看日韩黄片| 激情综合二| 天综合网| 91精品免费| 91人人| av网页一区二区三区| 亚州伊人色综台| 久久久禁| 大JI巴好深好爽又大又粗视频| 三级特黄60分钟播放| 五月天激情国产综合婷婷婷| 九九九九日本| 91网站18禁| 中国一区二区亚洲人妻| 天美av在线观看| 中文字幕精品三级久久久| 色色毛片| 狠狠操狠狠| 超碰无码五月97| 国产精品成人AV片免费看网站| 操逼操网| 亚洲永久AV无码精品秋霞| 97亚洲中文| 亚洲女毛多水多21P| 亚洲综合影视| 熟妇女伦乱视频| 欧美麻豆成人同性GⅤ在线| 打av高清| 蜜臀久久99精品久久久久久无删减 | 日日操免费视频| 五月激情小说| 欧美亚洲韩国视频十五区| 蜜乳中文字幕a在线| 国产免费一区二区在线A片视频| 久久久久久波多野吉衣高潮| 欧美日韩1234| 97人人干| 传媒在线观看一区二区三区| 日韩,欧美,中文在线| 九九九九九用不成了| 伊人热综合| 天天91~综合入口| 嗯嗯啊啊啊好爽| 岛国成人av在线播放网址| 内射中国少妇高清视频免费视频 | 日本熟妇一区二区三区| 欧美男人的天堂| 成人午夜视频免费播放| 熟女一区二区三区四区| 蜜桃视频成a人v在线| 国产十八禁视频| 香蕉热人人精品| 日日夜夜青青草母狗| 強姦亂倫a| 亚洲永久AV无码精品秋霞| 青娱乐999| 亚熟在线| 亚洲一区日韩精品| 爱啪精品一区| 国产高清免费不卡av| 国精综合一二三区影视| 国产黄色影片在线观看| 都市激情人妻一区二区青青操视频 | 97伊人超碰| 日本色婷婷| 97在线视频免费| 高清不卡国产| 乱伦一区二区三区‘| 国产精品视频在线播放| 亚洲国产精品无码AV在线| 色偷偷人人玩人人舔人人操人人摸人人爽| 2021久久国产综合精品青草| 欧美手机在线综合| 五月天婷婷色色| 97在线观看| 极品粉嫩少妇视频| 色成人Www精品永久观看| 亚洲AV色图一区| 丁香五月电影| 欧美九九99久久精品| 亚欧免费| 一二三四区操操Av| 亚洲人妻一区二区三区| 亚欧无码线免费观看视频| 九九久久国产精品| www国产天美久久久| 久久久月天| 青草青青久久久久久国产| 操人人| 蜜桃传媒视频第一区入口在线看| 久久久一区二区三区四曲免费听 | 91色黑人少妇| 在线无码操| 亚洲毛片基地专区| 国产一区二区久久| 五月天开心网| 操操吧亚洲乱伦视频| 亚洲人妻久久久| 欧美一区二区情色| 日本高清一区二区在线| 熟女人妻精品一区二区视频 | 日韩无码三级影院| 日本韩国五十路六十路七十路老熟女作爱视频网站 | 国产精品。| 精品国产精品一区二区| 色视频蜜乳| 蜜臀AV一区二区三区| 日日AV加勒比| 丁香六月婷婷| 欧美日本中字另类在线| 91伊人| 亚洲熟妇AV日韩熟妇在线| 日韩天堂av电影在线观看| 乱伦系列一区二区| 精品毛片av一区二区| 亚洲天堂资源在线| 激情综合网一盗摄| 91扒丝袜综合在线| 九九色综合| 福利在线观看一区二区| 玖玖爱在线视频免费观看| 欧美图片校园春色| 亚洲视频二区| 91女神在线视频| 日日夜夜干| 欧美性爱在线无码| 久久人人爽爽人人爽人人片αV| 亚洲色阁| 又黄又硬又粗又长国产视频| 欧美国产操逼| 搞中出视频在线观看| 九久9热| 成人五月香网在线| 91Chinese在线| 无码 有码 国产18p| 成年人黄色小视频网站| 国产精品一二三区18| 日日夜夜免费| 久久精品国产亚洲av水密被窝| 色香91| 加勒比综合a∨| 九区国产| 国产精品丝袜久久亚洲不卡| 熟啊v色欧美热| 亚洲s在线观看| 国产人妻精品久久久一区二区三区 | 色哟哟-国产专区| 天天看综合网| 亚洲超碰在线| 中文在线视频| 一区二区三区日韩欧美| 久久久久久久人妻| 国产亚洲在线观看| 日韩不卡a级视频专区| 天天色,天天干,天天干| 欧美激情性久久久久久| 久久久精品91八戒| 囯产精品久久久久久久久久梁医生| 午夜男人的天堂| 亚洲色图日韩丝袜制服一区二区五月在线| 2017超碰| 熟女高潮精品一区二区| 91天天爽| 蜜臀99久久国产| 欧美96精品在线| 色综合一区二区三区| 欧美一级在线观看成人| 日韩av在线精品观看| 国产午夜精品理论片一二三区区| 国产毛片片精品天天看视频| 国产 日韩 欧美一区| 肏逼视频日本| 福利社区午夜一区二区| 51一区二区三区| 亚洲无码一区二区三区三州| 亚洲中文字幕三级在线| 天天爱天天韩国日本牛牛牛牛| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 男人的天堂2018.| 欧美 日韩 国产传媒| 啊啊啊要高潮了| 欧美综合狠| 600国产精品视频| 亚洲影院成人| 日韩人妻播放| 99视频只有精品| 欧美成不卡网| 久九9精品| 野狼福利社区| 欧美激情性久久久久久| A片 AV一级在线播放观看免费| 丁香五月天堂网| 超碰色中文| 久久精品成人一区二区三区蜜臀| 久久久久久十| 国产亚洲深夜激情| 亚洲色图亚洲无码强奸乱伦| 超碰97起碰| 久久99草| 丰满少妇一区二区三区免费看| 国产乱伦性爱区| 大香蕉五月天| 久久蜜色情在线视频xxx免费观看| 久久久久深夜无码| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 久草精品一区 | wwwcaobibi| 江都AV在线| 日日AAvv| 日韩操逼性鲍| 三级三级三级日本99| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 亚洲AV永久无码一区仙野| 丝袜内射| 青青草大香蕉视频| 91碰超| 欧美综合站| 91色伦| 欧美性爱免费短视频| 99这里只有精品| 天天综合网合集91| AV天堂国产| 又黄又爽在线观看视频| 91精品免费| 超碰免费人妻人人| 六九九九| 人伦四五区| 少妇人妻好深太紧了vr91| 国产丝袜美女诱惑| 综合少妇网| 久久久久久久久成人av解说| 久久色激情一区二区三区| 国产一区二区在线看| 91艹B视频| 天天天乱色综合全| 亲子敌伦对白在线播放| 综合激情五月天| 国产女主播视频在线观看| 国产大陆天天艹| 97硬碰| 大JI巴好深好爽又大又粗视频| 成人av动漫在线观看| 欧美色图91p| 男人的天堂午夜av| 亚洲欧美另类少妇精品| 欧美天天性| 99亚亚热| 亚州一区二区| 欧美男人一区| 大香蕉99999| 国产九月婷婷| 天天日天天看| 天天干,夜夜爽| 亚洲色电影在线| A久久| 欧美激情高清性猛交| 丁香五月激情婷婷| 九久久九九久视频| 99热自拍| 亚洲中文字幕一区二区| 五月天婷婷久久| 自拍六区| 青青草日本无码| 婷婷久久五月综合激情| 欧美最婬乱婬爆婬性视频| 伊人热综合| 久草资源欧美在线视频| 高清无码一区二区三区| 91在线/欧洲| 在线看片国产精品每日更新| 亚洲怡春院| 久久久精品国产亚洲AV无码| 青青草原伊人网| 日韩人妻精品久久久久| 老女人综合| 国产精品乱人伊人网| 亚洲成人在线高清| 少妇内射www在线观看视频 | 日本性一区| 五月丁香综合啪啪| 精品人妻一区二区三区在| 欧美性暴力猛交XXXX| 成人精品一区二区91毛片不卡| 91色色综合| 五月婷婷激情综合| 91久久青青草原精品| 色五月天AV| 日韩精品永久在线观看| 欧美偷拍| 97色97好| 日韩不卡av一二三| 国产精品剧情| 欧美精品偷拍| 国产视频一区二区免费| 久久国产乱子伦精品免费女,网站| 久久久精久久久| 欧美不卡二区| 日韩97P| 伊蕉97蜜桃97狠狠综合干| 日韩性爱视频免费在线| 91色狼| 九九av| 95精品在线| 在线综合色| 超碰97久久| 伊人96在线| 夜夜夜久久| 操逼网免费无码视频| 无码人妻精品酒店| 福利大香蕉| 人妻日日夜夜精品| 亚洲一区二区三区欧美日韩| 青草精品视频-日本久久久久网站| 99re在线观看| 天天爽夜夜操| 久操com| 久草午夜| 中日韩久久久免费看| 老师充足的奶水小说| 五月丁香综合| 久操网视频| 免费a v| 性欧美| 97操在线| 五月天色图| 狠狠干狠狠干| 欧美强奸乱| WWW操逼| 97色亚洲| 亚洲中文丝袜美腿诱惑字幕| 麻豆精品天美| 九九久久一区二区三区| 99热精品在线| 天天躁日日躁AAA片李宗瑞| 成人无遮挡毛片免费看| 97超碰精品| 亚洲女人91| 插插综合网天天影视网| 久操在97| 欧美大香蕉97| 视频在线观看一二三区| 亚洲成人在线播放| 成人国产精品三级A片| 男人高清无码一区二区| 日本三级大片| 日韩av在线免费网站| 伊人精品久久网站| 国产成人超碰在线| 免费国产视频| 中日韓欧美高清| 俞拍久久国应视频| 无套后入双马尾| 4tube欧美女厕所| 九九九九免费视频| 加勒比人妻综合| 亚洲黄色网址| 亚州日韩97| 97在线观看免费视频l| 屌妞视频久久久久久久久久久久| 91大胆欧美| 蜜臀久久99精品久久久久久久久| 亚洲av无码成人精品国产| 五月天婷精品激情| 亚洲最大AV网| 亚洲精品日韩国产欧美| 色噜噜人妻丝袜a∨先锋影 | 久久国语| 91 丝袜在线观看| 亚洲综合一| 91伊人久久在线| 日本在线15p| 就去色综合| 欧美资源| 操屄日韩| 亚洲国产91精品一区二区久久| 手机看片日韩人妻| 密乳无码| 操我无码| 色色色欧美| 蜜色网色哟哟|