{"id":1871,"date":"2026-08-18T20:14:04","date_gmt":"2026-08-18T12:14:04","guid":{"rendered":"https:\/\/tongchun.website\/index.php\/kimiagent-05-browser\/"},"modified":"2026-08-18T20:26:26","modified_gmt":"2026-08-18T12:26:26","slug":"kimiagent-05-browser","status":"publish","type":"page","link":"https:\/\/tongchun.website\/index.php\/kimiagent-05-browser\/","title":{"rendered":"05-browser \u2014\u2014 \u6d4f\u89c8\u5668\u4e0e\u684c\u9762\u81ea\u52a8\u5316"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u2190 \u8fd4\u56de\u4e3b\u62a5\u544a\uff1a<a href=\"https:\/\/tongchun.website\/index.php\/2026\/kimi-agent%ef%bc%88%e4%ba%91%e7%ab%af%e6%b2%99%e7%ae%b1%ef%bc%89%e6%8a%80%e6%9c%af%e6%8a%a5%e5%91%8a\/\">Kimi Agent\uff08\u4e91\u7aef\u6c99\u7bb1\uff09\u6280\u672f\u62a5\u544a<\/a> \uff5c <a href=\"https:\/\/github.com\/SHAWNTRIBBIANI\/kimiagent-analysis\/blob\/main\/sections\/05-browser.md\">GitHub \u539f\u6587<\/a><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>\u5408\u89c4\u4e0e\u98ce\u9669\u58f0\u660e<\/strong>\uff1a\u672c\u62a5\u544a\u4e3a\u5b89\u5168\u7814\u7a76\u4e0e\u4e92\u64cd\u4f5c\u5b66\u4e60\u76ee\u7684\u7684\u9006\u5411\u5206\u6790\uff0c\u5168\u7a0b\u53ea\u8bfb\u91c7\u96c6\uff0c\u672a\u5bf9\u76ee\u6807\u7cfb\u7edf\u505a\u4efb\u4f55\u4fee\u6539\uff1b\u6587\u4e2d\u6240\u6709\u5bc6\u94a5\u3001token\u3001\u8d26\u53f7\u7ea7\u6807\u8bc6\uff08chat_id \/ project_id \/ tenant_id \u7b49\uff09\u5747\u5df2\u8131\u654f\uff1b\u6c99\u7bb1\u5185\u53d1\u73b0\u7684\u9ed8\u8ba4\u5f31\u53e3\u4ee4\uff08VNC\/SSH\uff09\u5c5e\u5e73\u53f0\u4fa7\u914d\u7f6e\uff0c\u4ec5\u4f5c\u5b89\u5168\u53d1\u73b0\u62ab\u9732\uff0c\u8bf7\u52ff\u7528\u4e8e\u8bbf\u95ee\u4efb\u4f55\u4e0d\u5c5e\u4e8e\u81ea\u5df1\u7684\u7cfb\u7edf\u3002docx\/pdf\/xlsx\/kimi-slides \u7b49\u5f15\u64ce\u4e8c\u8fdb\u5236\u4e3a Moonshot \u4e13\u6709\u8bb8\u53ef\uff08\u7981\u518d\u5206\u53d1\/\u9006\u5411\uff09\uff0c\u672c\u6587\u4ec5\u4f5c\u884c\u4e3a\u7ea7\u63cf\u8ff0\u3002\u62a5\u544a\u57fa\u4e8e\u5355\u6b21\u5206\u6790\u7a97\u53e3\uff08\u7ea6 50 \u5206\u949f\u751f\u547d\u5468\u671f\uff09\uff0c\u8f6f\u4ef6\u7248\u672c\u4e0e\u6280\u80fd\u5e93\u5b58\u968f\u955c\u50cf\u66f4\u65b0\u53ef\u80fd\u53d8\u5316\u3002<\/p><\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\u91c7\u96c6\u65f6\u95f4\uff1a2026-08-18\u3002\u76ee\u6807\uff1a\u8bb2\u6e05 Kimi \u6c99\u7bb1\u91cc agent \u5982\u4f55&#8221;\u770b&#8221;\u548c&#8221;\u64cd\u4f5c&#8221;\u6d4f\u89c8\u5668\/\u684c\u9762\u3002 \u5168\u90e8\u7ed3\u8bba\u6765\u81ea\u53ea\u8bfb\u8bbf\u95ee\uff08SSH <code>kimi@127.0.0.1:12222<\/code> + HTTP \u515c\u5e95 <code>http:\/\/127.0.0.1:18080<\/code>\uff09\u3002<\/p><\/blockquote>\n\n\n\n<h2 id=\"1-%25e6%2580%25bb%25e4%25bd%2593%25e6%259e%25b6%25e6%259e%2584%25e4%25b8%2580%25e5%258f%25a5%25e8%25af%259d\" class=\"wp-block-heading\">1. \u603b\u4f53\u67b6\u6784\u4e00\u53e5\u8bdd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u6c99\u7bb1\u91cc\u8dd1\u7740\u4e00\u5957<strong>\u6709\u5934\uff08headed\uff09Chromium + Xvnc \u865a\u62df\u684c\u9762<\/strong>\u7684\u7ec4\u5408\uff1aChromium \u6e32\u67d3\u5230\u865a\u62df X \u663e\u793a <code>:99<\/code>\uff08KasmVNC \u63d0\u4f9b\uff0c1920&#215;1080\uff0cwebsocket :6080 \u5bf9\u5916\u63d0\u4f9b Web \u684c\u9762\uff09\uff0c<code>browser_guard.py<\/code> \u4f5c\u4e3a\u5b88\u62a4\u8fdb\u7a0b\u8d1f\u8d23\u62c9\u8d77 Chromium\u3001\u4fdd\u8bc1&#8221;\u6c38\u8fdc\u6709\u6807\u7b7e\u9875\u4e14\u7a97\u53e3\u6700\u5927\u5316&#8221;\uff1bagent \u4fa7\u901a\u8fc7 <strong>CDP\uff08Chrome DevTools Protocol\uff0c:9222\uff09<\/strong> \u64cd\u4f5c\u6d4f\u89c8\u5668\uff0c\u901a\u8fc7 <strong>PyAutoGUI\/Xlib \u70b9\u51fb X \u684c\u9762<\/strong>\u505a\u7126\u70b9\u7b49 GUI \u7ea7\u64cd\u4f5c\uff1b<code>\/opt\/moonbox-project-template\/bin\/project-cdp-proxy.py<\/code> \u628a 9222 \u5305\u88c5\u6210\u5bf9\u5916\u53ef\u7528\u7684 9223\uff08\u6539\u5199 Host \u5934\u548c webSocketDebuggerUrl\uff09\uff0c\u4f9b\u6c99\u7bb1\u5916\/\u9879\u76ee\u6a21\u677f\u573a\u666f\u8fde\u63a5\u3002<\/p>\n\n\n\n<h2 id=\"2-chromium-%25e5%25ae%259e%25e4%25be%258b%25e5%25ae%259e%25e5%2586%25b5\" class=\"wp-block-heading\">2. Chromium \u5b9e\u4f8b\u5b9e\u51b5<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>\u7248\u672c\uff1a<code>Chrome\/151.0.7922.71<\/code>\uff08<code>curl http:\/\/127.0.0.1:9222\/json\/version<\/code> \u5b9e\u6d4b\uff0cDebian 12 \u81ea\u5e26 chromium\uff0c<code>\/usr\/lib\/chromium\/chromium<\/code>\uff09\u3002<\/li><li>\u8fdb\u7a0b\u5c5e\u4e3b\uff1a<code>kimi<\/code>\uff0c\u4e3b\u8fdb\u7a0b PID 342\uff08\u91c7\u6837\u65f6\u70b9\uff09\uff0c\u7531 <code>browser_guard.py<\/code>\uff08PID 84\uff09\u4ee5 <code>subprocess.Popen<\/code> \u62c9\u8d77\u3002<\/li><li>\u5f53\u524d CDP <code>\/json\/list<\/code> \u53ea\u6709 1 \u4e2a <code>page<\/code>\uff08<code>chrome:\/\/newtab\/<\/code>\uff09+ 1 \u4e2a NTP \u5185\u5d4c iframe\uff0c\u5373&#8221;\u5b88\u536b\u7ef4\u6301\u7684\u515c\u5e95\u6807\u7b7e\u9875&#8221;\u3002<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9e\u6d4b\u542f\u52a8\u547d\u4ee4\u884c\uff08ps \u6458\u5f55\uff0c\u4e0e <code>BrowserCDPGuard.start()<\/code> \u5b8c\u5168\u543b\u5408\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/usr\/lib\/chromium\/chromium --show-component-extension-options --enable-gpu-rasterization\n  --no-default-browser-check --disable-pings --media-router=0 --enable-remote-extensions\n  --load-extension= chrome:\/\/newtab\/ --remote-debugging-port=9222 --remote-debugging-address=0.0.0.0\n  --window-position=0,0 --window-size=1920,1080 --no-first-run --start-maximized\n  --no-sandbox --disable-dbus --disable-gpu --disable-software-rasterizer\n  --enable-logging=file --log-file=\/tmp\/chromium_detailed.log --disable-infobars\n  --disable-blink-features=AutomationControlled --user-data-dir=\/tmp\/chromium_user_data\n  --allow-file-access-from-files --load-extension=\/app\/pdf-viewer --js-flags=\"--max_old_space_size=512\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uff08<code>--show-component-extension-options --enable-gpu-rasterization --disable-pings --media-router=0 --enable-remote-extensions --load-extension=<\/code> \u8fd9\u51e0\u4e2a\u662f Debian chromium \u5305\u88c5\u811a\u672c\u9ed8\u8ba4\u6ce8\u5165\u7684\uff0c\u975e guard \u663e\u5f0f\u4f20\u5165\u3002\uff09<\/p>\n\n\n\n<h3 id=\"%25e5%2585%25b3%25e9%2594%25ae%25e5%258f%2582%25e6%2595%25b0%25e5%2590%25ab%25e4%25b9%2589\" class=\"wp-block-heading\">\u5173\u952e\u53c2\u6570\u542b\u4e49<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u53c2\u6570<\/th><th>\u4f5c\u7528 \/ \u4e3a\u4ec0\u4e48<\/th><\/tr><\/thead><tbody><tr><td><code>--remote-debugging-port=9222 --remote-debugging-address=0.0.0.0<\/code><\/td><td>\u5f00 CDP \u5e76\u7ed1 0.0.0.0 \u2014\u2014 \u6c99\u7bb1\u5185\u4efb\u4f55\u8fdb\u7a0b\uff08envd\u3001guard\u3001proxy\uff09\u90fd\u80fd\u8fde\uff1b0.0.0.0 \u662f\u914d\u5408 cdp-proxy\/\u5916\u90e8\u8bbf\u95ee<\/td><\/tr><tr><td><code>--disable-blink-features=AutomationControlled<\/code><\/td><td>\u53cd\u68c0\u6d4b\u6838\u5fc3\uff1a\u53bb\u6389 <code>navigator.webdriver=true<\/code> \u7b49\u81ea\u52a8\u5316\u6307\u7eb9\uff0c\u8ba9\u9875\u9762\u4e0d\u628a agent \u5f53\u673a\u5668\u4eba<\/td><\/tr><tr><td><code>--user-data-dir=\/tmp\/chromium_user_data<\/code><\/td><td>profile \u653e \/tmp \u2014\u2014 <strong>\u5bb9\u5668\u6bcf\u6b21\u542f\u52a8\u90fd\u662f\u5e72\u51c0\u6d4f\u89c8\u5668<\/strong>\uff08\u65e0\u767b\u5f55\u6001\u3001\u65e0 cookie \u6b8b\u7559\uff09<\/td><\/tr><tr><td><code>--no-sandbox --disable-dbus<\/code><\/td><td>\u5bb9\u5668\u5185\u6ca1\u6709 userns\/dbus\uff0c\u5fc5\u987b\u5173\u6c99\u7bb1\uff1b\u5b89\u5168\u6027\u9760\u5bb9\u5668\u9694\u79bb\u515c\u5e95<\/td><\/tr><tr><td><code>--disable-gpu --disable-software-rasterizer<\/code><\/td><td>\u65e0\u771f\u5b9e GPU\uff0c\u6e32\u67d3\u4ea4\u7ed9 Xvnc \u865a\u62df\u5e27\u7f13\u51b2<\/td><\/tr><tr><td><code>--allow-file-access-from-files<\/code><\/td><td>\u5141\u8bb8 file:\/\/ \u9875\u9762\u4e92\u76f8\u8bbf\u95ee\uff08\u4ee3\u7801\u6ce8\u91ca\u81ea\u627f\u8ba4 &#8220;dangerous flag&#8221;\uff09\u2014\u2014\u65b9\u4fbf agent \u672c\u5730\u9884\u89c8\u751f\u6210\u7684 HTML<\/td><\/tr><tr><td><code>--load-extension=\/app\/pdf-viewer<\/code><\/td><td>\u6ce8\u5165 PDF.js \u6269\u5c55\uff08\u89c1 \u00a75\uff09<\/td><\/tr><tr><td><code>--js-flags=\"--max_old_space_size=512\"<\/code><\/td><td>\u9650\u5236 V8 \u5806 512MB\uff0c\u9632\u6e32\u67d3\u8fdb\u7a0b\u5403\u7206\u5185\u5b58<\/td><\/tr><tr><td><code>--enable-logging=file --log-file=\/tmp\/chromium_detailed.log<\/code><\/td><td>\u8be6\u7ec6\u65e5\u5fd7\u843d\u76d8\u4fbf\u4e8e\u6392\u969c<\/td><\/tr><tr><td><code>--window-size=1920,1080 --start-maximized<\/code><\/td><td>\u4e0e Xvnc \u684c\u9762\u5206\u8fa8\u7387\u5bf9\u9f50<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 id=\"3-appbrowserguardpy783-%25e8%25a1%258c%25e7%25b2%25be%25e8%25af%25bb\" class=\"wp-block-heading\">3. <code>\/app\/browser_guard.py<\/code>\uff08783 \u884c\uff09\u7cbe\u8bfb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8def\u5f84 <code>\/app\/browser_guard.py<\/code>\uff0c28KB\uff0c\u7531 s6 \u670d\u52a1 <code>browser-guard<\/code> \u4ee5 kimi \u8eab\u4efd\u5e38\u9a7b\u8fd0\u884c\uff08<code>\/etc\/s6-overlay\/s6-rc.d\/browser-guard\/run<\/code>\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\">\/command\/s6-svwait -u \/run\/service\/kasmvnc   # \u5148\u7b49\u684c\u9762\u5c31\u7eea\nexport DISPLAY=:99 XAUTHORITY=\/home\/kimi\/.Xauthority HOME=\/home\/kimi\nexec s6-setuidgid kimi python3 \/app\/browser_guard.py --wait-display --display :99 --timeout 60 --monitor<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6587\u4ef6\u91cc\u6709\u4e24\u5957\u5b9e\u73b0\uff0c\u7531\u73af\u5883\u53d8\u91cf <code>USE_CDP<\/code> \u9009\u62e9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong><code>BrowserGuard<\/code>\uff08Playwright \u6a21\u5f0f\uff09<\/strong>\uff1a<code>playwright.chromium.launch_persistent_context(executable_path=\"\/usr\/bin\/chromium\", user_data_dir=\"\/app\/data\/chrome_data\", headless=False, ...)<\/code>\uff0c\u81ea\u5e26 UA \u4f2a\u9020\uff08\u6309 chromium \u771f\u5b9e\u7248\u672c\u53f7\u62fc UA + <code>Sec-CH-UA<\/code> \u5934\uff09\u3001locale=<code>CHROME_LOCALE<\/code>(\u9ed8\u8ba4 zh-CN)\u3001timezone=<code>TZ<\/code>(\u9ed8\u8ba4 Asia\/Shanghai)\u3002<\/li><li><strong><code>BrowserCDPGuard<\/code>\uff08\u88f8 CDP \u6a21\u5f0f\uff0c\u5f53\u524d\u5b9e\u9645\u751f\u6548\uff09<\/strong>\uff1a\u76f4\u63a5 <code>subprocess.Popen<\/code> \u62c9 chromium\uff08\u547d\u4ee4\u884c\u5373 \u00a72 \u90a3\u6bb5\uff09\uff0c\u4e4b\u540e\u7eaf\u7528 <code>requests<\/code> + <code>websockets<\/code> \u8d70 CDP HTTP\/WS \u7aef\u70b9\u7ba1\u7406\u3002<strong>\u5224\u65ad\u4f9d\u636e\uff1aps \u5b9e\u6d4b\u547d\u4ee4\u884c\u4e0e <code>BrowserCDPGuard.start()<\/code> \u7684\u53c2\u6570\u9010\u4e00\u5bf9\u5e94\uff08<code>--user-data-dir=\/tmp\/...<\/code>\u3001<code>--js-flags=512<\/code>\uff09\uff0c\u800c\u975e Playwright \u6a21\u5f0f\u7684 <code>\/app\/data\/chrome_data<\/code>\u3002<\/strong><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><code>BrowserCDPGuard<\/code> \u7684\u76d1\u63a7\u5faa\u73af\uff08<code>_monitor_loop<\/code>\uff0c\u9ed8\u8ba4 1s \u4e00\u8f6e\uff09\u505a\u4e09\u4ef6\u4e8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><code>GET \/json\/list<\/code> \u8fc7\u6ee4 <code>type==\"page\"<\/code>\uff1b<strong>\u4e00\u4e2a\u6ca1\u6709\u5c31 <code>PUT \/json\/new<\/code> \u5f00\u65b0\u6807\u7b7e\u9875<\/strong>\uff08\u4fdd\u8bc1 agent \u6c38\u8fdc\u6709\u53ef\u7528 tab\uff09\u3002<\/li><li>\u5bf9\u7b2c\u4e00\u4e2a\u6807\u7b7e\u9875\uff1aWS \u8fde\u63a5\u540e <code>Browser.getWindowForTarget<\/code> \u2192 <code>Browser.getWindowBounds<\/code>\uff0c\u82e5 <code>minimized<\/code> \u5219\u6062\u590d <code>normal<\/code>\uff0c\u5426\u5219\u5f3a\u5236 <code>maximized<\/code>\uff08<strong>\u7a97\u53e3\u88ab\u7528\u6237\/agent \u6700\u5c0f\u5316\u6216\u8fd8\u539f\u65f6\u81ea\u52a8\u62c9\u56de\u6700\u5927\u5316<\/strong>\uff0c\u914d\u5408 VNC \u622a\u56fe\u5f97\u5230\u7a33\u5b9a\u753b\u9762\uff09\u3002<\/li><li>\u4efb\u4f55\u5f02\u5e38 \u2192 \u6e05 WS \u8fde\u63a5\u3001kill \u6d4f\u89c8\u5668\u8fdb\u7a0b\u3001\u91cd\u65b0 <code>start()<\/code>\uff08\u6700\u591a\u91cd\u8bd5 6 \u6b21\uff0c\u6307\u6570\u9000\u907f\uff09\u3002<strong>\u5373&#8221;\u6d4f\u89c8\u5668\u770b\u95e8\u72d7&#8221;\uff1a\u5d29\u6e83\u81ea\u6108\u3002<\/strong><\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5176\u5b83\u7ec6\u8282\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u542f\u52a8\u540e\u7528 <strong>PyAutoGUI<\/strong> \u505a\u4e00\u6b21\u7126\u70b9\u70b9\u51fb\uff1a<code>pyautogui.click(width-25, 115)<\/code> \u7136\u540e\u79fb\u56de\u539f\u4f4d \u2014\u2014 \u70b9\u4e00\u4e0b\u7a97\u53e3\u6807\u9898\u680f\u9644\u8fd1\u8ba9 Chromium \u83b7\u5f97 X \u7126\u70b9\uff08<code>get_screensize()<\/code> \u6765\u81ea <code>\/app\/utils.py<\/code>\uff0c\u7528 <code>xrandr<\/code> \u89e3\u6790\uff09\u3002<\/li><li><code>wait_for_display()<\/code> \u7528 <code>python-xlib<\/code> \u8f6e\u8be2\u8fde <code>:99<\/code>\uff0c\u6700\u591a 60s\uff0c\u4fdd\u8bc1 Xvnc \u5148\u4e8e\u6d4f\u89c8\u5668\u5c31\u7eea\u3002<\/li><li><code>set_screen_resolution()<\/code> \u901a\u8fc7 CDP <code>Browser.setWindowBounds<\/code> \u6539\u7a97\u53e3\u5927\u5c0f\uff08\u547c\u5e94 <code>SCREEN_RESOLUTION<\/code> \u73af\u5883\u53d8\u91cf\uff0c\u9ed8\u8ba4 1920&#215;1080\uff09\u3002<\/li><li>\u4ee3\u7801\u91cc <code>BrowserGuard.start()<\/code> \u539f\u6709\u4e00\u6bb5\u65e0 try \u5305\u88f9\u7684 pyautogui \u70b9\u51fb\uff0c<code>\/opt\/moonbox-project-template\/bin\/patch-browser-guard.py<\/code> \u4f1a\u5728\u9879\u76ee\u6a21\u677f\u5bb9\u5668\u542f\u52a8\u65f6\u628a\u5b83\u6253\u4e0a try\/except \u8865\u4e01\uff08\u8bf4\u660e moonbox \u6a21\u677f\u955c\u50cf\u590d\u7528\u540c\u4e00\u4efd browser_guard.py \u518d\u70ed\u8865\u4e01\uff09\u3002<\/li><\/ul>\n\n\n\n<h2 id=\"4-cdp-9222-%25e7%259a%2584%25e4%25bd%25bf%25e7%2594%25a8%25e6%2596%25b9\" class=\"wp-block-heading\">4. CDP :9222 \u7684\u4f7f\u7528\u65b9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u76d1\u542c\u786e\u8ba4\uff08<code>\/proc\/net\/tcp<\/code>\uff09\uff1a9222\uff08chromium\uff09\u3001<strong>9223\uff08project-cdp-proxy\uff0cPID 64\uff0croot\uff09<\/strong>\u30016080\uff08Xvnc websocket\uff09\u30018888\uff08kernel-server\uff09\u300118080\/18082\u300122\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>browser_guard.py<\/strong>\uff1a\u5982\u4e0a\uff0cHTTP \u7aef\u70b9 + \u6bcf\u6807\u7b7e\u9875\u4e00\u6761\u6301\u4e45 WS\u3002<\/li><li><strong>envd\uff08<code>\/usr\/local\/bin\/envd<\/code>\uff0cGo \u4e8c\u8fdb\u5236\uff0c\u5e26 debug_info \u672a strip\uff0c<code>-isnotfc<\/code> \u53c2\u6570\uff0cPID 77\uff0croot\uff09<\/strong>\uff1aagent \u8fd0\u884c\u65f6\u672c\u4f53\u3002\u91c7\u6837\u65f6 9222 \u4e0a\u6709 1 \u6761 ESTABLISHED \u957f\u8fde\u63a5\uff08\u672c\u5730\u7aef\u53e3 39258 \u5bf9\uff09\u3002<code>strings envd | grep -i '9222\\|devtools\\|cdp'<\/code> \u65e0\u76f4\u63a5\u547d\u4e2d\uff08\u7aef\u70b9\u5730\u5740\u5e94\u4e3a\u914d\u7f6e\/\u8fd0\u884c\u65f6\u62fc\u63a5\uff09\uff0c\u4f46\u7ed3\u5408\u67b6\u6784\uff08envd \u662f agent \u4e0e\u6c99\u7bb1\u8d44\u6e90\u4e4b\u95f4\u7684\u7f51\u5173\uff09\u53ef\u5224\u5b9a<strong>\u6d4f\u89c8\u5668\u5de5\u5177\u8c03\u7528\u6700\u7ec8\u8d70 CDP<\/strong>\u3002\u96a7\u9053\u4e00\u5ea6\u4e2d\u65ad\uff0csocket \u5c5e\u4e3b\u7cbe\u786e\u5f52\u56e0\uff08uid \u5217\uff09\u672a\u53d6\u5230\uff0c\u5c5e\u9057\u7559\u5c0f\u5c3e\u5df4\u3002<\/li><li><strong>project-cdp-proxy.py\uff089223\uff09<\/strong>\uff1a\u89c1 \u00a76\u3002<\/li><li><strong>skills \u5c42<\/strong>\uff1a<code>\/app\/.agents\/skills\/rust-browser-pilot\/<\/code>\uff08fast-browser-use \u7684\u6c49\u5316\u7248\uff09\u6e90\u7801\u91cc\u786c\u7f16\u7801 <code>ws:\/\/localhost:9222<\/code>\uff08<code>src\/browser\/session.rs:434<\/code> \u7b49\uff09\uff0c\u5373 skill \u53ef\u76f4\u63a5\u9a71\u52a8\u8fd9\u4e2a\u6709\u5934\u6d4f\u89c8\u5668\u3002<\/li><\/ul>\n\n\n\n<h2 id=\"5-apppdfviewer-%25e6%2589%25a9%25e5%25b1%2595\" class=\"wp-block-heading\">5. <code>\/app\/pdf-viewer<\/code> \u6269\u5c55<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c31\u662f\u5f00\u6e90 <strong>PDF Viewer\uff08Rob&#8211;W\/pdf.js \u7684 Chrome \u79fb\u690d\u7248\uff0cv4.6.129\uff0cmanifest v3\uff0c\u5185\u7f6e pdf.js 4.x\uff1a<code>content\/build\/pdf.mjs<\/code> + <code>pdf.worker.mjs<\/code> \u2248 3.9MB\uff09<\/strong>\u3002\u7ed3\u6784\uff1a\u6839\u76ee\u5f55\u662f\u6269\u5c55\u58f3\uff08<code>background.js<\/code> service worker \u4e32\u8d77 <code>pdfHandler.js<\/code>\/<code>extension-router.js<\/code>\/<code>preserve-referer.js<\/code>\/<code>telemetry.js<\/code>\uff09\uff0c<code>content\/<\/code> \u662f\u5b8c\u6574 pdf.js viewer\uff08\u542b 100+ \u8bed\u8a00 locale \u548c CJK cmap \u2014\u2014 \u660e\u663e\u7167\u987e\u4e2d\u6587 PDF\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">manifest \u8981\u70b9\uff1a<code>host_permissions: <all_urls><\/code>\u3001content script \u6ce8\u5165\u6240\u6709 <code>http\/https\/file<\/code> \u9875\u9762\uff08<code>document_start<\/code>, all_frames\uff09\u3001\u6743\u9650\u542b <code>webRequest\/declarativeNetRequestWithHostAccess\/tabs\/webNavigation<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f5c\u7528\uff1a\u8ba9 headless \u73af\u5883\u91cc <strong>agent \u6253\u5f00 PDF \u94fe\u63a5\u65f6\u5f97\u5230\u53ef\u6e32\u67d3\u3001\u53ef\u622a\u56fe\u3001\u53ef\u9009\u4e2d\u6587\u5b57\u7684\u9875\u9762<\/strong>\uff0c\u800c\u4e0d\u662f\u89e6\u53d1\u4e0b\u8f7d\u3002\u5bf9&#8221;\u770b&#8221;PDF \u7c7b\u4efb\u52a1\uff08\u622a\u56fe + \u89c6\u89c9\u6a21\u578b\uff09\u662f\u5173\u952e\u4e00\u73af\u3002<\/p>\n\n\n\n<h2 id=\"6-optmoonboxprojecttemplatebinprojectcdpproxypy295-%25e8%25a1%258c\" class=\"wp-block-heading\">6. <code>\/opt\/moonbox-project-template\/bin\/project-cdp-proxy.py<\/code>\uff08295 \u884c\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7eaf asyncio \u5199\u7684 <strong>CDP \u53cd\u5411\u4ee3\u7406<\/strong>\uff08\u65e0\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff09\uff0c\u9ed8\u8ba4 <code>0.0.0.0:9223 \u2192 127.0.0.1:9222<\/code>\uff08\u53ef\u7528 <code>CDP_PROXY_*<\/code> \u73af\u5883\u53d8\u91cf\u6539\uff09\u3002\u4e24\u4e2a\u6838\u5fc3\u529f\u80fd\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>\u91cd\u5199 Host \u5934<\/strong>\uff1a\u65b0\u7248 Chrome \u7684 CDP \u6821\u9a8c Host \u5fc5\u987b\u4e3a localhost\/IP\uff0c\u5916\u90e8\u7528\u57df\u540d\u8fde\u4f1a\u88ab 403\uff1bproxy \u7edf\u4e00\u6539\u5199\u6210 <code>Host: 127.0.0.1:9222<\/code>\u3002<\/li><li><strong>\u91cd\u5199 discovery \u54cd\u5e94<\/strong>\uff08<code>\/json<\/code>\u3001<code>\/json\/list<\/code>\u3001<code>\/json\/version<\/code>\uff09\uff1a\u628a\u8fd4\u56de JSON \u91cc\u6240\u6709\u6307\u5411 loopback \u7684 <code>webSocketDebuggerUrl<\/code> \u66ff\u6362\u6210\u5ba2\u6237\u7aef\u8bf7\u6c42\u7528\u7684\u516c\u7f51 Host\uff08\u975e loopback \u65f6\u5347\u7ea7 <code>ws:\/\/<\/code> \u2192 <code>wss:\/\/<\/code>\uff09\uff0c\u4f7f\u5916\u90e8 CDP \u5ba2\u6237\u7aef\u62ff\u5230\u7684 WS \u5730\u5740\u56de\u6307 proxy \u81ea\u8eab\u3002\u5bf9\u975e discovery \u8bf7\u6c42\uff08\u542b WS upgrade\uff09\u76f4\u63a5\u53cc\u5411\u900f\u4f20\uff0864KB \u5757\uff09\u3002<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5373\uff1a<strong>moonbox&#8221;\u9879\u76ee\u6c99\u7bb1&#8221;\u628a\u5185\u90e8 Chromium \u7684\u8c03\u8bd5\u80fd\u529b\u5b89\u5168\u5730\u66b4\u9732\u7ed9\u5916\u90e8 IDE\/\u9884\u89c8\u9762\u677f\u7684\u9002\u914d\u5c42<\/strong>\u3002\u540c\u76ee\u5f55\u8fd8\u6709 <code>patch-browser-guard.py<\/code>\u3001<code>patch-kernel-server.py<\/code>\u3001<code>write-template-version.py<\/code>\u3001<code>start-moonbox-project-sandbox.sh<\/code>\uff08\u5199\u542f\u52a8\u65f6\u95f4\u6233\u540e <code>exec \/init<\/code>\uff09\uff0c\u8bf4\u660e moonbox \u9879\u76ee\u6a21\u677f = kimiagent \u57fa\u7840\u955c\u50cf + \u8fd9\u5c42\u8865\u4e01\u3002<\/p>\n\n\n\n<h2 id=\"7-kasmvnc-%25e6%25a1%258c%25e9%259d%25a2\" class=\"wp-block-heading\">7. KasmVNC \u684c\u9762<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>s6 \u670d\u52a1 <code>kasmvnc<\/code> \u7684 run \u811a\u672c\u5c31\u662f <code>exec \/bin\/bash \/root\/setup_kasmvnc.sh<\/code>\uff08root \u6743\u9650\uff0ckimi \u8bfb\u4e0d\u4e86\uff0c\u7ecf 18080 HTTP \u515c\u5e95\u53d6\u5f97\u5168\u6587\uff09\u3002<\/li><li>\u811a\u672c\u5185\u5bb9\uff1a\u4ece <code>SCREEN_RESOLUTION<\/code>\uff08\u9ed8\u8ba4 1920&#215;1080\uff09\u7b97\u5bbd\u9ad8 \u2192 <code>vncpasswd<\/code> \u8bbe\u7f6e\u5bc6\u7801\uff08\u660e\u6587\u5199\u6b7b\u5728\u811a\u672c\u91cc\uff1a<code>password<\/code>\uff0c\u5c5e\u5f31\u53e3\u4ee4\u4f46\u4ec5\u5bb9\u5668\u5185 VNC \u7528\uff09\u2192 \u751f\u6210 <code>\/root\/.vnc\/kasmvnc.yaml<\/code>\uff0c\u5173\u952e\u9879\uff1a\n<ul><li><code>network.websocket_port: 6080<\/code>\u3001<code>interface: 0.0.0.0<\/code>\u3001<code>protocol: http<\/code>\u3001<code>require_ssl: false<\/code>\uff08\u81ea\u7b7e snakeoil \u8bc1\u4e66\u5907\u7740\u4f46\u975e\u5f3a\u5236\uff09<\/li><li><code>desktop.gpu.hw3d: false<\/code>\uff0c<code>drinode: \/dev\/dri\/renderD128<\/code><\/li><li><code>data_loss_prevention.clipboard<\/code> \u53cc\u5411\u5f00\u542f\uff0cmime \u9650\u5b9a <code>chromium\/x-web-custom-data, text\/html, image\/png<\/code> \u2014\u2014 \u663e\u7136\u4e3a\u6d4f\u89c8\u5668\u526a\u8d34\u677f\u573a\u666f\u5b9a\u5236<\/li><li>\u7f16\u7801\uff1a<code>max_frame_rate: 60<\/code>\u3001\u52a8\u6001\u8d28\u91cf 7-8\u3001\u89c6\u9891\u533a\u9608\u503c 45% \u2014\u2014 \u7f51\u9875\u6eda\u52a8\u65f6\u8d70\u89c6\u9891\u7f16\u7801\uff0c\u517c\u987e\u6d41\u7545\u4e0e\u5e26\u5bbd<\/li><\/ul><\/li><li>\u5b9e\u9645 Xvnc \u547d\u4ee4\u884c\uff08PID 155\uff0croot\uff09\uff1a<code>Xvnc :99 -SecurityTypes None -AlwaysShared ... -rfbport 5901 -websocketPort 6080 -geometry 1920x1080 -httpd \/usr\/share\/kasmvnc\/www ...<\/code>\u3002<strong><code>-SecurityTypes None<\/code> + <code>-AlwaysShared<\/code> + <code>-DisconnectClients 0<\/code><\/strong>\uff1a\u5bb9\u5668\u5185\u65e0\u8ba4\u8bc1\u3001\u591a\u4eba\u5171\u4eab\u3001\u6c38\u4e0d\u8e22\u4eba \u2014\u2014 6080 \u76f4\u63a5\u662f\u5185\u7f6e noVNC Web \u5ba2\u6237\u7aef\u5165\u53e3\uff0c\u4f9b\u4ea7\u54c1\u524d\u7aef\u5d4c\u5165&#8221;\u5b9e\u65f6\u684c\u9762\u6d41&#8221;\u7ed9\u7528\u6237\u56f4\u89c2 agent \u64cd\u4f5c\u3002<\/li><li>\u684c\u9762\u7684&#8221;\u770b&#8221;\u6709\u4e24\u6761\u8def\u5f84\uff1a\u2460 \u7528\u6237\u4fa7 = KasmVNC web \u6d41\uff1b\u2461 agent \u4fa7 = CDP <code>Page.captureScreenshot<\/code> \/ Playwright screenshot \/ PyAutoGUI\uff08X \u7ea7\u622a\u56fe\uff09\u3002X \u684c\u9762\u5b58\u5728\u7684\u610f\u4e49\u4e3b\u8981\u662f&#8221;\u6709\u5934\u6d4f\u89c8\u5668\u9700\u8981\u4e00\u4e2a DISPLAY&#8221;\u4ee5\u53ca\u5411\u7528\u6237\u76f4\u64ad\u3002<\/li><\/ul>\n\n\n\n<h2 id=\"8-%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e5%25ba%2593%25e7%259b%2598%25e7%2582%25b9\" class=\"wp-block-heading\">8. \u81ea\u52a8\u5316\u5e93\u76d8\u70b9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>pip list<\/code> \u547d\u4e2d\uff08kimi \u7528\u6237\u73af\u5883\uff09\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>playwright 1.62.0<\/strong>\uff08\u4e14 <code>~\/.cache\/ms-playwright<\/code> \u91cc\u4e0b\u8f7d\u4e86 chromium-1194\/1234 \u4e0e headless_shell \u2014\u2014 \u4f46 guard \u5b9e\u9645\u7528\u7cfb\u7edf <code>\/usr\/bin\/chromium<\/code>\uff0cPlaywright \u66f4\u591a\u662f\u7ed9 agent \u4efb\u52a1\u4ee3\u7801\/\u811a\u672c\u5907\u7528\uff09<\/li><li><strong>PyAutoGUI 0.9.54<\/strong>\uff08X \u7ea7\u9f20\u6807\u952e\u76d8\uff0cguard \u7684\u7126\u70b9\u70b9\u51fb\u5373\u7528\u5b83\uff09<\/li><li><strong>websockets 15.0.1<\/strong>\uff08guard \u7684\u88f8 CDP WS \u5ba2\u6237\u7aef\uff09<\/li><li>\u53e6\u6709 python-xlib\uff08wait_for_display \u7528\uff09\u3001requests\u3001loguru<\/li><li><strong>\u65e0 selenium \/ pyppeteer<\/strong>\uff1bnode \u4fa7\u672a\u89c1 puppeteer \u5168\u5c40\u5b89\u88c5\u7684\u8bc1\u636e\uff08skills \u91cc\u7684 browse CLI \u662f\u6309\u9700 <code>npm install -g @browserbasehq\/browse-cli<\/code> \u7684\u6a21\u5f0f\uff09<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">skills \u91cc\u4e0e\u6d4f\u89c8\u5668\u76f4\u63a5\u76f8\u5173\u7684\uff1a<code>browse<\/code>\uff08Browserbase browse-cli\uff0c\u672c\u5730\u6a21\u5f0f fallback \u5230\u672c\u5730 Chrome\uff09\u3001<code>fast-browser-use<\/code> \/ <code>rust-browser-pilot<\/code>\uff08Rust CDP \u5ba2\u6237\u7aef\uff0c\u76f4\u8fde ws:\/\/localhost:9222\uff09\u3001<code>playwright-scraper-skill<\/code>\u3002<\/p>\n\n\n\n<h2 id=\"9-%25e7%25bb%2593%25e8%25ae%25baagent-%25e5%25a6%2582%25e4%25bd%2595%25e7%259c%258b%25e5%2592%258c%25e6%2593%258d%25e4%25bd%259c\" class=\"wp-block-heading\">9. \u7ed3\u8bba\uff1aagent \u5982\u4f55&#8221;\u770b&#8221;\u548c&#8221;\u64cd\u4f5c&#8221;<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>\u770b\u6d4f\u89c8\u5668<\/strong>\uff1aCDP\uff08DOM snapshot \/ \u622a\u56fe \/ a11y \u6811\uff09\uff1bPDF \u7531 pdf-viewer \u6269\u5c55\u8f6c\u6210\u53ef\u6e32\u67d3\u7f51\u9875\uff1b\u9700\u8981\u6574\u5c4f\u89c6\u89c9\u65f6\u622a X \u684c\u9762\uff08PyAutoGUI\uff09\u6216\u7ecf VNC\u3002<\/li><li><strong>\u64cd\u4f5c\u6d4f\u89c8\u5668<\/strong>\uff1a\u4e3b\u901a\u9053 CDP :9222\uff08envd \u7684\u6d4f\u89c8\u5668\u5de5\u5177 + rust-browser-pilot \u7b49 skill \u90fd\u6307\u8fd9\u91cc\uff09\uff1bPlaywright \u4e3a\u5907\u7528\/\u811a\u672c\u901a\u9053\u3002<\/li><li><strong>\u64cd\u4f5c\u684c\u9762<\/strong>\uff1aPyAutoGUI\/xdotool \u7c7b X \u7ea7\u8f93\u5165\uff08\u8bc1\u636e\u662f guard \u7684\u7126\u70b9\u70b9\u51fb\uff09\uff0cX \u663e\u793a\u7531 Xvnc :99 \u63d0\u4f9b\u3002<\/li><li><strong>\u7a33\u5b9a\u6027\u4fdd\u969c<\/strong>\uff1abrowser-guard = \u6d4f\u89c8\u5668\u770b\u95e8\u72d7\uff08\u4fdd\u6807\u7b7e\u9875\u3001\u4fdd\u6700\u5927\u5316\u3001\u5d29\u6e83\u91cd\u542f\uff09\uff0cs6 \u4fdd\u8bc1 guard \u672c\u8eab\u4e0d\u6b7b\uff0ckasmvnc \u5148\u4e8e guard \u542f\u52a8\uff08s6-svwait \u4f9d\u8d56\uff09\u3002<\/li><li><strong>\u5bf9\u5916\u66b4\u9732<\/strong>\uff1a6080 = \u684c\u9762\u76f4\u64ad\uff1b9223 = \u8c03\u8bd5\u80fd\u529b\u51fa\u53e3\uff08proxy \u6539\u5199 Host\/WS URL\uff09\u3002<\/li><\/ul>\n\n\n\n<h2 id=\"%25e9%2599%2584%25e6%259c%25ac%25e6%25ac%25a1%25e6%259c%25aa%25e7%25ab%259f%25e4%25ba%258b%25e9%25a1%25b9\" class=\"wp-block-heading\">\u9644\uff1a\u672c\u6b21\u672a\u7adf\u4e8b\u9879<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>\u91c7\u6837\u4e2d\u6c99\u7bb1 frp \u96a7\u9053\uff0812222\/18080\uff09\u5728\u4f1a\u8bdd\u540e\u6bb5\u4e2d\u65ad\uff0c9222 \u957f\u8fde\u63a5\u7684\u5c5e\u4e3b\u8fdb\u7a0b\uff08uid \u5f52\u56e0\uff09\u672a\u53d6\u5230\u6700\u7ec8\u8bc1\u636e\uff1b<code>\/root\/setup_kasmvnc.sh<\/code> \u53ea\u53d6\u5230\u524d 120 \u884c\uff08\u5c3e\u90e8\u5e94\u662f Xvnc \u542f\u52a8\u884c\uff0c\u4f46\u5df2\u7531 ps \u5b9e\u6d4b\u547d\u4ee4\u884c\u8865\u5168\uff09\u3002<\/li><li>envd \u7684\u6d4f\u89c8\u5668\u5de5\u5177\u5185\u90e8\u534f\u8bae\uff08Go \u4e8c\u8fdb\u5236\uff09\u672a\u9006\u5411\uff0c\u4ec5\u786e\u8ba4\u5176\u4e3a CDP \u6d88\u8d39\u65b9\u4e4b\u4e00\u3002<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u2190 \u8fd4\u56de\u4e3b\u62a5\u544a\uff1aKimi Agent\uff08\u4e91\u7aef\u6c99\u7bb1\uff09\u6280\u672f\u62a5\u544a \uff5c GitHub \u539f\u6587 \u5408\u89c4\u4e0e\u98ce\u9669\u58f0\u660e\uff1a\u672c\u62a5\u544a\u4e3a\u5b89\u5168 &hellip; <a href=\"https:\/\/tongchun.website\/index.php\/kimiagent-05-browser\/\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201c05-browser \u2014\u2014 \u6d4f\u89c8\u5668\u4e0e\u684c\u9762\u81ea\u52a8\u5316\u201d<\/span><\/a><\/p>\n","protected":false},"author":55404,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"wpai_generated_summary":"","wpai_meta_description":"","footnotes":""},"class_list":["post-1871","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/pages\/1871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/users\/55404"}],"replies":[{"embeddable":true,"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/comments?post=1871"}],"version-history":[{"count":1,"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/pages\/1871\/revisions"}],"predecessor-version":[{"id":1891,"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/pages\/1871\/revisions\/1891"}],"wp:attachment":[{"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/media?parent=1871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}