Tự động hóa trình duyệt trên thiết bị di động gặp phải các CAPTCHA giống như trên máy tính để bàn — hộp kiểm reCAPTCHA, thử thách Cloudflare, lưới hình ảnh — nhưng cũng phải đối mặt với các vấn đề đặc biệt dành riêng cho thiết bị di động như bố cục phản hồi, tương tác chỉ bằng cảm ứng và các dấu vân tay Tác nhân người dùng khác nhau.CaptchaAIxử lý việc giải quyết bất kể bối cảnh thiết bị.
Hướng dẫn này bao gồm hai cách tiếp cận: Selenium với Chrome dành cho Android thông qua ADB và mô phỏng di động của Playwright trên máy tính để bàn.
Kịch bản thế giới thực
Bạn đang tự động hóa việc gửi biểu mẫu trên trang web được tối ưu hóa cho thiết bị di động phục vụ reCAPTCHA v2. Trang web phát hiện Tác nhân người dùng trên thiết bị di động và hiển thị bố cục CAPTCHA dành riêng cho thiết bị di động. Bạn cần giải CAPTCHA và gửi biểu mẫu từ ngữ cảnh trình duyệt trên thiết bị di động.
Cách tiếp cận 1: Mô phỏng Playwright trên thiết bị di động (Python)
Mô phỏng thiết bị của Playwright là cách đơn giản nhất để tự động hóa trình duyệt di động bằng tính năng giải CAPTCHA — không cần thiết bị vật lý:
# playwright_mobile_captcha.py
import asyncio
import httpx
from playwright.async_api import async_playwright
API_KEY = "YOUR_API_KEY"
async def solve_recaptcha(sitekey: str, pageurl: str) -> str:
"""Submit reCAPTCHA v2 to CaptchaAI and poll for result."""
async with httpx.AsyncClient(timeout=180) as client:
# Submit task
resp = await client.get(
"https://ocr.captchaai.com/in.php",
params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": "1",
},
)
result = resp.json()
if result["status"] != 1:
raise Exception(f"Submit failed: {result['request']}")
task_id = result["request"]
# Poll for result
for _ in range(30):
await asyncio.sleep(5)
poll = await client.get(
"https://ocr.captchaai.com/res.php",
params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": "1",
},
)
poll_result = poll.json()
if poll_result["status"] == 1:
return poll_result["request"]
if poll_result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Solve failed: {poll_result['request']}")
raise Exception("Polling timeout")
async def main():
async with async_playwright() as p:
# Launch with iPhone 13 emulation
iphone = p.devices["iPhone 13"]
browser = await p.chromium.launch(headless=False)
context = await browser.new_context(**iphone)
page = await context.new_page()
await page.goto("https://example.com/mobile-form")
await page.wait_for_selector(".g-recaptcha", timeout=10000)
# Extract sitekey
sitekey = await page.get_attribute(".g-recaptcha", "data-sitekey")
pageurl = page.url
print(f"Found sitekey: {sitekey}")
# Solve via CaptchaAI
token = await solve_recaptcha(sitekey, pageurl)
print(f"Token received: {token[:50]}...")
# Inject token
await page.evaluate(f"""
document.getElementById('g-recaptcha-response').value = '{token}';
document.getElementById('g-recaptcha-response').style.display = '';
""")
# Trigger callback if it exists
await page.evaluate(f"""
try {{
const clients = ___grecaptcha_cfg.clients;
Object.keys(clients).forEach(k => {{
Object.keys(clients[k]).forEach(j => {{
if (clients[k][j] && clients[k][j].callback) {{
clients[k][j].callback('{token}');
}}
}});
}});
}} catch(e) {{}}
""")
# Submit form
await page.click('button[type="submit"]')
await page.wait_for_load_state("networkidle")
print("Form submitted successfully")
await browser.close()
asyncio.run(main())
Cách tiếp cận 2: Selenium với Mô phỏng di động (JavaScript)
Sử dụng Selenium với mô phỏng di động Giao thức DevTools của Chrome cho quy trình làm việc của Node.js:
// selenium_mobile_captcha.js
const { Builder, By, until } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
async function solveCaptcha(sitekey, pageurl) {
// Submit task
const submitResp = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: API_KEY,
method: 'userrecaptcha',
googlekey: sitekey,
pageurl: pageurl,
json: '1',
},
});
if (submitResp.data.status !== 1) {
throw new Error(`Submit failed: ${submitResp.data.request}`);
}
const taskId = submitResp.data.request;
// Poll for result
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 5000));
const pollResp = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: '1' },
});
if (pollResp.data.status === 1) return pollResp.data.request;
if (pollResp.data.request !== 'CAPCHA_NOT_READY') {
throw new Error(`Solve failed: ${pollResp.data.request}`);
}
}
throw new Error('Polling timeout');
}
async function main() {
// Configure mobile emulation
const mobileEmulation = {
deviceMetrics: { width: 390, height: 844, pixelRatio: 3.0 },
userAgent:
'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) ' +
'AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1',
};
const options = new chrome.Options();
options.setMobileEmulation(mobileEmulation);
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
try {
await driver.get('https://example.com/mobile-form');
await driver.wait(until.elementLocated(By.css('.g-recaptcha')), 10000);
// Extract sitekey
const captchaEl = await driver.findElement(By.css('.g-recaptcha'));
const sitekey = await captchaEl.getAttribute('data-sitekey');
const pageurl = await driver.getCurrentUrl();
console.log(`Sitekey: ${sitekey}`);
// Solve CAPTCHA
const token = await solveCaptcha(sitekey, pageurl);
console.log(`Token: ${token.substring(0, 50)}...`);
// Inject token
await driver.executeScript(`
document.getElementById('g-recaptcha-response').value = arguments[0];
`, token);
// Submit form
await driver.findElement(By.css('button[type="submit"]')).click();
console.log('Form submitted');
} finally {
await driver.quit();
}
}
main().catch(console.error);
Những cân nhắc dành riêng cho thiết bị di động
| Yếu tố | Máy tính để bàn | Điện thoại di động | Tác động đến CAPTCHA |
|---|---|---|---|
| Tác nhân người dùng | Chrome máy tính để bàn/Firefox | Safari di động/Chrome | Một số trang web cung cấp các cấu hình CAPTCHA khác nhau tùy theo thiết bị |
| Chế độ xem | 1920×1080+ | 390×844 | Tiện ích CAPTCHA có thể hiển thị khác |
| Sự kiện chạm | Sự kiện chuột | Sự kiện chạm | Một số CAPTCHA xác thực loại tương tác |
| Mạng | Băng thông rộng | 4G/5G | Có thể cần thời gian chờ lâu hơn |
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| CAPTCHA không hiển thị trong mô phỏng di động | Trang web phát hiện mô phỏng thông qua navigator.platform | Đặt ghi đè nền tảng trong Giao thức DevTools |
Không tìm thấy vùng văn bản g-recaptcha-response |
Bố cục trên thiết bị di động sử dụng kết xuất CAPTCHA khác nhau | Tìm kiếm vùng văn bản theo thuộc tính tên thay vì ID |
| Việc chèn mã thông báo hoạt động nhưng biểu mẫu vẫn không thành công | Máy chủ xác thực tính nhất quán của Tác nhân người dùng | Đảm bảo sử dụng cùng một Tác nhân người dùng để giải quyết và gửi biểu mẫu |
| Tải trang chậm trong mô phỏng | Các trang nặng về tài nguyên | Sử dụng cờ Chrome --disable-images để tăng tốc độ tải |
Câu hỏi thường gặp
Tôi nên sử dụng thiết bị di động thực hay mô phỏng?
Quá trình mô phỏng nhanh hơn để phát triển và các thiết bị CI/CD. Real thông qua Appium hoặc ADB sẽ tốt hơn cho các tình huống sản xuất có vấn đề về dấu vân tay.
CaptchaAI có cần biết đó là CAPTCHA trên thiết bị di động không?
Không. CaptchaAI giải quyết dựa trên khóa trang và URL trang. Sự khác biệt giữa thiết bị di động và máy tính để bàn không ảnh hưởng đến quá trình giải quyết.
Tôi có thể kết hợp mô phỏng di động với proxy không?
Vâng. Cả Playwright và Selenium đều hỗ trợ cấu hình proxy cùng với tính năng mô phỏng trên thiết bị di động. Chuyển proxy cho CaptchaAI để đảm bảo tính nhất quán.
bài viết liên quan
- Cách giải quyết cuộc gọi lại Recaptcha V2 bằng Api
- Zapier Captchaai Tự động hóa không cần mã
- Xử lý cửa quay Recaptcha V2 trên cùng một trang web
Các bước tiếp theo
Bắt đầu tự động hóa các luồng CAPTCHA trên thiết bị di động —lấy khóa API CaptchaAI của bạnvà tích hợp với ngăn xếp tự động hóa di động của bạn.
Hướng dẫn liên quan:
- Xử lý CAPTCHA trong Tự động hóa ứng dụng di động với Appium
- Phản ứng giải quyết CAPTCHA WebView gốc
- Trích xuất tham số reCAPTCHA từ nguồn trang