免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

Python與AutojsPro7構(gòu)建云控系統(tǒng):WebSocket通信與自動(dòng)化任務(wù)調(diào)度實(shí)踐

Python與AutojsPro7構(gòu)建云控系統(tǒng):WebSocket通信與自動(dòng)化任務(wù)調(diào)度實(shí)踐 1. 項(xiàng)目緣起當(dāng)Python遇上AutojsPro7自動(dòng)化云控的另一種可能最近在折騰一些自動(dòng)化腳本特別是針對(duì)移動(dòng)端App的批量操作發(fā)現(xiàn)圈子里的朋友很多都在用AutojsPro7。這工具確實(shí)強(qiáng)大基于JavaScript能直接在安卓設(shè)備上跑模擬點(diǎn)擊、找圖、OCR識(shí)別都不在話下。但當(dāng)我需要管理幾十上百臺(tái)設(shè)備或者想把自動(dòng)化邏輯和更復(fù)雜的后端服務(wù)比如數(shù)據(jù)分析、任務(wù)調(diào)度、狀態(tài)監(jiān)控結(jié)合起來時(shí)純?cè)谑謾C(jī)端用Autojs寫腳本就有點(diǎn)捉襟見肘了。這時(shí)候一個(gè)很自然的想法就冒出來了能不能用Python來“遙控”這些Autojs腳本呢或者說用Python作為“大腦”和“指揮中心”去下發(fā)指令、收集結(jié)果、管理設(shè)備狀態(tài)而AutojsPro7的腳本則作為忠實(shí)執(zhí)行命令的“手腳”。這就是“Python技術(shù)下的AutojsPro7云控”這個(gè)標(biāo)題背后我想探討的核心。它不是一個(gè)現(xiàn)成的、開箱即用的龐大云控系統(tǒng)而是一種架構(gòu)思路和代碼實(shí)踐。通過Python我們可以構(gòu)建一個(gè)輕量級(jí)、高靈活度的控制層將分散的Autojs設(shè)備納入統(tǒng)一的管控體系。這對(duì)于需要做App群控、自動(dòng)化測試、數(shù)據(jù)采集或者社交媒體運(yùn)營的朋友來說意味著你可以用更熟悉的Python生態(tài)豐富的庫、成熟的Web框架、強(qiáng)大的數(shù)據(jù)處理能力來賦能移動(dòng)端自動(dòng)化實(shí)現(xiàn)“112”的效果。下面我就把自己摸索和實(shí)踐過的一套代碼方案和架構(gòu)思路分享出來希望能給有類似需求的朋友一些啟發(fā)。2. 核心架構(gòu)拆解Python如何與AutojsPro7“對(duì)話”要實(shí)現(xiàn)Python對(duì)AutojsPro7的云控關(guān)鍵在于建立兩者之間穩(wěn)定、高效的通信通道。AutojsPro7運(yùn)行在安卓設(shè)備上Python程序通常運(yùn)行在服務(wù)器或個(gè)人電腦上它們處于不同的網(wǎng)絡(luò)環(huán)境。因此整個(gè)架構(gòu)的核心是解決“指令如何下發(fā)結(jié)果如何回傳”的問題。2.1 通信橋梁的選型為何是WebSocket最直接的通信方式無外乎幾種HTTP輪詢、HTTP長連接、WebSocket、MQTT等。對(duì)于云控這種需要近乎實(shí)時(shí)雙向通信的場景WebSocket是現(xiàn)階段最合適的選擇。為什么不是HTTP輪詢讓Python端不斷向每個(gè)設(shè)備發(fā)送“有任務(wù)嗎”的HTTP請(qǐng)求或者設(shè)備不斷上報(bào)狀態(tài)。這種方式簡單但延遲高、服務(wù)器壓力大、浪費(fèi)流量不適合實(shí)時(shí)控制。為什么不是單純的HTTP APIAutojs可以調(diào)用Python提供的HTTP接口來獲取任務(wù)但這只是單向的“拉取”。Python無法主動(dòng)、即時(shí)地向設(shè)備推送一個(gè)新指令比如緊急停止或切換任務(wù)。WebSocket的優(yōu)勢它在單個(gè)TCP連接上提供全雙工通信通道。連接建立后Python服務(wù)器可以隨時(shí)向任意一臺(tái)設(shè)備發(fā)送指令設(shè)備也可以隨時(shí)將執(zhí)行狀態(tài)、日志、結(jié)果推送給服務(wù)器。這是實(shí)現(xiàn)“云控”實(shí)時(shí)性的基礎(chǔ)。所以我們的架構(gòu)簡化為一個(gè)用Python編寫的WebSocket服務(wù)器作為控制中心多臺(tái)安裝了AutojsPro7的設(shè)備作為客戶端通過WebSocket與服務(wù)端保持長連接。2.2 設(shè)備端AutojsPro7代碼骨架AutojsPro7本身支持WebSocket客戶端。我們需要在Autojs腳本中實(shí)現(xiàn)連接管理、消息接收、任務(wù)執(zhí)行和結(jié)果上報(bào)的邏輯。下面是一個(gè)高度概括但功能完整的設(shè)備端代碼框架// 說明AutojsPro7 設(shè)備端核心連接與任務(wù)處理框架 // 文件名cloud_agent.js // 1. 配置區(qū) const SERVER_WS_URL ws://你的Python服務(wù)器IP:端口/ws/device; // WebSocket服務(wù)器地址 const DEVICE_ID device.getAndroidId(); // 使用設(shè)備Android ID作為唯一標(biāo)識(shí)也可自定義 const RECONNECT_INTERVAL 5000; // 斷線重連間隔(毫秒) // 2. 全局變量 let ws null; let currentTask null; let isRunning false; // 3. 核心函數(shù) - 連接WebSocket服務(wù)器 function connectWebSocket() { try { console.log([${DEVICE_ID}] 正在連接服務(wù)器: ${SERVER_WS_URL}); // AutojsPro7的WebSocket實(shí)現(xiàn) ws new WebSocket(SERVER_WS_URL); ws.on(open, function() { console.log([${DEVICE_ID}] WebSocket連接成功); // 連接成功后立即向服務(wù)器注冊(cè)本設(shè)備 sendMessageToServer({ type: register, deviceId: DEVICE_ID, status: idle, capabilities: [click, swipe, ocr, findImage] // 上報(bào)設(shè)備支持的能力 }); }); ws.on(message, function(message) { console.log([${DEVICE_ID}] 收到服務(wù)器消息:, message); handleServerMessage(JSON.parse(message)); }); ws.on(close, function() { console.log([${DEVICE_ID}] WebSocket連接關(guān)閉${RECONNECT_INTERVAL}ms后嘗試重連); ws null; setTimeout(connectWebSocket, RECONNECT_INTERVAL); }); ws.on(error, function(err) { console.error([${DEVICE_ID}] WebSocket錯(cuò)誤:, err); }); } catch (e) { console.error([${DEVICE_ID}] 連接異常:, e); setTimeout(connectWebSocket, RECONNECT_INTERVAL); } } // 4. 核心函數(shù) - 處理服務(wù)器下發(fā)的消息 function handleServerMessage(msg) { switch(msg.type) { case task: // 收到新任務(wù) if (isRunning) { sendMessageToServer({ type: status, deviceId: DEVICE_ID, status: busy, message: 設(shè)備正忙拒絕新任務(wù) }); return; } console.log([${DEVICE_ID}] 收到新任務(wù):, msg.task); currentTask msg.task; isRunning true; // 異步執(zhí)行任務(wù)避免阻塞消息循環(huán) threads.start(function() { executeTask(currentTask); }); break; case control: // 收到控制指令如停止、重啟等 handleControlCommand(msg.command); break; case ping: // 心跳回應(yīng) sendMessageToServer({type: pong, deviceId: DEVICE_ID}); break; default: console.warn([${DEVICE_ID}] 未知消息類型:, msg.type); } } // 5. 核心函數(shù) - 執(zhí)行具體任務(wù) function executeTask(task) { sendMessageToServer({ type: status, deviceId: DEVICE_ID, status: running, taskId: task.id, message: 開始執(zhí)行任務(wù): ${task.name} }); let result { success: false, data: null, error: null }; try { // 這里是具體的自動(dòng)化邏輯根據(jù)task中的參數(shù)執(zhí)行 // 例如打開某個(gè)App進(jìn)行一系列操作 if (task.action open_app) { launch(task.packageName); sleep(2000); // ... 更多操作 result.data { screenshot: base64... }; // 示例返回截圖 } else if (task.action collect_data) { let data collectSomeData(); // 自定義的數(shù)據(jù)采集函數(shù) result.data data; } // ... 其他任務(wù)類型 result.success true; sendMessageToServer({ type: task_result, deviceId: DEVICE_ID, taskId: task.id, result: result }); } catch (e) { result.error e.toString(); console.error([${DEVICE_ID}] 任務(wù)執(zhí)行失敗:, e); sendMessageToServer({ type: task_result, deviceId: DEVICE_ID, taskId: task.id, result: result }); } finally { currentTask null; isRunning false; sendMessageToServer({ type: status, deviceId: DEVICE_ID, status: idle, message: 任務(wù)執(zhí)行完畢恢復(fù)空閑 }); } } // 6. 工具函數(shù) - 發(fā)送消息到服務(wù)器 function sendMessageToServer(data) { if (ws ws.readyState WebSocket.OPEN) { ws.send(JSON.stringify(data)); } else { console.warn([${DEVICE_ID}] WebSocket未連接消息發(fā)送失敗:, data); } } // 7. 初始化 connectWebSocket(); // 保持腳本運(yùn)行 setInterval(() {}, 1000);這個(gè)框架實(shí)現(xiàn)了設(shè)備注冊(cè)、心跳維持、任務(wù)接收與執(zhí)行、結(jié)果上報(bào)、斷線重連等云控客戶端必備的核心功能。你可以根據(jù)實(shí)際自動(dòng)化需求豐富executeTask函數(shù)中的邏輯。2.3 服務(wù)端Python代碼骨架Python端我們需要一個(gè)WebSocket服務(wù)器并管理所有連接的設(shè)備。這里選擇websockets庫和asyncio異步框架來實(shí)現(xiàn)以保證能同時(shí)處理大量設(shè)備連接。# 說明Python WebSocket 云控服務(wù)端核心代碼 # 文件名cloud_server.py import asyncio import json import logging from datetime import datetime from typing import Dict, Set import websockets # 配置日志 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) # 全局設(shè)備連接管理器 class DeviceManager: def __init__(self): # 存儲(chǔ) device_id - (websocket, last_heartbeat, status, current_task) self.connected_devices: Dict[str, dict] {} # 存儲(chǔ)待執(zhí)行的任務(wù)隊(duì)列 (device_id - task_list) self.task_queues: Dict[str, list] {} async def register_device(self, device_id: str, websocket): 注冊(cè)一個(gè)新設(shè)備 if device_id in self.connected_devices: logger.warning(f設(shè)備 {device_id} 已存在覆蓋舊連接) self.connected_devices[device_id] { ws: websocket, last_heartbeat: datetime.now(), status: idle, capabilities: [] } self.task_queues[device_id] [] logger.info(f設(shè)備注冊(cè)成功: {device_id}) # 發(fā)送歡迎消息或初始配置 welcome_msg { type: system, message: fDevice {device_id} connected successfully., timestamp: datetime.now().isoformat() } await self.send_to_device(device_id, welcome_msg) async def unregister_device(self, device_id: str): 設(shè)備斷開連接 if device_id in self.connected_devices: del self.connected_devices[device_id] if device_id in self.task_queues: del self.task_queues[device_id] logger.info(f設(shè)備斷開連接: {device_id}) async def update_device_status(self, device_id: str, status: str, **extra_info): 更新設(shè)備狀態(tài) if device_id in self.connected_devices: self.connected_devices[device_id][status] status self.connected_devices[device_id].update(extra_info) logger.debug(f設(shè)備 {device_id} 狀態(tài)更新為: {status}) async def send_to_device(self, device_id: str, message: dict): 向指定設(shè)備發(fā)送消息 if device_id in self.connected_devices: try: ws self.connected_devices[device_id][ws] await ws.send(json.dumps(message, ensure_asciiFalse)) except websockets.exceptions.ConnectionClosed: logger.error(f向設(shè)備 {device_id} 發(fā)送消息時(shí)連接已關(guān)閉) await self.unregister_device(device_id) else: logger.warning(f嘗試向未連接的設(shè)備發(fā)送消息: {device_id}) async def broadcast(self, message: dict, exclude_device_id: str None): 廣播消息給所有設(shè)備除指定設(shè)備外 tasks [] for did, info in self.connected_devices.items(): if did ! exclude_device_id: tasks.append(self.send_to_device(did, message)) if tasks: await asyncio.gather(*tasks, return_exceptionsTrue) def get_idle_devices(self): 獲取所有空閑設(shè)備 return [did for did, info in self.connected_devices.items() if info[status] idle] async def assign_task(self, device_id: str, task: dict): 向指定設(shè)備分配任務(wù) if device_id not in self.connected_devices: logger.error(f無法分配任務(wù)設(shè)備未連接: {device_id}) return False task_msg { type: task, task: task, assign_time: datetime.now().isoformat() } await self.send_to_device(device_id, task_msg) await self.update_device_status(device_id, busy, current_tasktask.get(id)) logger.info(f任務(wù) {task.get(id)} 已分配給設(shè)備 {device_id}) return True # 實(shí)例化設(shè)備管理器 device_manager DeviceManager() async def handle_device_connection(websocket, path): 處理每個(gè)設(shè)備的WebSocket連接 device_id None try: # 等待設(shè)備發(fā)送注冊(cè)消息 async for message in websocket: data json.loads(message) msg_type data.get(type) if msg_type register: # 設(shè)備注冊(cè) device_id data.get(deviceId) if not device_id: logger.error(收到注冊(cè)消息但缺少deviceId) await websocket.close() return await device_manager.register_device(device_id, websocket) capabilities data.get(capabilities, []) device_manager.connected_devices[device_id][capabilities] capabilities elif device_id: # 已注冊(cè)的設(shè)備 if msg_type status: # 更新設(shè)備狀態(tài) status data.get(status, unknown) await device_manager.update_device_status(device_id, status, last_reportdatetime.now()) elif msg_type task_result: # 處理任務(wù)結(jié)果 task_id data.get(taskId) result data.get(result, {}) logger.info(f收到設(shè)備 {device_id} 的任務(wù)結(jié)果任務(wù)ID: {task_id}, 成功: {result.get(success)}) # 這里可以將結(jié)果存入數(shù)據(jù)庫或進(jìn)行后續(xù)處理 # 例如save_to_database(device_id, task_id, result) # 任務(wù)完成更新設(shè)備狀態(tài)為空閑 await device_manager.update_device_status(device_id, idle, current_taskNone) elif msg_type pong: # 更新心跳時(shí)間 if device_id in device_manager.connected_devices: device_manager.connected_devices[device_id][last_heartbeat] datetime.now() elif msg_type log: # 處理設(shè)備發(fā)來的日志 log_content data.get(content, ) logger.info(f[Device {device_id} Log]: {log_content}) except websockets.exceptions.ConnectionClosed as e: logger.info(f設(shè)備連接正常關(guān)閉: {device_id}, code: {e.code}) except json.JSONDecodeError as e: logger.error(f消息JSON解析失敗: {e}) except Exception as e: logger.exception(f處理設(shè)備 {device_id} 連接時(shí)發(fā)生未預(yù)期錯(cuò)誤: {e}) finally: # 連接斷開清理資源 if device_id: await device_manager.unregister_device(device_id) async def heartbeat_checker(): 定時(shí)心跳檢查清理死連接 while True: await asyncio.sleep(60) # 每分鐘檢查一次 now datetime.now() dead_devices [] for device_id, info in device_manager.connected_devices.items(): last_beat info[last_heartbeat] if (now - last_beat).total_seconds() 120: # 超過120秒無心跳視為失聯(lián) dead_devices.append(device_id) logger.warning(f設(shè)備 {device_id} 心跳超時(shí)即將清理) for did in dead_devices: await device_manager.unregister_device(did) async def task_scheduler(): 簡單的任務(wù)調(diào)度器示例 while True: await asyncio.sleep(10) # 每10秒調(diào)度一次 idle_devices device_manager.get_idle_devices() # 這里模擬從數(shù)據(jù)庫或隊(duì)列中獲取任務(wù) # 實(shí)際應(yīng)用中你可以連接數(shù)據(jù)庫如Redis的任務(wù)隊(duì)列來獲取真實(shí)任務(wù) if idle_devices and some_condition_to_get_task(): # 假設(shè)的獲取任務(wù)條件 task { id: ftask_{datetime.now().strftime(%Y%m%d%H%M%S)}, name: 示例自動(dòng)化任務(wù), action: open_app, packageName: com.example.app, priority: 1 } # 簡單策略分配給第一個(gè)空閑設(shè)備 target_device idle_devices[0] await device_manager.assign_task(target_device, task) async def main(): 主函數(shù)啟動(dòng)服務(wù)器和后臺(tái)任務(wù) # 啟動(dòng)心跳檢查任務(wù) asyncio.create_task(heartbeat_checker()) # 啟動(dòng)任務(wù)調(diào)度器 asyncio.create_task(task_scheduler()) # 啟動(dòng)WebSocket服務(wù)器 server await websockets.serve( handle_device_connection, 0.0.0.0, # 監(jiān)聽所有網(wǎng)絡(luò)接口 8765, # 端口號(hào) ping_interval20, # 發(fā)送Ping間隔 ping_timeout40 # Ping超時(shí)時(shí)間 ) logger.info(云控WebSocket服務(wù)器啟動(dòng)在 ws://0.0.0.0:8765) await server.wait_closed() def some_condition_to_get_task(): 模擬獲取任務(wù)的條件實(shí)際應(yīng)替換為從數(shù)據(jù)庫/隊(duì)列檢查 # 這里可以連接數(shù)據(jù)庫查詢是否有待處理任務(wù) # 例如return redis_client.llen(pending_tasks) 0 return False # 默認(rèn)返回False不分配任務(wù)僅作示例 if __name__ __main__: asyncio.run(main())這個(gè)Python服務(wù)端代碼建立了一個(gè)異步的WebSocket服務(wù)器核心是DeviceManager類它負(fù)責(zé)管理所有在線設(shè)備的狀態(tài)、連接和任務(wù)隊(duì)列。heartbeat_checker和task_scheduler是兩個(gè)后臺(tái)協(xié)程分別負(fù)責(zé)連接健康檢查和簡單的任務(wù)調(diào)度。3. 關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)與避坑指南把框架搭起來只是第一步真正讓這套云控系統(tǒng)穩(wěn)定可靠地跑起來還需要注意很多細(xì)節(jié)。下面分享幾個(gè)我在實(shí)踐中踩過的坑和總結(jié)的經(jīng)驗(yàn)。3.1 網(wǎng)絡(luò)連接穩(wěn)定性斷線重連與心跳機(jī)制移動(dòng)網(wǎng)絡(luò)環(huán)境復(fù)雜Wi-Fi也可能不穩(wěn)定斷線是常態(tài)而非異常。我們的代碼必須能優(yōu)雅地處理斷線。設(shè)備端Autojs的重連策略上面的示例代碼中在on(close)和on(error)事件中都設(shè)置了重連。但這里有個(gè)細(xì)節(jié)不要立即重連。我最初設(shè)置斷線后立即重連結(jié)果在網(wǎng)絡(luò)閃斷時(shí)設(shè)備會(huì)瘋狂嘗試連接可能加劇服務(wù)器壓力。更好的做法是使用“指數(shù)退避”策略比如第一次斷線等2秒第二次等4秒第三次等8秒直到一個(gè)最大值比如60秒。服務(wù)端Python的心跳與清理僅靠WebSocket庫的ping_interval是不夠的。有些網(wǎng)絡(luò)中間設(shè)備如NAT網(wǎng)關(guān)會(huì)清理長時(shí)間無數(shù)據(jù)交互的連接。因此我們需要應(yīng)用層的心跳。設(shè)備端可以定時(shí)比如每30秒發(fā)送一個(gè){type: ping}的消息服務(wù)端收到后回復(fù)pong并更新last_heartbeat。heartbeat_checker協(xié)程定期檢查如果某個(gè)設(shè)備的last_heartbeat超過閾值如120秒就認(rèn)為它已失聯(lián)從device_manager中清理掉避免內(nèi)存泄漏和狀態(tài)不一致。連接標(biāo)識(shí)不要用websocket對(duì)象本身作為設(shè)備的唯一標(biāo)識(shí)。連接斷開重連后websocket對(duì)象是新的。必須使用設(shè)備自身上報(bào)的唯一ID如Android ID、IMEI或我們預(yù)先分配的設(shè)備碼。3.2 任務(wù)管理與狀態(tài)同步避免重復(fù)執(zhí)行與狀態(tài)丟失當(dāng)設(shè)備數(shù)量多、任務(wù)類型復(fù)雜時(shí)任務(wù)管理是關(guān)鍵。任務(wù)隊(duì)列化不要直接給設(shè)備發(fā)送任務(wù)。服務(wù)端應(yīng)該為每個(gè)設(shè)備或按設(shè)備分組維護(hù)一個(gè)任務(wù)隊(duì)列。當(dāng)設(shè)備空閑時(shí)從隊(duì)列頭部取出任務(wù)下發(fā)。這能應(yīng)對(duì)網(wǎng)絡(luò)波動(dòng)導(dǎo)致的任務(wù)丟失也方便實(shí)現(xiàn)優(yōu)先級(jí)調(diào)度。任務(wù)狀態(tài)持久化任務(wù)信息內(nèi)容、狀態(tài)、分配的設(shè)備、開始時(shí)間、結(jié)果等應(yīng)該存入數(shù)據(jù)庫如SQLite、MySQL或Redis。這樣即使Python服務(wù)重啟也能恢復(fù)任務(wù)狀態(tài)知道哪些任務(wù)已完成、哪些正在執(zhí)行、哪些失敗待重試。設(shè)備狀態(tài)同步設(shè)備執(zhí)行任務(wù)是一個(gè)過程可能耗時(shí)幾秒到幾分鐘。服務(wù)端需要知道設(shè)備當(dāng)前是“空閑”、“運(yùn)行中”還是“異?!?。設(shè)備在執(zhí)行任務(wù)開始、結(jié)束、發(fā)生關(guān)鍵步驟時(shí)都應(yīng)主動(dòng)上報(bào)狀態(tài)。服務(wù)端也要有超時(shí)機(jī)制如果一個(gè)任務(wù)分配后超過預(yù)期時(shí)間沒有收到完成或心跳報(bào)告則將其標(biāo)記為“疑似失敗”可以重新分配給其他設(shè)備。3.3 安全與認(rèn)證防止未經(jīng)授權(quán)的連接一個(gè)暴露在公網(wǎng)的WebSocket服務(wù)器是危險(xiǎn)的。必須加入簡單的認(rèn)證機(jī)制。連接時(shí)認(rèn)證可以在設(shè)備首次連接時(shí)要求其發(fā)送一個(gè)預(yù)共享的密鑰Token或進(jìn)行簡單的挑戰(zhàn)-應(yīng)答。修改設(shè)備端代碼在register消息中加入簽名或Token。// Autojs端 const DEVICE_TOKEN 你的設(shè)備預(yù)置Token; // 可以寫死在腳本里或從安全的地方讀取 // 在register消息中加入 sendMessageToServer({ type: register, deviceId: DEVICE_ID, token: DEVICE_TOKEN, // ... 其他字段 });# Python服務(wù)端 VALID_TOKENS {device_token_1, device_token_2} # 應(yīng)從數(shù)據(jù)庫或配置讀取 async def handle_device_connection(websocket, path): # ... if msg_type register: token data.get(token) if token not in VALID_TOKENS: logger.warning(f設(shè)備認(rèn)證失敗Token無效: {token}) await websocket.close(code4001, reasonUnauthorized) return # 認(rèn)證通過繼續(xù)注冊(cè)流程...數(shù)據(jù)加密可選對(duì)于敏感指令或回傳數(shù)據(jù)可以考慮在應(yīng)用層對(duì)消息體進(jìn)行對(duì)稱加密如AES。但這會(huì)增加兩端代碼的復(fù)雜性需權(quán)衡安全需求和性能開銷。3.4 性能與擴(kuò)展性當(dāng)設(shè)備量增長時(shí)初期可能只有幾臺(tái)設(shè)備但當(dāng)規(guī)模擴(kuò)大到幾十上百臺(tái)時(shí)架構(gòu)就需要調(diào)整。異步框架的選擇我們用了asynciowebsockets這是Python中處理高并發(fā)I/O的推薦方式性能比多線程模式好很多。確保你的任務(wù)處理邏輯如executeTask中的具體操作也是非阻塞的或者將其放入線程池執(zhí)行避免阻塞事件循環(huán)。服務(wù)端資源單機(jī)Python進(jìn)程能承載的連接數(shù)有限取決于系統(tǒng)資源。當(dāng)連接數(shù)過多例如上千時(shí)需要考慮水平擴(kuò)展。可以引入連接網(wǎng)關(guān)如用Nginx做WebSocket代理和負(fù)載均衡后面部署多個(gè)Python服務(wù)實(shí)例。這時(shí)設(shè)備管理器的狀態(tài)就需要外置到共享存儲(chǔ)如Redis中以便多個(gè)實(shí)例同步設(shè)備狀態(tài)。消息格式優(yōu)化WebSocket消息使用JSON很方便但文本格式有冗余。如果消息非常頻繁或體積大可以考慮使用二進(jìn)制協(xié)議如MessagePack來序列化數(shù)據(jù)能顯著減少帶寬占用和解析開銷。4. 一個(gè)完整的實(shí)戰(zhàn)案例模擬社交媒體點(diǎn)贊任務(wù)為了把上面的理論具體化我們?cè)O(shè)計(jì)一個(gè)簡單的實(shí)戰(zhàn)場景用10臺(tái)安卓設(shè)備自動(dòng)為某個(gè)社交媒體App的指定帖子批量點(diǎn)贊。4.1 任務(wù)定義與下發(fā)Python服務(wù)端從數(shù)據(jù)庫讀取一批待點(diǎn)贊的帖子ID生成任務(wù)。每個(gè)任務(wù)包含{ id: like_task_001, action: like_post, target_app: com.social.media, post_id: 1234567890, max_retry: 3 }服務(wù)端的調(diào)度器發(fā)現(xiàn)有空閑設(shè)備就將任務(wù)放入該設(shè)備的任務(wù)隊(duì)列并下發(fā)。4.2 設(shè)備端任務(wù)執(zhí)行Autojs設(shè)備收到任務(wù)后executeTask函數(shù)被觸發(fā)function executeTask(task) { if (task.action like_post) { // 1. 確保屏幕點(diǎn)亮和解鎖實(shí)際項(xiàng)目需更健壯的判斷 device.wakeUp(); sleep(500); // 2. 啟動(dòng)目標(biāo)App launch(task.target_app); sleep(3000); // 等待App啟動(dòng) // 3. 模擬操作進(jìn)入目標(biāo)帖子這里簡化實(shí)際需根據(jù)UI布局定位 // 假設(shè)通過搜索或直接打開鏈接進(jìn)入帖子詳情頁 // click(搜索框); input(帖子ID); click(搜索按鈕); sleep(2000); // click(帖子條目); sleep(2000); // 4. 尋找點(diǎn)贊按鈕并點(diǎn)擊這里需要真實(shí)的UI選擇器 let likeButton id(like_button).findOne(5000); if (likeButton) { likeButton.click(); console.log(已對(duì)帖子 ${task.post_id} 執(zhí)行點(diǎn)贊); // 5. 截圖作為執(zhí)行憑證可選 let screenshot captureScreen(); let base64Img images.toBase64(screenshot, png, 50); return { success: true, data: { post_id: task.post_id, screenshot: base64Img, timestamp: new Date().toISOString() } }; } else { return { success: false, error: 未找到點(diǎn)贊按鈕 }; } // 6. 返回App主頁或退出為下一個(gè)任務(wù)準(zhǔn)備 // back(); } }執(zhí)行成功后設(shè)備將結(jié)果封裝成task_result消息發(fā)回服務(wù)器。4.3 服務(wù)端結(jié)果處理與持久化Python服務(wù)端收到task_result后不僅更新設(shè)備狀態(tài)更重要的是將結(jié)果記錄到數(shù)據(jù)庫。# 在handle_device_connection的task_result處理部分補(bǔ)充 async def handle_device_connection(websocket, path): # ... 省略其他代碼 ... elif msg_type task_result: task_id data.get(taskId) result data.get(result, {}) # 1. 更新任務(wù)狀態(tài)為完成或失敗 await update_task_in_db(task_id, statuscompleted, resultresult) # 2. 記錄設(shè)備活動(dòng)日志 await log_device_activity(device_id, f完成任務(wù) {task_id}, 結(jié)果: {result.get(success)}) # 3. 如果任務(wù)失敗且重試次數(shù)未超限可以重新放入隊(duì)列 if not result.get(success) and task_retry_count(task_id) MAX_RETRY: await requeue_task(task_id) logger.info(f任務(wù) {task_id} 處理完畢。)這樣我們就完成了一個(gè)從任務(wù)創(chuàng)建、下發(fā)、執(zhí)行到結(jié)果回收的完整閉環(huán)。通過Python后臺(tái)我們可以清晰地看到所有設(shè)備的實(shí)時(shí)狀態(tài)、任務(wù)執(zhí)行進(jìn)度和成功率實(shí)現(xiàn)了基本的云控能力。5. 進(jìn)階思路與擴(kuò)展方向基礎(chǔ)云控跑通后可以根據(jù)實(shí)際需求向不同方向深化5.1 任務(wù)編排與工作流簡單的單個(gè)任務(wù)如點(diǎn)贊不夠用??梢栽O(shè)計(jì)“工作流”任務(wù)包含多個(gè)步驟。例如“打開App A - 搜索關(guān)鍵詞 - 截圖 - 返回主頁 - 打開App B - 發(fā)布內(nèi)容”。這需要在任務(wù)定義中支持步驟列表設(shè)備端按順序執(zhí)行并在每個(gè)步驟后向服務(wù)器報(bào)告進(jìn)度。5.2 設(shè)備分組與策略調(diào)度不是所有設(shè)備都一樣。有的設(shè)備性能好有的安裝了特定App??梢栽谠O(shè)備注冊(cè)時(shí)上報(bào)更詳細(xì)的能力和屬性如系統(tǒng)版本、屏幕分辨率、已安裝App列表。服務(wù)端根據(jù)任務(wù)要求將任務(wù)智能分配給最合適的設(shè)備組。例如一個(gè)需要高版本Android才能運(yùn)行的任務(wù)只會(huì)分配給系統(tǒng)版本符合的設(shè)備。5.3 引入消息隊(duì)列如Redis解耦當(dāng)任務(wù)量巨大時(shí)直接在Python內(nèi)存中管理隊(duì)列可能不夠可靠??梢砸隦edis作為消息中間件。Python服務(wù)端將任務(wù)推入Redis的List或Stream獨(dú)立的“調(diào)度器”服務(wù)從Redis消費(fèi)任務(wù)再通過WebSocket分配給設(shè)備。這樣實(shí)現(xiàn)了生產(chǎn)生成任務(wù)、消費(fèi)調(diào)度分配、執(zhí)行設(shè)備的完全解耦系統(tǒng)擴(kuò)展性更強(qiáng)。5.4 豐富的監(jiān)控與管理界面純命令行日志難以監(jiān)控上百臺(tái)設(shè)備。可以用Python的Web框架如FastAPI、Flask快速搭建一個(gè)管理后臺(tái)提供Web界面。實(shí)時(shí)展示設(shè)備在線狀態(tài)、CPU/內(nèi)存使用率需設(shè)備端上報(bào)、任務(wù)隊(duì)列情況、執(zhí)行日志搜索、手動(dòng)下發(fā)任務(wù)等功能。這會(huì)讓整個(gè)云控系統(tǒng)的易用性提升一個(gè)檔次。5.5 腳本的遠(yuǎn)程更新與熱加載當(dāng)需要修改Autojs端的業(yè)務(wù)邏輯時(shí)逐臺(tái)設(shè)備去更新腳本是噩夢??梢詫?shí)現(xiàn)一個(gè)“腳本管理”功能。服務(wù)端可以下發(fā)一個(gè)特殊的“更新腳本”任務(wù)包含新腳本的下載地址或代碼內(nèi)容。設(shè)備端收到后下載并替換本地的執(zhí)行腳本然后重啟自動(dòng)化服務(wù)或動(dòng)態(tài)加載新腳本。這樣就實(shí)現(xiàn)了所有設(shè)備的集中式腳本更新。這套“Python AutojsPro7”的云控方案其魅力在于極高的靈活性。Python負(fù)責(zé)復(fù)雜的調(diào)度、管理和數(shù)據(jù)聚合Autojs負(fù)責(zé)在移動(dòng)端執(zhí)行精準(zhǔn)的UI自動(dòng)化。兩者通過WebSocket這個(gè)輕量級(jí)的橋梁結(jié)合讓你能用熟悉的Python生態(tài)去駕馭大量的安卓自動(dòng)化設(shè)備。當(dāng)然真正投入到生產(chǎn)環(huán)境還需要在異常處理、日志收集、安全加固等方面做大量工作。希望這個(gè)分享能為你打開一扇門剩下的精彩就靠你在自己的項(xiàng)目中去探索和實(shí)現(xiàn)了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
三人荫蒂添的好舒服A片| www.激情.com.| 人与禽A片啪啪| 99热主页日本| 激情五月激情综合网| 91人人操人人| AA片在线观看视频在线播放| 欧美爆乳一区二区三区| 亚洲性视频| 婷婷五月电影院| 丁香六月婷婷久久高清| 亚洲中文字幕在线观看| 婷婷五月激情丁香| 久久五月天大美女| 九九色插| 激情综合网五月天| www夜夜操wwwcon| 色啪久| 午夜激情五月天| 五月丁香六月婷婷久久| 91操人| 色五月天中文字幕| 久久超视频| 超碰99在线观看| 五月天婷婷xxx| 99热18| 久久婷婷婷婷伊人| 欧美99热| 99热99免费| 亚洲中字AV电影在线网站| 久热网站| 日本五月婷婷久久久六月丁香| 成人网在线视频| 五月丁香久久久| 九九热在线视频| 91 九色 熟女| 五月丁香婷婷99| 97啪啪| 岛国资源网| 色婷婷91激情小说| 亚洲无AV在线中文字幕| 亚洲另类电影| 99精品热视频| 久久五月婷婷丁香| 天天日天天草| www.五月天婷婷| 好好干av| 日韩成人网站精品久久大全| 91精品国产91久久久久青草| 丁香五月网| 久噜久噜| 色色色欧美| www.91五月| 欧美25p| 狠狠做婷婷| 五月婷婷六月丁香综合视频在线| 久久五月丁香六月婷| 综合久久综合五月天婷婷| 五月丁香婷爱在线| www.日本91| 狠狠色无码| 超碰99资源站| 色五月婷婷中文字幕| 成人网在线视频| 日本久久超碰| 99这里精品| 婷婷五月色惰| 婷婷丁香五月天婷婷| 丁香六月婷婷综合激情欧美| 综合久色五月| 久久99热这里只有精品| 久久亚洲婷婷| 九九热这里只有精品9| 色播激情婷婷| 色婷丁香| 五月丁香激情六月| 99热这里只有精品50| 欧美成人网婷婷综合在线| 538久久| 亭亭五月激情亚洲在线| 国产成人VA| 婷婷色5月天在线。| 大香蕉久| 秋霞少妇AV网站| 天天插天天爽| 热思思九九| 五月天婷婷色色| 丁香五月AV| www色色色com| 婷婷五月天国产性感美女演员久久久久| 99热这里只有精品66| 99这里有精品| 91久久综合亚洲噜噜成人在线| 久久99精品九九久久久婷婷| 九九精品视频在线观看| 五月丁香六月在线| 日91高清无玛| 五月激情视频| www.com五月天| 99热这里只有精品国产首页| 色综合色综合网| 日日天天干| 无码AV久久久久久久久| 9|在线观看视频| 中文字幕不卡网站| 丁香五月日啪| 久热九九| 91热久| 很很色丁香久久停停| 五月婷婷九九久久| 国产乱妇乱子伦| 婷婷永久在线| 国产精品国产| 欧洲区自拍| 青青草五月天| 九九AV在线| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 九九色情网五月天| 另类激情五月| 免费无码毛片一区二区A片| 婷婷丁香五月天熟女丝袜| 99精品国产热久久91色欲| 国产真人做爰视频免费| 在线国产精品色| 99开心五月五月丁香激情| 婷婷激情丁香五月婷婷激情丁香五月婷婷| 99re这里只有精品在线观看| 色五月婷婷五月天| 91狠狠色丁香| 亚洲天堂色色| 天堂无码人妻精品AV一区| 久久久大香蕉| 97久久久| 99亚色色色| 69热91天堂| 国产综合丁香五月天| 国产阿姨日皮艹逼内射视频| 超碰不卡在线| 99精品97| 亚洲综合无码| 免费操超碰| Va另类视频| 六月综合婷婷开心伊人| 99久re热视频精品98| 五月天婷婷综合| 色偷偷五月天| 色爱综合视频| 国产日产亚系列精品版优势| 激情五月天色爱| 色五月首页| 色综合综合色| 99re热视频这里只精品| 日韩欧美成人片| 五月丁激情| 亚欧州精品视频| 色五月综合97| 国产免费一区二区三区三州老师F1F1.CC| 99re热视频这里只有综合亚洲| 日韩无码人妻一区二区三区综合| 人人人操 超碰| 丁香六月激情综合网| 五月天com| 久9视频| 五月色婷婷中文字幕| 国产综合婷婷| 九九99九九99| 五月丁香操婷逼| 丁香六月久久| 天天插天天日天天爽| 少妇性按摩无码中文A片| 久久亚洲精品成人无码网站导航| 成人中文网| 开心五月婷婷在线视频免费观看| 日本在线观看91| 狠狠插狠狠操| 五月婷婷色播视频| 狠狠色综合图片| 夜夜干天天干| 毛v一区二区视频| 夜夜操狠狠操天天操| 五月婷婷 激情按摩| www,五月天激情| 丁香婷婷五月激情四射网| 久久这里有精品在线观看| 婷婷丁香五月社区亚洲| 影音先锋一区| 婷婷五月天网| 九九热精品视频| 欧洲电影在线观看免费版英语版| AV操操操| 2025最新亚洲激情在线| 色九九丁香九月色九九色| 亚洲色热| 第一区久久网站| 久9热在线免费观看| 日本狠狠干| 97人人看一| 五月婷六月| 五月天大香蕉婷| 五月天激情综合| 开心婷婷五月天综合| 婷婷中文字幕| 狠狠色丁香婷婷久久综合| 日本三级大片| 美欧成人视频| 伊人爱爱日本| 色婷婷丁香五月| 激情色情五月天| 五月天综合久久丁香91| 久久久91精品| 99热这里只有精品8| 79色色| 超碰在线人妻| 婷婷丁香色情| 97久久香草精品视频| 久草网大香视频| 五月激情小说| 在线播放成人网站| 丁香五月成人网| 天天色综合色| 久久久人妻不卡| 色在线免费观看| 色五月综合在线| 噜噜网免费视频| 天天天久久久| 日本人妻A片成人免费看片| 丁香六月综合| 最新婷婷五月丁香| 三级黄色大片视频| 亚洲亚洲人成综合网络| 日本天天操| 六月丁香网| 天天天天天操| 思思久ren热| 亚洲 在线 另类| 婷婷六月啪啪| 婷婷综合五月色播| www,五月丁,com| 午夜爱插插| 国产特级毛片AAAAAAA高清| 色色色综合网| 久久99精品久久久久久三级| www.com五月天| 热99久久这里只有精品| 色亚洲中文| 99热在线精品观看| 亚洲视频在线网| 久久99国产综合精品免费| 久久婷婷亚洲| 天天爱天天爽| 91avse| 久色大| 激情五月综合网最新| 丁香六月婷月91婷月| 亚洲色图45p| 影音先锋偷偷色男人站| 激情啪啪五月| 97久久视频| 99男人天堂| 操逼巨乳91| 99啪啪骑| 久久视频婷婷视频| 色婷丁香五月| 激情五月天婷婷图| 这里只有视频精品| 四虎婷婷五月天| 婷婷六月爽| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 激情五月亚洲综合网| 99激| 丁香五月激情在线| AA久久| 五月婷婷三级| 五月婷在线| 欧美丰满熟妇BBB久久久| 婷婷爱五月| 久久精品99国产精品日本| 性生生活大片又黄又| 国产又黄又爽又色的免费| 少妇被下春药玩弄A片| 91人久| 五月婷无码| 丁香五月手机视频| 亚洲国产精品五月天| 久久亚洲色导航| 婷婷区日本| 亚洲性图一区二区| 91久久五月天| 天天搽天天射| 色五月婷婷久久大| 久九色| 99热精品无码| 激情五月天.色网| 草草影院爱爱| 亚洲色五月天是什么| 五月欧美色色五月| 影音先锋一区二区三区| 成人草榴视频| 亚洲激情在线| 狠狠做深爱婷婷久久综合一区| 欧美性色视频| 欧美日韩精品人妻狠狠躁免费视频| 中文字幕AV网址| 99操视频| 31色区视频免费看| 玖玖视频福利| 这里只有精品视频免费在线观看| 久久久噜噜噜久久人妻| 日本三日本三级少妇三级66| 玖月婷婷爱丁香| 天天精品视频在线观看视频| 51国精产品自偷自偷综合| 色墦五月丁香| 午夜精品久久久久久久爽| 狠狠爱婷婷色| 天天日,夜夜爽| 天天干,夜夜爽| www.激情| 99操久久| 色激情五月| 日本天天操| 婷婷久久婷婷| 99热只有精| 天天插综合| 亭亭五月丁香五月天激情| 日本成人内射| 思思色综合网站| 色射影院| 超碰无码318604| 六月丁香五月激情网| 五月香婷婷| 日韩无码专区| 亚洲色色在线| 精品久热| 大香蕉伊人99| 日本系列_4页_777FP| 狠狠色 综合色区| 色婷婷五月影院| http://www.lingjunshare.com/ | 大香蕉五月天| 97热久久五月婷婷| 人人色婷婷| 日韩在线观看网址| www.com操| 婷婷五月天AV| 噜噜干日本| 26uuu国产| 99九九这里有免费视频| 狠狠操天天日| 国产精品电| 婷婷久久婷婷色五月| 五月婷网| 精品思思久久| 99爱视频| 婷婷久久五月天亚洲欧美国产日韩在线观看| 五月婷婷色综图片| 欧美精品999| 99超级碰碰| 五月婷中文娱乐综合| 久久婷婷亚洲五月天| 国产成人一区二区三区在线观看 | 开心五月六月婷婷| 国产精品大香蕉| 亚洲第一黄网| 91久久久久久久久| 九九热在线视频观看| 综合久久9| 色99色| 久久一级片| 久久99热在线观看| 美欧日韩国产成人在战| 开心激情网五月天| 丁香五月激情欧欧美| 日本99视频| 五月丁香婷婷综合在线| 六月婷婷综合网2| 丁香五月第四色88| 久久超视频| 久久激情五月天| 婷婷99中文字幕| 99热老网站| 天天肏视频| 五月天com| 99re思思精品视频在线观看| 丁香五月婷婷影视先锋| 丁香五月综合激情性爱| xxxx五月| 激情五月天婷婷丁香| 五月天综合在线观看视频| 婷婷情色五月天| 大香蕉啪啪啪| 久久九九在线视频| 五月丁香啪啪综合网| 这里只有精品在线观看视频| 丁香激激情网| 婷婷爱爱蜜臀天天操| 思思热视频在线| 伊人久久婷婷五月天激情四射| 亚洲成AV人片在线观看| 婷婷99狠狠躁天天躁中| 色综合久久88色综合天天人守婷| 五月亭久久无码视频| 五月色色网| 色色永久| 香蕉久久六月| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 激婷网| www.五月天婷婷| 五月丁香综合网色欲| 大香蕉 婷婷| 欧美啪啪9| 天天拍天天做视频| 无码髙清| 丁香婷婷激情网站| 天天爽天天操| 欧美日韩成人一区二区| 色丁香婷婷美女视频网站| 2015WWW永久免费观看播放| 狠狠干婷婷| 婷婷五月激情天| 99热最新地址在线| 五月婷婷日本| 久久3级片| 亚州色色色| 99性爱视频网站| 99热这里只有精品26| 五月综合激情网| 日韩AV大全| 天天爽综合网| 天天草婷婷五月| 久大香蕉| 国产五月天欧美色| 很很干在线视频| 综合久久影院| 五月婷久久草| 丁香五月婷婷亚洲激情四射| 国产jd1024基地手机看国产| 日本九九九九| 超碰在线看| 色五月六月| 亚洲婷婷婷| 欧美性二区| 久久9热| 激情五月婷婷视频| 婷婷五月花| 九色婷婷| 超碰AV在线| 婷婷丁香五月激情| 99色最新在线视频网站| 五月天激情美女久久| 色色色99韩| 亚洲人妻AV| 超级碰碰碰碰视频| 丁香五月天婷婷91| 九月av在线| 成人性生活免费观看。| 亚洲AV日韩在线观看| 曰韩少妇内射免费播放| 无码99| 开心激情网五月天| 天天干天天干天天干| 五月天综合久久| 91青娱乐青青草| 五月天婷婷7米| 四色五月婷婷| 99热午夜精品| 九九成年视频| 综合久久99| 激情综合五月婷婷| 疯狂做受XXXX高潮A片动画| 五月丁香婷婷欧美| 亚洲无AV在线中文字幕| 99综合五月免费视频色婷婷| 婷婷综合在线网| 色五月色综合| 五月天婷婷涩涩| 丁香六月婷婷社区| 丁香六月久久| 色色色综合视频| 丁香 婷婷五月| 天天爱天天做综合| 综合图区激情| 五月天另类激情在线| 免费观看大片视频 丁香婷婷 六月欧美| 色五婷婷开心缴| 俺去也综合| 亚洲乱码w在线观看| 久久3p| 五月天婷婷av| 9久热精品在线视频| 国产精品久久久久久妇女6080| 亚洲九九在线| 青青草五月天| 色色色com| 熟女人妻一区二区三区免费看 | 五月天婷婷久久| 人与禽A片啪啪| 潘金莲AAAAAAAAAA| 91色综合网| 开心婷婷五月激情网小说| 五月丁香网中文字幕| 激情小说 五月天| 久久久妻人人人| 狠狠狠狠狠狠狠狠草| 婷婷开心五月| 日本婷婷| 热婷婷在线视频| 青青草原亚洲天堂| 五月婷婷伊人在线| 色五月综合网| 99爱在线| 天天综合激情| 少妇性按摩无码中文A片| 国产午夜一区二区三区| 9 7总站超级碰免费视频| 欧洲亚洲午夜| www,婷婷五月天,com| 天天综合色丁香| 天天爱天天做天天操| 182tv992tv人之初午夜免费观看| 99色婷婷视频| 99久在线精品99re8热| 五月丁香777| www.婷婷久久五月天| 7超碰自拍| 五月丁香九九九综合| 啪啪综合| 五月激情综合婷婷| site:esunnet.com| 丁香五月婷婷亚洲综合精品| 老司机视频lsj爱就色| 婷婷99视频精品| 五月婷婷丁香色吧网| 97人人射| 97丁香五月| 99热99这里有免费的精品| 99久在线| 99热99操| 婷婷五月天中文字幕| 激情五月综合| 激情AV| 深爱激清网| 99国产精品白浆在线观看免费| 五月婷久久草| 深爱激情综合网| 中字幕视频在线永久在线观看免费| 99色五月| 人人草人人爱| 婷婷九月丁香中文| 热99热9| 丰满老熟妇BBBBB搡BBB| 激情美女五月天| 97精品在线| 国产精品视频网| 婷婷综合六| 国产毛多水多女人A片| 97人人射| 欧美日韩一区二区三区四区| 五月婷在线影院| 色天五月天在线观看视频| 亚洲无码影音| 天天日天天做天天操| 亚洲精品一区无码A片| 亭亭丁香aV| 中文字幕 码精品视频网站| 丁香五月婷婷亚洲色图| 激情五月天色播| 天堂在线婷婷| 青青草成人网| 日韩在线观看亚洲| 91凹凸在线| 熟女啪啪视频| 久久婷婷激情| 99热99网| 这里有精品| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 综合久久高清| 色屌丝中文字幕| 九九色色| 免费无码毛片一区二区A片| 日本在线视频手机播放五月婷| 狠狠做婷婷| 激情婷婷五月女| 九九成人| 五月丁香AV在线| www.9色色色| 99re思思热久久| 丁香五月性爱爱五月| 色色色婷婷| WWW.婷婷五月天.COM| 啪啪啪综合网| 玖操97| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 操碰99| 精品99这里有| 色婷婷丁香花五月天| 婷婷丁香综合成人| 999激情视频| 五月丁香六月欧美综合网站| 丁香五月人妻熟女| 1区2区视频| 久久五月天婷婷| 激情WWW| 亚洲欧美国产A片免费观看| 色综合网页| 九九热经典视频在线观看| 亚洲精品网址| www.yw尤物| 69色色视频| 久久艹99| 嫩草极品| 日本色图综合| 六月色色婷婷| 久久新地址| 草草女人亚洲| 99热主页日本| 丁香婷婷啪啪啪| pom538精品视频| 五月色综合| 国产色色色色| 欧美日韩婷婷五月天| 婷婷丁香亚洲色综合91| 五月四色色| 五月停停999| 最近免费中文字幕大全高清大全1| 久久婷婷视频| 日日撸天天干| 五月丁香香蕉| 欧美婷婷综合网| 五月天伊人| 五月成人网站| 五月的婷婷六月丁香| 一区三区视频有限公司| 精品一二三区久久AAA片| 激情丁香五月| 色情五月天婷婷| 操人91| AV网在线观看| 大地资源色婷婷视频在线| 亚洲秘 无码一区二区三区妃光/1| 婷婷五月天成人动漫 | 五丁香激情综合| 思思99久久| 丁香五月停停av| 久久香蕉网| 超碰日日操| 嫩草AV久久伊人妇女超级a| WWW,五月天| 丁香五月婷婷激情四射| 色五月色情| 九八Av| 另类视频五月天| 九九 激情 网| 五月天色区| 17.c黄色| 战争与艾拉电影免费观看| 这里只有精品99视频| 另类激情综合| 秋霞A V毛片| 神马欧美精| 操碰99在线视频观看| 成人网在线观看视频| 久久9视频| 色婷婷影院| AV在线中文| 亚洲无码yw| 五月天天天天天天天天天天天婷婷婷| 六月合五月婷| 久久ab| www天天爽| 婷婷色网站| 五月天激情婷婷丁香| 开心四月婷婷在线色播播| 99精品热视频只有精品10| 婷婷久久大香蕉| 久久五月丁香婷婷| 香蕉久久国产AV一区二区| 无码人妻电影| 色播五月婷婷| 深爱激情网五月| 婷婷色色综合激情| 天天操夜夜玩!| 综合五月天天天天天五月| 婷婷五月天性| 狠狠xx| 五月天婷婷激情在线色图| 五月综合婷婷五月| 婷婷色操| 另类小说五月天| 色99在线观看| 极品人妻VIDEOSSS人妻| 狠狠一日| 综合激情专区| 在线日韩视频| 无码中文一区二区三区| 久久九九99亚洲国产久精综合| 日日日影院| 婷婷五月综合视频免费播放| 99热8| 亚洲区视频| 亚洲黄色影视| 狠狠色综合图片| 淫荡A片| 久久网日本| 激情六月五月婷婷综合网| 五月天婷婷影院影院| xxx.色婷婷| 996er热| 大香蕉九九| 久综合4| 九九99热久久精品66中文字幕| 影音先锋四区| 五月婷婷伊人网| 亚洲热久久| 日本三级韩三级99久久| 亚洲亚洲人成综合网络| 色 五月 天 婷婷 丁香 九月| 99日本黄站| 少妇久久诱惑视频| 啪啪操超碰| 亚洲精品一区中文字幕乱码| 99视频极品在线香蕉| 99精品自拍视频| 成人婷婷五月| 丁香五月婷婷啪| 国产成人综合亚洲| 91一起艹| 欧美婷婷五月丁香| aaa9区免费在线观看| 秋霞电影一级黄| 五月婷婷免费看| 日本色色色| 高清av在线国产| 欧洲99视频在线| 曰日爽日日操| 另类视频在线| 日韩av在线免费观看| 九九婷婷五月天影视| 丁香激情四射| 国内熟女黄色系列| 色色色色色色色综合| www,com,五月色色| 丁香五月婷婷总啪啪| 九九热这里有精品视频| 狠狠干综合| 五月婷婷亚洲天堂97色婷婷| 青草青草久热这里只有精品| 欧美婷婷成人| 成人五月丁香花| 他改变了拜占庭| 99色视频| 另类图片五月天激情| 色播播之激情五月婷婷| 色色五月婷| 色欧美日| 色五月婷婷色五月| 亚洲12p| 婷婷丁香人妻天久久| 激情小说五月天| 国产亚洲成人综合| 五月婷婷激情中心| 三年高清大片免费观看国语| 伊人五月天综合网| 色域五月婷婷丁香| 99视频在线观看网址| 色五婷婷| 99丁香五月| 激情综合激情五月| 狠狠综合网| 综合狠狠伊人| 夜夜爱网站| 99ri视频| 深爱五月激情五月| 超碰99在线观看| 大香蕉婷婷五月天| 亚洲天堂爱爱| 丝袜人妻| 伊人干综合| 综合色色婷婷| 色综合激情| 五月丁香香蕉| 亚洲综合激情五月久久| 亚州色色色| 99成人网一区| 96丁香六月婷婷蜜桃综合久久| 九九激情网| 99热这里只有精品青草| 天堂婷婷五月在线| 九九热视频在线观看| 久久狠色噜噜狠狠狠狠97| 99精品视频在线观看| 99久久九九| 一起草av| 丁香五月激情啪啪| 日批在线看| 91九色白丝| 综合久久人妻| 色婷婷超碰| 日本综合色图| 色婷婷五月丁香在线观看| 国产成人精品123区免费视频| 无码激情精品色婷婷久久久久| 天天碰夜夜操| 久久人妻乱| 久久婷狠狠色| AV性爱在线| 六月丁香深深爱| 91九九热| 97资源欧美日韩大香蕉超碰一区| 久婷婷| 思思久久99热只有频精品66| 淫荡综合网| 亚洲视频国产一区| 婷婷伊人五月天| 一本久久亚洲五月婷婷| 久久久色情| 天天肏视频| 五月天堂婷婷| 亚洲另类AV| 五月综合久久| 久久机热思思热| 99热1| 成人国产欧美大片一区| 99这里只有精品视频| 91九色精品女同系列| 欧美大片免费播放器| 色婷婷久久综合丁香五月| 天天干天天曰天天射| 亚洲操逼网| 久久er99| 色色色777| 狠狠爱婷婷五月天| 九九色综合| 五月丁香婷婷综合网色欲| 五月丁香六月成人| 黄色片久久| 婷婷午夜精品久久久| 五月激情婷婷六月丁香| 碰碰人人漕| 日韩三级片一区二区| 激情五月天第四色| 99热在线观看免费精品| 婷婷色五月天在线| 激情文学天天| 99热销国产这里有精品| 久久精品国产一区二区三区四区| 色婷五月天| 亚洲十月婷婷综合| 久久ww| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 久久只这里有精品| 日本久久婷| 一本狠婷婷综合| 狠狠操狠狠爱| 九九综合伊人| 欧美成人色婷婷| 婷婷激情蜜桃玖玖丁香| 任你爽视频| 久99精品视频| 久久综合站| 欧美大肥婆大肥BBBBB| 丁香久久综合| 开心五月深爱婷婷| 日韩一区二区三区无码| 九九99免费理论| 99ri国产精品| 婷婷五月天久草在线| 色五月 五月婷婷| 99九九视频| 亚洲va欧洲va国产va不卡| 婷婷六月婷婷| 色婷婷五月天亚洲| 一逼色综合| 三级毛片7979| 热99一二三| 91热久88| 人妻第九页| 男女啪啪做爰高潮无遮挡| 激情五月天综合| 97干网站| 久久999久久999久久999久久| ss视频xx91| 亚洲第精品| 激情网 五月天| 色五月开心婷婷| 无码色色色色色| 六月丁香av| 9热视频在线观看| 天天综合色丁香| 一二区成人电影| 久久综合五月| 99热这里只有在线| 都市激情五月婷婷亚洲| 青青草原福利在线| 九色色| 婷婷五月六月激情| 日日夜夜小色哥| www,av好吊操| 五月婷婷丁香在线| 亚洲免费婷婷| 99精品视频免费观看| AV人人操| 欧美99视频| 中文字幕av久久爽一区| 色五月婷婷中文字幕| 99色亚洲| 99精品在线观看| 久久精品一区二区三区四区| 香蕉97碰碰碰欧美| 亚洲av另类在线观看| 31色区视频免费看| 丁香六月婷婷综合啪啪| 久久综合丁香| 日本精品在线噜噜噜| 丁香五月综合久久八| 色五月开心五月激情五月| 综合五月亭亭9| 精品皮股午夜AV| 开心婷婷丁香五月| 丁香五月欧美成人| 99热亚洲| 99精品久久久久久久久| 中文久久婷婷| 超碰在线成人| 色天天久婷婷| 韩国天天婷婷| 九九综合| 亚洲乱码日产精品BD| 99亚洲精品综合在线| www.久久9| 操碰91| 激情www.98com| 26uuu最新地址| 亚洲色碰| 国产AV一区二区三区日韩| 影院久久久| 亚洲永久免费| 色五月丁香在线| 激情99| 五月婷婷激情综合| 亚洲成人精品三区| 婷婷五月色情天| 丁香5月啪啪| 亚洲一区二区无遮挡A片| 伊人婷婷五月天| 亚洲黄网在线| 91超碰人人操| 久热精品视频| 丁香六月啪啪| 丁香五月激情综合久久| 丁香五月中文字幕| 天天天摸夜夜夜玩| 一区二区三区视频| 懂色av粉嫩AV蜜臀AV| 色情五月综合婷婷| 五月婷婷伊人在线| 五月丁香狠狠爱| 丁香九月色| 性爱AV天堂| 五月丁香婷婷AV| 激情婷婷| 九九热99免费视频| 亚洲噜色| 婷婷丁香六月天| 亚洲色五月婷婷| 激情欧美婷五月| √天堂资源在线人妻熟女| 色吧婷婷五月亚洲| 欧美色婷婷| 天天舔天天操| 99年操人人爽| 亚洲国产精品成人免费一区久久久在线观看AAAA | 激情六月婷婷| www,26uuu,c0m,色情| 97人人草| 国产熟女一区二区三区五月婷| 婷婷五月视频| 第四色在线观看| 成人在线网| 人人操av| 亚洲免费成人电影AV| 2025最新亚洲激情在线| 五月婷丁香| 久久98热re| 五月综合婷婷五月| 99只有精品9| 另类婷婷丁香| 九久9精品| 成人 在线 日韩| 婷婷刺激综合| 日韩av高清| 色小说五月婷婷| 五月天婷婷综合| 狠狠舔| 色婷婷天堂| 五月草影视| 亚洲中字AV电影在线网站| 色婷丁香五月| 99热97| www.久久久久| 六月丁香久久| 五月婷精品| 91丨九色丨熟女|老版| 婷婷激情五月天小说| 色婷婷色婷婷五月| 亚洲操女| 五月婷丁香亚洲| 九九在线热九九在线热99热| 天天婷婷综合| 成人精品在线| 国产裸舞福利资源在线视频| 亚洲精品色| 久久视这里只有精品| 26UUU欧美| 26uuu视频欧美| 天天操综合网| 婷婷伊人无码| 亚洲视频在线观看| 婷婷五月天,影院| 亚洲乱码日产精品BD| 久久五月丁香激情综合| 亚洲情综合五月天| 五月天黄色激情小说| 超碰人人在线观看| 天天天久久人人人合| 1234操逼网| 九九re精品视频在线观看| 激情综合网五月| 五月丁香激情啪啪| 国产亚洲色婷婷99精品| 亚洲妇女熟BBW| 99性爱无码| 五月婷婷婷色| 99色视频| 亚洲无码另类| 北京熟妇搡BBBB搡BBBB| 人人射av| 亭亭丁香97| 综合久久久| 天天久久66xxx| A片试看120分钟做受视频红杏 | WWW,五月| 99热乎| 丁香五月婷婷天激情| 五月婷婷亞洲中文| 玖玖婷婷色五月| 九九热最新视频| 久久人妻情侣| 婷婷自拍| 高清无码视频网址| 五月丁香久久激情网| 婷婷五月欧美| 五月婷色色| 五月人妻婷婷| 51XX嘿嘿午夜无码| 婷婷九月| 五月婷婷激清网| 激情五月婷婷视频一区二区三区| 丁香五月影院| 婷婷五月偷拍| 六月丁香综合| 99超超碰| 香蕉狠狠爱视频| 天天综合干| 天天干,天天操,天天射| 色婷婷综合网| 亚洲99热| 色六月天天激情综合网| 91九色白丝| 婷婷五月天丁香花| 99爱视频免费看| 亚洲精品国产成人AV在线| j五月香在线| 91久久精品无码一区二区三区| 婷婷五月天成人动漫 | 七七九色| 99色热综合| 久久香蕉网| 精品久久久人妻| 狠狠色婷婷在线| 77777亚洲午夜久久| av国产精品| 激情五月综合亚洲另类| 天天撸夜夜爽| 亚洲综合字幕色色| 婷婷丁香www视频日本韩国| 99色| 色婷婷19| 人妻操逼视频| 亚洲五月天综合| 99自拍视频网站| 婷婷久久婷婷色五月| 日本天天色| 99热精品观看| 亚洲综合丁香五月天| 天天摸天天爽| 99在线视频色版| 一区二区aV电影免费看| 亚洲视频一区| 五月婷婷啪啪| 九热视频在线精品15| 丁香五月五婷| 五月婷婷就去色| 任你草| 色婷婷色九月| 综合网色综合| 99久久国产综合精品五月天喷水\| www.五月天| 91丨九色丨高潮丰满日本| 亚洲天天操| 思思久热| 久久99热 这里有精品| 五月天婷基地| 久久久久这里都是精品| 色婷婷免费视频| 夜夜谢天天干| 丁香欧美| 五月综合激情综合久| 99热在线免费观看精品| 色五月婷色彩免播放器| aa久久| 8区视频在线| 九热免费视频| 91久久久久久久91| 婷婷六月色情| 亚洲AV永久无码影院黑人| 99爱在线| 拍色综合| 91精品综合久久久久久五月丁香| 婷婷五月天AV激情| www.五月丁香| 综合五月激情网| 99er6热在线观看精品6| 六月婷婷国产| 丁香婷婷色五月天| 欧美va亚洲va在线播放| 五月婷婷无码专区| 日韩精品色| 伊人五月丁香| 99热这里只有精品22| 丁香五月天论坛| 狠狠狠色激情综合适合| 婷婷综合在线| 亚州操操| 91成人品| 亚洲精品99| 国产精品A成V人在线播放| 午夜69成人做爰视频| 九九9久九9国产视频| 国产av网| 美欧成人视频| 久草五月婷婷| 婷婷成人综合| 国产婷婷五月中文字幕高清| 婷婷五月开心中文字幕色| 99爱视频在线免费观看| www.av骚货| 人人摸人人| 亚洲无码另类| 99精品网| 女同在线9| 色婷婷四色| 色播综合| 亚洲激情高潮| 亚洲欧美另类在线23p| www,超碰| 丁香五月天婷婷中文| 99热这里只有精品在线播放| 第四色五月天| 九九黄色网| 国产免费性爱| 在线看av| 入口五月婷婷六月香| 999婷婷综合| 男女久久婷婷五月天| 亚洲色网络| 久久大香蕉| 九九九九操逼| 激情久久网 | 日韩五月婷婷久久| 色五月天丁香婷婷| 五月天综合缴情网网站0| 天天做 天天爱| AA久久| 99色综合| 丁香玖玖视频大全| 国产噜一噜天天噜| 乱色色色| 久久久婷婷| 超碰免费人人肏| 色色五月天激情| 天天搞天天色综合| 激情欧美五月丁香| 真实熟女-91九色| 99色视频| 五月激情婷婷六月| www.婷婷五月| 天天色五月婷婷91久久久久久久| 97精品综合久久| 丁香五月激情图片| 99视频精品在线| 激情五月天第四色| 天堂爱爱| 97干视频在线| 综合久久十三| 噜噜噜噜婷婷五月天| 99在热线免费视频| 天天综合色| 五月婷在线影院| 色婷婷五月天不卡| 涩涩五月天| 狠狠爱五月婷婷| 天天夜天天色天天| 99ri精品| 色丁香五月| 99热在线免费| 欧美精品XXXXBBBB| w婷婷五月婷婷w| 五月丁香六月婷婷久久| 久久er99热精品一区二区| 五月天婷婷免费| 毛片色五月| 免费观看全黄做爰的视频| 婷婷五月色情天| 五月激情影院| 婷婷五月天淫荡| 久久99激情| 色激情五月| 亚洲色图45p| 草综合14| 亚洲黄网在线| 亚洲婷婷六月天| 婷婷色综合| 色色综合网站| 五月天操逼网| 五月丁香六月婷婷的女人| 久久草婷婷丁香网站| 九九热九九| 色婷婷亚洲| 婷婷五月天堂| 九97免费视频| 狠狠狠狠狠操| 亚洲日韩成人三级av| 五月人人丁香婷婷五月人人丁香| 亚州操人在线视频| 五月激情婷婷国产精品久久久久久| 久久免费精彩视频| www.色99| 日韩欧美颜射| 色色色五月天婷婷| www.日韩艹| 亚洲精品久久久久久久久久飞鱼 | 91狠狠综合久久久久久| 激情综合5| 综合激情视频| 天天做天天要天天爱| 色色色色色色网站| 亚洲综合网 665566| 新97人人上人人| 久久人人看| 开心深爱激情网| 大香蕉九九| 久久97| 五月丁香激情综合啪| 色玖玖| 久色中文|