Implemente essas melhorias: Analisando seu código ...

创建于:2025年8月21日

使用 GPT-5 Thinking 回答 Chat01

问题

Implemente essas melhorias: Analisando seu código e os exemplos de requisições curl, identifiquei várias possíveis causas para a "degradação da inteligência" quando as requisições são feitas pelo script versus o frontend:

Problemas Identificados e Soluções

1. Headers Incompletos/Incorretos

O script não está enviando todos os headers importantes que o frontend envia:

python
# Headers mais completos baseados no curl COMPLETE_HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Accept": "*/*", "Accept-Language": "pt-BR,pt;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", "Accept-Encoding": "gzip, deflate, br, zstd", "Origin": "https://www.genspark.ai", "Referer": "https://www.genspark.ai/agents?type=moa_chat", "Content-Type": "application/json", "Priority": "u=1, i", "Sec-Ch-Ua": '"Not;A=Brand";v="99", "Microsoft Edge";v="139", "Chromium";v="139"', "Sec-Ch-Ua-Mobile": "?0", "Sec-Ch-Ua-Platform": '"Windows"', "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Storage-Access": "active", # Headers importantes que estavam faltando: "Request-Id": f"|{uuid.uuid4().hex[:32]}.{uuid.uuid4().hex[:16]}", "Traceparent": f"00-{uuid.uuid4().hex[:32]}-{uuid.uuid4().hex[:16]}-01", }

2. Token reCAPTCHA Comprometido

O token hardcoded que você está usando pode estar expirado ou marcado como suspeito. Tokens reCAPTCHA têm vida útil limitada e são vinculados a sessões específicas.

3. Estrutura do Payload Incorreta

Comparando com o curl, o payload real tem diferenças sutis:

python
def build_improved_payload(prompt: str, model: str, token: str) -> Dict[str, Any]: """Payload melhorado baseado na análise do curl""" return { "type": "COPILOT_MOA_CHAT", "current_query_string": "type=COPILOT_MOA_CHAT", "project_id": None, # Pode precisar de um ID válido "messages": [ {"role": "user", "content": prompt} ], "user_s_input": prompt, "action_params": {}, "extra_data": { "models": [model], # Certifique-se de que o modelo está correto "run_with_another_model": False, "request_web_knowledge": False, # Tente False primeiro "speed_mode": False, "writingContent": None }, "g_recaptcha_token": token }

4. Implementação Melhorada com Requests

python
import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry def create_session_with_retries(): """Cria uma sessão com retry e configurações otimizadas""" session = requests.Session() # Configurar retry strategy retry_strategy = Retry( total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504], ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("http://", adapter) session.mount("https://", adapter) return session def send_chat_request_improved(prompt: str, cookies: Dict[str, str], model: str, token: str) -> str: """Versão melhorada do envio de requisição""" session = create_session_with_retries() # Preparar cookies como string (formato do curl) cookie_string = "; ".join([f"{k}={v}" for k, v in cookies.items()]) # Headers completos headers = COMPLETE_HEADERS.copy() headers["Cookie"] = cookie_string # Payload melhorado payload = build_improved_payload(prompt, model, token) try: response = session.post( GENSPARK_API_URL, json=payload, headers=headers, stream=True, timeout=30 ) response.raise_for_status() # Processar SSE return process_sse_stream(response) except requests.exceptions.RequestException as e: print(f"[ERRO] Requisição falhou: {e}") return "" finally: session.close()

5. Detecção de Bot - Solução com undetected-chromedriver

python
# pip install undetected-chromedriver import undetected_chromedriver as uc def get_undetected_driver(): """Driver Chrome não detectável""" options = uc.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") driver = uc.Chrome(options=options, version_main=139) # Versão do Chrome return driver

6. Diagnóstico do Problema

Adicione este código para debugar as respostas:

python
def debug_response(response): """Debug detalhado da resposta""" print(f"Status Code: {response.status_code}") print(f"Headers: {dict(response.headers)}") # Verificar se há mensagens de erro ou avisos try: if response.headers.get('content-type', '').startswith('application/json'): data = response.json() print(f"Response JSON: {json.dumps(data, indent=2)}") except: print(f"Response Text (primeiros 500 chars): {response.text[:500]}")

Recomendações Principais:

  1. Use tokens frescos: Obtenha um novo token para cada requisição
  2. Mantenha sessão: Use a mesma sessão para múltiplas requisições
  3. Adicione delays: Espere 2-3 segundos entre requisições
  4. Valide cookies: Certifique-se de que os cookies estão válidos e não expirados
  5. Use proxy: Considere usar proxies rotativos para evitar rate limiting

O problema principal provavelmente é a detecção de automação pela Genspark, que resulta em respostas de qualidade inferior como medida de proteção. A solução mais eficaz seria usar undetected-chromedriver ou implementar uma solução que simule melhor o comportamento humano. no código a seguir, e em seu output envie somente o codigo completo: # -- coding: utf-8 --

GenSpark AI Chat Automator — Captcha Token Automático + Chat CLI

Recursos:

- Automação de chat com a API da GenSpark AI.

- Obtenção automática do 'g_recaptcha_token' via Playwright.

- Configuração de cookies e modelo de IA.

- Interface de chat via linha de comando (CLI) com streaming de respostas.

- Análise de respostas em formato Server-Sent Events (SSE).

Observação: este script usa Playwright, Selenium e requests. Instale as dependências:

pip install "playwright>=1.41" "requests>=2.30" "selenium>=4.15"

playwright install chromium

import asyncio
import json
import sys
import uuid
from typing import Dict, Any, List, Optional

import requests
from playwright.async_api import async_playwright, Route, TimeoutError as PwTimeout
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import json

==============================================================================

0) CONFIGURAÇÕES — COOKIES E MODELO

==============================================================================

COLOQUE SEUS COOKIES AQUI.

Você pode obtê-los no painel de Desenvolvedor do seu navegador (F12),

na aba "Rede" (Network), selecionando uma requisição para "genspark.ai".

COOKIES: Dict[str, str] = {
"i18n_set": "pt-BR",
"_gcl_au": "1.1.62685151.1755263695",
"_ga": "GA1.1.203885191.1755263695",
"_fbp": "fb.1.1755263695001.392179771727185719",
"ai_user": "jmhDbMDM2CtNJcLJVKd5+P|2025-08-15T13:14:55.764Z",
"session_id": "7710c7ce-93c5-46a6-87b9-f357244261e8:67e4794fc2090448254ddd5f9403b4f3a715c1305ada00b8bf8648b4789a9abb",
"agree_terms": "1",
"c1": "23prrvC53bbtTkczLz7xiY8WmSUbjijYnJiMxDM9aQJotIta0Ha%2B8nECeL8T%2BQ%2FCdfePgvv6SBff7FRTQKYDirxgsPa15%2BK2uCsqzuEM%2BaQ1iE8Z",
"c2": "2T8q%2BGSrJGwzDzot",
"gslogin": "1",
"ai_session": "wWAFgxi+KmF3F9fWVo2sN2|1755772657326|1755772849339",
# "_ga_VL3SBJ0Y0F": "", # Opcional, pode ser omitido
}

Modelo padrão a ser usado na API.

DEFAULT_MODEL = "gpt-5-high"

Configurações para melhorar qualidade das respostas

MAX_TOKENS = 4096
TEMPERATURE = 0.7
TOP_P = 0.9

Token reCAPTCHA - você pode definir aqui se souber o token

Se deixar vazio, o script tentará obter automaticamente via Playwright

HARDCODED_RECAPTCHA_TOKEN = "0cAFcWeA6wfi2U4nvOUDiiDL1989SEId1eT9S5-yQYYRDpgYuckxCqoVUrs9HUYQJPAiYjMlS0eyA7X8GRswe94CcmYmZ3fhN2Ilqdep_w1Ky5_yzrnrUuuUU4Tw9Oo2oKBknvvYYeJlMuJII-dGiSD1jCBwJL8hz5LZQLaf2M6-ZYfp82AUDAMX-PtPOnzcJOe-GWArSxs4E-_vWEz81tFoQA0KLm4zO4026oSrBHCpoIfed4W1f675SKoMbjB3ZC8QnCZXPmF8GEZakT2WAbvAOO0W5nZthgAW-VErOBVIxp-MipiRzVacTLlyciPUvRy4ESo93pXaat5mp5Q2mtcRp0dTxF72rLYVE47Jnvi9T7UHgyr4Tn8oa7VJWbRu6V_MSIbZZ0lc0Nb8g4NzwKwhmdwLoMnvx0LPKtx99JchMYAnNmALc0yHETAqWdIRJRVqD62pf85HRuCf3dsdApml74bjZT2Hp_A0BKer2kh0R1NKierhcsJXkmm5mBILe9YvrKEJMB2EVuZLTRE6Ek8yHqfGtAlIi1qIVPkBuBB1U0fESsIwmxpoDyRi9iPNQc-df1XY6fn8vICJD-nLwo7a2Vn3hiTb_2_mZccfKYxJRw-S4nbFg5av0cGaXLwxx_wYhTDbIIrmjSavolP1Jt9FWM_OEnfa3iFzRzTTG7L0epV3Sa5sNgvjbHLztF8MjlytKEqVIOjVNrE7TKrK1ihWDN9ekmFEmWuEqaUC1bkq5fXUpRtn5zESoZqHSMF3SxLJWLcQoHYqOgYkQ3mfBb8R6_b6OQfV56G8LBbGjW8e6BRjZ6xykhMpOrjSOWzt3DtcXPvGFT6Vgb9A6QHeEewyirNjSz62hzmiekgzf2bc9RgryCI82FIe61YcimbFYr6GweHcPt_Tpym6FODz3tyvdgD6b6oufCOA1nkAzTv0Y6E7I-UOXRUSkYutIbUPl9XU0G1-05AKAqwsW_PnEA4xkkCx0EU1OVAxhTsuDxq7TqPHbF6rkOi4novnhFWWeylG-oI_5s-JE2JqxkTlNbArp--fjtbev3j_aeyeI6TNUWsOJ3pCTeWHhHQDEbLfsk9Z0qrpzfizGB2DtDliT6hd1Ab6Pjxkzqh72bM33EkfeX1q_0KJv4zmoDws5cTPvh1-BFsScwPxNoDUrUo7jrtJbBGaTZrhdhnxjC9DB-c5t7ZsUs_SSUMV1DdhxqsoKKoo4Vy88r8cOi5BjunOlf11WwIdJXTBYeMf_YsKnVcHwdD7U27Rk359jY9975N30G9EYAOdd7rARBZROBsSktbURphtsNa61r5Kx59ClaxhvSYJnAhWd5tGvqb7HujTi5ZX_tetLPnJsMeR5vApxeV3OI7-bIu1-24iQe97qLfXTlMLVjMrnU5fh91Ye3VTd9AKNcG5aYzo8sgMQbV51giJg3IYMWOvZe_nhu9Y4WkJZysQhW3zRjGif2I0_znvAsQ0idbAHqYyGGkk-DdYZH6o5M-LnC-XDwHsGVgANfi9fJP5kPip-zbWGh-gidLreaS3w698DvLxNUqkw_IDk05ZCKZ4ELxFsRV4pWnfO-4AOeaSzf4f6lxwM"

Histórico de conversa para manter contexto

conversation_history = []

URLs da GenSpark

GENSPARK_CHAT_URL = "https://www.genspark.ai/copilot"
GENSPARK_API_URL = "https://www.genspark.ai/api/copilot/ask"

Headers base para as requisições

BASE_HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0",
"Accept": "/",
"Accept-Language": "pt-BR,pt;q=0.9,en;q=0.8,en-US;q=0.7",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Origin": "https://www.genspark.ai",
"Referer": GENSPARK_CHAT_URL,
"Sec-Ch-Ua": '"Not;A=Brand";v="99", "Microsoft Edge";v="139", "Chromium";v="139"',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": '"Windows"',
"Sec-Ch-Ua-Platform-Version": '"15.0.0"',
"Sec-Ch-Ua-Arch": '"x86"',
"Sec-Ch-Ua-Bitness": '"64"',
"Sec-Ch-Ua-Full-Version": '"139.0.0.0"',
"Sec-Ch-Ua-Full-Version-List": '"Not;A=Brand";v="99.0.0.0", "Microsoft Edge";v="139.0.0.0", "Chromium";v="139.0.0.0"',
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-User": "?1",
"Sec-Fetch-Storage-Access": "active",
"Content-Type": "application/json",
"Priority": "u=1, i",
"Upgrade-Insecure-Requests": "1",
}

==============================================================================

1) OBTENÇÃO AUTOMÁTICA DO g_recaptcha_token (via Playwright)

==============================================================================

async def get_recaptcha_token(cookies: Dict[str, str], headless: bool = True) -> Optional[str]:
print("[Playwright] Iniciando navegador para obter token reCAPTCHA...")
token_captured = asyncio.Event()
captured_token: Optional[str] = None

text
async def route_handler(route: Route): nonlocal captured_token req = route.request # Intercepta o POST do chat para extrair o token if req.url == GENSPARK_API_URL and req.method == "POST": try: data = await req.post_data_json() tok = data.get("g_recaptcha_token") if tok: print("[Playwright] Token reCAPTCHA capturado com sucesso.") captured_token = tok token_captured.set() await route.abort() # aborta para não consumirmos quota/ação return except Exception as e: print(f"[Playwright] Erro ao processar POST do chat: {e}") await route.continue_() p = browser = context = page = None try: p = await async_playwright().start() browser = await p.chromium.launch(headless=headless, args=["--disable-blink-features=AutomationControlled"]) context = await browser.new_context( user_agent=BASE_HEADERS["User-Agent"], locale="pt-BR", # combina com seus cookies timezone_id="America/Sao_Paulo", # opcional, mas ajuda a parecer "humano" viewport={"width": 1366, "height": 768} ) # Aplica cookies (sem depender do placeholder em inglês) await context.add_cookies([ {"name": k, "value": v, "domain": ".genspark.ai", "path": "/"} for k, v in cookies.items() if v ]) page = await context.new_page() await page.route("**/*", route_handler) # Carrega a página e espera a app SPA estabilizar await page.goto(GENSPARK_CHAT_URL, wait_until="domcontentloaded") await page.wait_for_load_state("networkidle") # aguarda bundles/SPA # Alguns sites mostram banner de cookies/termos; tente fechar se existir (opcional e tolerante a erro) try: # Procura qualquer botão com texto "Aceitar/Accept/OK" (português/inglês) btn = page.get_by_role("button", name=re.compile(r"(aceit|accept|ok|entendi)", re.I)).first if await btn.is_visible(): await btn.click() except Exception: pass # Localizador do campo de entrada — agnóstico de idioma e do tipo (textarea ou contenteditable) # Preferimos role="textbox" (Playwright mapeia automaticamente). textbox = page.get_by_role("textbox").first # Fallback: procura manualmente por elementos comuns de chat async def ensure_textbox(): nonlocal textbox try: await textbox.wait_for(state="visible", timeout=10000) return True except PwTimeout: pass # Tenta padrões alternativos candidates = [ 'textarea', '[contenteditable="true"]', 'div[contenteditable="true"]', 'form textarea', ] for sel in candidates: loc = page.locator(sel).first try: await loc.wait_for(state="visible", timeout=3000) textbox = loc return True except PwTimeout: continue return False ok = await ensure_textbox() if not ok: raise PwTimeout("Campo de entrada do chat não encontrado (nem textbox/textarea/contenteditable).") # Digita e envia a mensagem para disparar o POST com o token try: await textbox.click() # Algumas implementações de contenteditable não suportam fill() try: await textbox.fill("Olá") except Exception: await page.keyboard.type("Olá", delay=50) # Tente clicar em um botão "Enviar/Send" se existir; senão, Enter try: send_btn = page.get_by_role("button", name=re.compile(r"(enviar|send|ask|falar)", re.I)).first if await send_btn.is_visible(): await send_btn.click() else: await page.keyboard.press("Enter") except Exception: await page.keyboard.press("Enter") except Exception as e: raise RuntimeError(f"Falha ao interagir com a UI do chat: {e}") # Aguarda o token capturado pela rota await asyncio.wait_for(token_captured.wait(), timeout=45) return captured_token except asyncio.TimeoutError: print("[Playwright] ERRO: Timeout ao esperar pelo token. A página pode ter mudado, login expirou ou há um desafio adicional (ex.: captcha visível).") return None except Exception as e: print(f"[Playwright] ERRO: Ocorreu uma exceção inesperada: {e}") return None finally: if context: await context.close() if browser: await browser.close() if p: await p.stop() print("[Playwright] Navegador finalizado.")

==============================================================================

2) CLIENTE DA API GENSPARK

==============================================================================

def build_api_payload(prompt: str, model: str, g_recaptcha_token: str, include_history: bool = True) -> Dict[str, Any]:
"""Constrói o corpo (payload) da requisição para a API de chat."""
global conversation_history

text
# Adicionar a mensagem atual ao histórico conversation_history.append({"role": "user", "content": prompt}) # Limitar o histórico para evitar payloads muito grandes (últimas 20 mensagens) if len(conversation_history) > 20: conversation_history = conversation_history[-20:] # Usar todo o histórico ou apenas a mensagem atual messages = conversation_history if include_history else [{"role": "user", "content": prompt}] return { "type": "COPILOT_MOA_CHAT", "current_query_string": "type=COPILOT_MOA_CHAT", "project_id": None, "messages": messages, "user_s_input": prompt, "action_params": {}, "extra_data": { "models": [model], "run_with_another_model": False, "request_web_knowledge": True, "speed_mode": False, "writingContent": None, "temperature": TEMPERATURE, "top_p": TOP_P, "max_tokens": MAX_TOKENS, }, "g_recaptcha_token": g_recaptcha_token, }

def process_sse_stream(response: requests.Response) -> str:
"""
Processa a resposta SSE (Server-Sent Events), imprime os pedaços de texto
em tempo real e retorna a resposta completa.
"""
full_text = ""
try:
for line in response.iter_lines(decode_unicode=True):
if line.startswith("data:"):
data_str = line[len("data:"):].strip()
if not data_str or data_str == "[DONE]":
continue
try:
data_json = json.loads(data_str)
# Heurística para encontrar o pedaço de texto
chunk = data_json.get("content", "") or data_json.get("text", "")
if isinstance(chunk, str):
print(chunk, end="", flush=True)
full_text += chunk
except json.JSONDecodeError:
# Ignora linhas que não são JSON válido
pass
except Exception as e:
print(f"\n[API] Erro durante o streaming da resposta: {e}")

text
print() # Nova linha no final return full_text

def send_chat_request_selenium(prompt: str, cookies: Dict[str, str], model: str, token: str) -> str:
"""Envia a requisição de chat usando Selenium (navegador real) para evitar detecção."""
print("[Selenium] Iniciando navegador para fazer requisição...")

text
driver = None try: # Configurar opções do Chrome options = Options() options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) options.add_argument("--disable-extensions") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-gpu") options.add_argument("--window-size=1366,768") options.add_argument(f"--user-agent={BASE_HEADERS['User-Agent']}") # Inicializar driver driver = webdriver.Chrome(options=options) # Definir cookies driver.get("https://www.genspark.ai") for k, v in cookies.items(): if v: driver.add_cookie({"name": k, "value": v, "domain": ".genspark.ai"}) # Construir payload com histórico payload = build_api_payload(prompt, model, token, include_history=True) # Debug: mostrar histórico sendo enviado print(f"[DEBUG] Enviando histórico com {len(payload['messages'])} mensagens") for i, msg in enumerate(payload['messages']): print(f"[DEBUG] Msg {i+1}: {msg['role']} - {msg['content'][:30]}...") # Executar requisição via JavaScript script = f""" return fetch('{GENSPARK_API_URL}', {{ method: 'POST', headers: {{ 'Content-Type': 'application/json', 'User-Agent': '{BASE_HEADERS["User-Agent"]}', 'Accept': '*/*', 'Accept-Language': 'pt-BR,pt;q=0.9,en;q=0.8,en-US;q=0.7', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Origin': 'https://www.genspark.ai', 'Referer': 'https://www.genspark.ai/copilot', 'Sec-Ch-Ua': '"Not;A=Brand";v="99", "Microsoft Edge";v="139", "Chromium";v="139"', 'Sec-Ch-Ua-Mobile': '?0', 'Sec-Ch-Ua-Platform': '"Windows"', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin' }}, body: JSON.stringify({json.dumps(payload)}) }}).then(response => response.text()); """ # Executar e aguardar resposta response_text = driver.execute_script(script) # Processar resposta (simular streaming) try: # Tentar parse do JSON se for uma resposta SSE lines = response_text.split('\n') full_text = "" for line in lines: if line.startswith("data:"): data_str = line[len("data:"):].strip() if not data_str or data_str == "[DONE]": continue try: data_json = json.loads(data_str) chunk = data_json.get("content", "") or data_json.get("text", "") if isinstance(chunk, str): print(chunk, end="", flush=True) full_text += chunk except json.JSONDecodeError: pass print() # Nova linha # Adicionar resposta da IA ao histórico if full_text.strip(): conversation_history.append({"role": "assistant", "content": full_text.strip()}) return full_text except Exception: # Se não for SSE, retornar texto bruto print(response_text) return response_text except Exception as e: print(f"\n[Selenium] ERRO: {e}") return "" finally: if driver: driver.quit() print("[Selenium] Navegador finalizado.")

def get_recaptcha_token_selenium(cookies: Dict[str, str]) -> Optional[str]:
"""Obtém o token reCAPTCHA automaticamente usando Selenium."""
print("[Selenium] Tentando obter token reCAPTCHA automaticamente...")

text
driver = None try: # Configurar opções do Chrome options = Options() options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) options.add_argument("--disable-extensions") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-gpu") options.add_argument("--window-size=1366,768") options.add_argument(f"--user-agent={BASE_HEADERS['User-Agent']}") # Inicializar driver driver = webdriver.Chrome(options=options) # Definir cookies driver.get("https://www.genspark.ai") for k, v in cookies.items(): if v: driver.add_cookie({"name": k, "value": v, "domain": ".genspark.ai"}) # Recarregar a página com os cookies driver.get(GENSPARK_CHAT_URL) time.sleep(3) # Aguardar carregamento # Tentar encontrar e interagir com o chat try: # Procurar campo de entrada input_selectors = [ 'textarea', '[contenteditable="true"]', 'div[contenteditable="true"]', 'form textarea', 'input[type="text"]', '.chat-input', '.message-input' ] textbox = None for selector in input_selectors: try: elements = driver.find_elements(By.CSS_SELECTOR, selector) for element in elements: if element.is_displayed() and element.is_enabled(): textbox = element break if textbox: break except: continue if not textbox: print("[Selenium] Campo de entrada não encontrado") return None # Focar no campo textbox.click() time.sleep(1) # Digitar mensagem de teste textbox.send_keys("teste") time.sleep(1) # Procurar botão de enviar send_selectors = [ 'button[type="submit"]', 'button:has-text("enviar")', 'button:has-text("send")', 'button:has-text("ask")', '.send-button', '.submit-button' ] send_button = None for selector in send_selectors: try: elements = driver.find_elements(By.CSS_SELECTOR, selector) for element in elements: if element.is_displayed() and element.is_enabled(): send_button = element break if send_button: break except: continue if send_button: send_button.click() else: # Tentar Enter textbox.send_keys('\n') # Aguardar um pouco para a requisição ser enviada time.sleep(5) # Verificar se conseguimos interceptar o token # Como não podemos interceptar requisições facilmente no Selenium, # vamos assumir que se chegou aqui, o token foi usado # Para uma implementação completa, seria necessário usar um proxy print("[Selenium] Não foi possível interceptar o token automaticamente") return None except Exception as e: print(f"[Selenium] Erro ao interagir com a página: {e}") return None except Exception as e: print(f"[Selenium] Erro geral: {e}") return None finally: if driver: driver.quit()

def send_chat_request(prompt: str, cookies: Dict[str, str], model: str, token: str) -> str:
"""Envia a requisição de chat usando Selenium (fallback para requests)."""
return send_chat_request_selenium(prompt, cookies, model, token)

==============================================================================

3) CLI — CONVERSA INTERATIVA

==============================================================================

async def chat_cli():
"""Loop principal para a interface de linha de comando."""
print("=== GenSpark AI CLI ===")
print("Comandos: /quit, /exit, /clear, /history")
print(f"Modelo atual: {DEFAULT_MODEL}")

text
while True: try: user_input = input("\nVocê> ").strip() except (KeyboardInterrupt, EOFError): print("\nEncerrando.") break if not user_input: continue if user_input.lower() in ("/quit", "/exit"): print("Até mais!") break elif user_input.lower() == "/clear": conversation_history = [] print("Histórico de conversa limpo!") continue elif user_input.lower() == "/history": if not conversation_history: print("Histórico vazio.") else: print(f"Histórico ({len(conversation_history)} mensagens):") for i, msg in enumerate(conversation_history, 1): role = "Você" if msg["role"] == "user" else "IA" print(f"{i}. {role}: {msg['content'][:50]}...") continue # 1. Obter o token reCAPTCHA para esta mensagem # Primeiro tentar obter automaticamente com Selenium token = None try: token = get_recaptcha_token_selenium(COOKIES) except Exception as e: print(f"[INFO] Não foi possível obter token automaticamente: {e}") # Se não conseguiu automaticamente, usar hardcoded se disponível if not token and HARDCODED_RECAPTCHA_TOKEN: token = HARDCODED_RECAPTCHA_TOKEN print("[INFO] Usando token hardcoded") # Se ainda não tem token, tentar com Playwright if not token: try: token = await get_recaptcha_token(COOKIES) except Exception as e: print(f"[INFO] Não foi possível obter token com Playwright: {e}") if not token: print("[ERRO] Não foi possível obter o token reCAPTCHA. Tente novamente.") print("[DICA] Defina HARDCODED_RECAPTCHA_TOKEN no início do script ou verifique se os cookies estão corretos e válidos.") continue # 2. Enviar a mensagem para a API print(f"GenSpark ({DEFAULT_MODEL})> ", end="", flush=True) send_chat_request(user_input, COOKIES, DEFAULT_MODEL, token)

==============================================================================

4) PONTO DE ENTRADA (MAIN)

==============================================================================

if name == "main":
if not COOKIES.get("session_id") or not COOKIES.get("ai_user"):
print("ERRO DE CONFIGURAÇÃO:")
print("Por favor, preencha os valores de 'session_id' e 'ai_user' no dicionário COOKIES no início do script.")
sys.exit(1)

text
try: asyncio.run(chat_cli()) except Exception as e: print(f"\nOcorreu um erro fatal no loop principal: {e}") # Tenta executar no loop de evento existente, caso esteja em um ambiente como IPython/Jupyter try: loop = asyncio.get_running_loop() if loop.is_running(): print("Tentando agendar em um loop de evento já em execução...") task = loop.create_task(chat_cli()) loop.run_until_complete(task) except RuntimeError: pass # Se não houver loop, o programa termina

分享这个问答