如何将Google reCAPTCHA从PC端同步至手机端完成验证
解决方案
先搞懂核心逻辑
reCAPTCHA和当前请求的会话Cookie是绑定死的,直接把验证链接发手机没用——手机浏览器没PC端的Cookie,验证完PC程序也认不了。正确路子是:
- PC端检测到触发验证时,把验证需要的关键信息(比如网站的reCAPTCHA密钥、当前会话ID、目标页面地址)传给手机
- 手机端加载验证组件完成验证,把生成的**验证令牌(g-recaptcha-response)**传回PC
- PC把令牌填回原请求里,程序就能继续跑了
PC端Python实现步骤
1. 检测验证触发
用Selenium或者Requests库请求页面时,判断有没有reCAPTCHA元素:
from selenium import webdriver import time driver = webdriver.Chrome() driver.get("目标网站URL") # 检查是否出现reCAPTCHA if driver.find_elements_by_class_name("g-recaptcha"): # 提取关键参数:网站的reCAPTCHA密钥、当前会话Cookie、目标页面地址 site_key = driver.find_element_by_class_name("g-recaptcha").get_attribute("data-sitekey") session_cookies = driver.get_cookies() target_url = driver.current_url # 接下来要等手机传验证结果,先搭个接收通道
2. 搭PC和手机的通信通道
推荐用本地HTTP服务(比如Flask)或者WebSocket,这里给个Flask的简单例子:
from flask import Flask, request import threading app = Flask(__name__) verification_token = None # 接收手机传回的验证令牌 @app.route('/send-token', methods=['POST']) def receive_token(): global verification_token verification_token = request.json.get('token') return {"ok": True} # 后台启动HTTP服务,让手机能访问到 threading.Thread(target=app.run, kwargs={'host': '0.0.0.0', 'port': 5000}, daemon=True).start() # 循环等结果,拿到令牌就继续 while verification_token is None: time.sleep(1) # 把令牌塞回页面的reCAPTCHA输入框,提交表单 driver.execute_script(f'document.getElementById("g-recaptcha-response").value = "{verification_token}";') driver.find_element_by_id("提交按钮ID").click()
Flutter手机端实现步骤
1. 从PC端拿验证任务
先通过HTTP请求获取PC那边的验证参数(要确保PC和手机在同一局域网,用PC的局域网IP访问):
import 'package:http/http.dart' as http; import 'dart:convert'; // 替换成你的PC局域网IP final pcIp = "192.168.1.100"; final response = await http.get(Uri.parse('http://$pcIp:5000/get-task')); final taskData = jsonDecode(response.body); final siteKey = taskData['site_key']; final targetUrl = taskData['target_url'];
2. 完成reCAPTCHA验证
用flutter_recaptcha_v2插件来做验证,比自己搭网页方便:
import 'package:flutter_recaptcha_v2/flutter_recaptcha_v2.dart'; // 弹出验证窗口 final recaptcha = RecaptchaV2( siteKey: siteKey, url: targetUrl, ); final token = await recaptcha.showDialog(context); // 验证成功就把令牌发回PC if (token != null) { await http.post( Uri.parse('http://$pcIp:5000/send-token'), body: jsonEncode({'token': token}), headers: {'Content-Type': 'application/json'}, ); }
几个要注意的点
- 必须保证PC和手机在同一局域网,或者用公网MQTT服务中转,不然手机连不上PC的HTTP服务
- 有些网站会验证Cookie的一致性,如果遇到验证失败,可以把PC端的Cookie传给手机,手机验证时带上这些Cookie
- 别频繁刷请求,加个随机延迟、模拟滚动页面这些操作,能减少触发reCAPTCHA的概率
内容的提问来源于stack exchange,提问作者Rodolfo
相关产品推荐
相关产品推荐

