Google Flow tại labs.google/fx/tools/flow là một trong những công cụ tạo video AI ấn tượng nhất hiện nay. Nhập text prompt, đợi 60–90 giây, và bạn có một clip điện ảnh chạy bằng VEO 3.1. Chất lượng output thực sự đáng kinh ngạc.
Vấn đề: toàn bộ đều thủ công. Một prompt mỗi lần, một click mỗi lần. Với bất kỳ workflow production nào — chạy 50+ prompt với nhiều orientation khác nhau, retry khi lỗi, theo dõi media ID nào ứng với prompt nào — nó hoàn toàn không dùng được theo cách thông thường.
Vậy là chúng tôi tự build automation layer.
I. Tool Làm Được Gì
Tool là một desktop app xây bằng Electron + React + TypeScript. Nó nhúng giao diện web của Flow vào một cửa sổ ẩn và điều khiển nó theo chương trình, trong khi hiển thị panel điều khiển ở cửa sổ riêng.
Các tính năng chính:
- Batch queue — paste danh sách prompt, đặt batch size, để nó chạy
- Rolling concurrency — submit prompt mới khi prompt cũ hoàn thành, giữ queue luôn bận
- Hai chế độ generation — text-to-video và image-to-video (với product asset selection)
- Retry logic — cấu hình số lần retry tối đa trước khi skip
- Media ID extraction — trích xuất
mediaIdtừ DOM của từng tile hoàn thành để dùng tiếp - Session persistence — cookie và user-agent được lưu qua các lần khởi động lại
II. Kỹ Thuật Bên Trong
1. Tự Động Hóa Slate Editor
Input prompt trên Flow dùng Slate.js, một rich-text editor framework. Không thể chỉ set element.value = "..." như textarea thông thường.
Cách tiếp cận: giả lập ClipboardEvent với DataTransfer chứa text prompt. Slate intercept paste event ở tầng React, nghĩa là đường paste-event là cách đáng tin cậy nhất để inject text mà không phải chiến đấu với state machine nội bộ của editor.
const dataTransfer = new DataTransfer()
dataTransfer.setData('text/plain', prompt)
const pasteEvent = new ClipboardEvent('paste', {
bubbles: true, cancelable: true, composed: true,
clipboardData: dataTransfer,
})
promptInput.dispatchEvent(pasteEvent)
Nếu paste path thất bại, chúng tôi fallback sang execCommand('insertText') từng ký tự một.
2. Fingerprinting và User-Agent
Chạy automation trên web app có nguy cơ kích hoạt bot detection. Flow nằm sau reCAPTCHA Enterprise và có session monitoring riêng.
Các biện pháp:
- Persistent user-agent — tạo một lần khi cài đặt theo pattern Chrome/macOS thực tế, lưu ra file, tái sử dụng qua các lần restart
- Electron fingerprint spoofing — override
navigator.platform,navigator.hardwareConcurrency, canvas fingerprint, và WebGL renderer string qua preload script inject trước khi trang load - reCAPTCHA serialization — Google đánh dấu concurrent token request từ cùng session là
UNUSUAL_ACTIVITY. Chúng tôi serialize tất cả reCAPTCHA solve bằng mutex để chỉ có một token in-flight tại một thời điểm.
3. Headless API Path
Ngoài DOM automation, chúng tôi cũng reverse-engineer Flow's internal API từ network traffic: gọi thẳng aisandbox-pa.googleapis.com với payload structure giống web UI dùng. Path này bypass DOM hoàn toàn và nhanh hơn đáng kể.
Đánh đổi: cần reCAPTCHA token hợp lệ cho mỗi request, và Google thỉnh thoảng thay đổi cấu trúc endpoint.
4. Theo Dõi Tile
Flow render media dưới dạng "tile" trong grid. Mỗi tile có attribute data-tile-id. Chúng tôi snapshot tile ID trước khi click Generate, rồi watch để phát hiện tile ID mới — đó là cách match tile với prompt trong concurrent batch.
const beforeTileIds = getAllTileIds()
generateButton.click()
const newTileId = await waitForNewTile(beforeTileIds, 5000)
III. Tại Sao Giữ Nội Bộ
Tool này tồn tại trong vùng xám. Nó tự động hóa một sản phẩm của Google không có official API. Chúng tôi dùng nó cho các workflow production nội bộ — không phân phối, không open-source.
Công việc reverse-engineering cũng fragile: Flow cập nhật UI và internal API định kỳ, và tool cần được bảo trì theo.
Nếu Google ra official Flow API có batch support, tool này sẽ lỗi thời. Đến lúc đó, nó vẫn hoạt động tốt.