Spaces:
Paused
Paused
Update main.py
Browse files
main.py
CHANGED
|
@@ -6,170 +6,155 @@ from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
| 6 |
from seleniumbase import Driver
|
| 7 |
from selenium.webdriver.common.by import By
|
| 8 |
from pyvirtualdisplay import Display
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
|
| 10 |
-
# --- CONFIGURAÇÕES DE SESSÃO ---
|
| 11 |
MEUS_COOKIES = [
|
| 12 |
{"name": "pac_ocean", "value": "A55233B0"},
|
| 13 |
{"name": "HighwindFRPG", "value": "FVQCTfUiHPqufIN4zJcMPQ%3D%3D%3Cstrip%3E%24argon2id%24v%3D19%24m%3D7168%2Ct%3D4%2Cp%3D1%24bm1Ob0lmUWdSZEtHeklNVw%24L1Y8X1pEyJ5zX13VIK8oqNQcdHtwrdhvhHeseXSEhNA"},
|
| 14 |
{"name": "farmrpg_token", "value": "6tgeudskm32f0rlq6oputj0j1kd5f59nkdvolsdv"}
|
| 15 |
]
|
| 16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
class ServidorFalso(BaseHTTPRequestHandler):
|
| 18 |
def do_GET(self):
|
| 19 |
self.send_response(200)
|
| 20 |
self.end_headers()
|
| 21 |
-
self.wfile.write(b"Bot Farm RPG
|
| 22 |
def log_message(self, format, *args): pass
|
| 23 |
|
| 24 |
def manter_dock_viva():
|
| 25 |
HTTPServer(('0.0.0.0', 7860), ServidorFalso).serve_forever()
|
| 26 |
|
| 27 |
-
# ---
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
# Máquina de Estados Finitos (FSM - Memória Central)
|
| 35 |
-
self.estado = {
|
| 36 |
-
"stamina_esgotada": False,
|
| 37 |
-
"inventario_cheio": False,
|
| 38 |
-
"proxima_colheita": 0,
|
| 39 |
-
"ciclo_atual": 0
|
| 40 |
-
}
|
| 41 |
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
self.display.stop()
|
| 66 |
-
self.log("Navegador purgado da memória RAM.", "SISTEMA")
|
| 67 |
-
|
| 68 |
-
# --- MÓDULOS DE AÇÃO (Lógica Fechada) ---
|
| 69 |
-
def modulo_exploracao(self):
|
| 70 |
-
if self.estado["stamina_esgotada"]:
|
| 71 |
-
self.log("Estado: Stamina Esgotada. Ignorando a Floresta.", "DECISÃO")
|
| 72 |
-
return
|
| 73 |
-
|
| 74 |
-
self.log("Iniciando Exploração Agressiva...", "EXPLORAR")
|
| 75 |
-
self.driver.get("https://farmrpg.com/index.php#!/area.php?id=1")
|
| 76 |
-
time.sleep(3)
|
| 77 |
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
def modulo_mercado(self):
|
| 99 |
-
if not self.estado["inventario_cheio"]:
|
| 100 |
-
return
|
| 101 |
-
|
| 102 |
-
self.log("A executar despejo de inventário no mercado...", "MERCADO")
|
| 103 |
-
self.driver.get("https://farmrpg.com/index.php#!/sellall.php")
|
| 104 |
-
time.sleep(3)
|
| 105 |
-
|
| 106 |
-
self.estado["inventario_cheio"] = False # Reset do Estado
|
| 107 |
-
self.log("Estado Alterado: Inventário limpo com sucesso. Mais prata acumulada.", "MERCADO")
|
| 108 |
-
|
| 109 |
-
def modulo_fazenda(self):
|
| 110 |
-
agora = time.time()
|
| 111 |
-
|
| 112 |
-
# Verificação Temporal FSM
|
| 113 |
-
if agora < self.estado["proxima_colheita"]:
|
| 114 |
-
faltam = int((self.estado["proxima_colheita"] - agora) / 60)
|
| 115 |
-
self.log(f"As plantas continuam em estado de crescimento (~{faltam} min restantes).", "FAZENDA")
|
| 116 |
-
return
|
| 117 |
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
|
|
|
|
|
|
| 121 |
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
|
| 128 |
-
try:
|
| 129 |
-
self.driver.find_element(By.XPATH, "//*[contains(text(), 'Harvest All')]").click()
|
| 130 |
-
time.sleep(2)
|
| 131 |
-
self.log("Colheita máxima (Harvest All) efetuada.", "FAZENDA")
|
| 132 |
-
except: pass
|
| 133 |
-
|
| 134 |
-
try:
|
| 135 |
-
self.driver.find_element(By.XPATH, "//*[contains(text(), 'Plant All')]").click()
|
| 136 |
-
self.estado["proxima_colheita"] = time.time() + 300
|
| 137 |
-
self.log("Plantação máxima (Plant All) efetuada. Temporizador alocado para 5 min.", "FAZENDA")
|
| 138 |
-
except:
|
| 139 |
-
self.log("Erro ao tentar usar 'Plant All' (Conta sem a habilidade ou sem sementes).", "FAZENDA")
|
| 140 |
-
|
| 141 |
-
def rodar_ciclo_inteligente(self):
|
| 142 |
-
self.estado["ciclo_atual"] += 1
|
| 143 |
-
print("\n" + "="*50)
|
| 144 |
-
self.log(f"INICIANDO CICLO GLOBAL DE AUTOMAÇÃO #{self.estado['ciclo_atual']}", "SISTEMA")
|
| 145 |
-
print("="*50)
|
| 146 |
-
|
| 147 |
-
try:
|
| 148 |
-
self.iniciar_navegador()
|
| 149 |
-
|
| 150 |
-
# ORDEM ESTRATÉGICA DE PRIORIDADES
|
| 151 |
-
self.modulo_mercado() # Prioridade 1: Esvazia lixo se estiver trancado
|
| 152 |
-
self.modulo_exploracao() # Prioridade 2: Queima a energia
|
| 153 |
-
self.modulo_mercado() # Prioridade 3: Vende o novo lixo ganho
|
| 154 |
-
self.modulo_fazenda() # Prioridade 4: Gere as sementes que dão XP passivo
|
| 155 |
-
|
| 156 |
-
except Exception as e:
|
| 157 |
-
self.log(f"Falha na rede ou na execução: {str(e)[:60]}", "ERRO")
|
| 158 |
-
finally:
|
| 159 |
-
self.desligar_navegador()
|
| 160 |
-
|
| 161 |
-
# --- INICIALIZADOR DO MOTOR ---
|
| 162 |
if __name__ == "__main__":
|
| 163 |
threading.Thread(target=manter_dock_viva, daemon=True).start()
|
| 164 |
-
|
| 165 |
-
# Criamos o Cérebro
|
| 166 |
-
bot_farm_rpg = FarmRPGBotProfissional(MEUS_COOKIES)
|
| 167 |
-
|
| 168 |
-
time.sleep(3)
|
| 169 |
-
while True:
|
| 170 |
-
bot_farm_rpg.rodar_ciclo_inteligente()
|
| 171 |
-
|
| 172 |
-
# Recuperação de Stamina (O bot dorme e não é detetado como abusador)
|
| 173 |
-
espera = random.randint(45, 75)
|
| 174 |
-
bot_farm_rpg.log(f"Modo Repouso Ativado. Aguardando {espera} segundos para recuperar energia.", "DECISÃO")
|
| 175 |
-
time.sleep(espera)
|
|
|
|
| 6 |
from seleniumbase import Driver
|
| 7 |
from selenium.webdriver.common.by import By
|
| 8 |
from pyvirtualdisplay import Display
|
| 9 |
+
from groq import Groq
|
| 10 |
+
|
| 11 |
+
# --- CONFIGURAÇÕES DE IA E SESSÃO ---
|
| 12 |
+
CHAVE_GROQ = "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"
|
| 13 |
+
cliente_ia = Groq(api_key=CHAVE_GROQ)
|
| 14 |
|
|
|
|
| 15 |
MEUS_COOKIES = [
|
| 16 |
{"name": "pac_ocean", "value": "A55233B0"},
|
| 17 |
{"name": "HighwindFRPG", "value": "FVQCTfUiHPqufIN4zJcMPQ%3D%3D%3Cstrip%3E%24argon2id%24v%3D19%24m%3D7168%2Ct%3D4%2Cp%3D1%24bm1Ob0lmUWdSZEtHeklNVw%24L1Y8X1pEyJ5zX13VIK8oqNQcdHtwrdhvhHeseXSEhNA"},
|
| 18 |
{"name": "farmrpg_token", "value": "6tgeudskm32f0rlq6oputj0j1kd5f59nkdvolsdv"}
|
| 19 |
]
|
| 20 |
|
| 21 |
+
# --- SISTEMA DE LOGS ---
|
| 22 |
+
def log(acao, status="INFO"):
|
| 23 |
+
agora = datetime.now().strftime("%H:%M:%S")
|
| 24 |
+
icone = "🧠" if status == "GROQ" else "✅" if status == "SUCESSO" else "❌" if status == "ERRO" else "👁️" if status == "VISAO" else "🚜"
|
| 25 |
+
print(f"[{agora}] {icone} [{status}] {acao}", flush=True)
|
| 26 |
+
|
| 27 |
+
# --- SERVIDOR WEB (Manter Hugging Face Vivo) ---
|
| 28 |
class ServidorFalso(BaseHTTPRequestHandler):
|
| 29 |
def do_GET(self):
|
| 30 |
self.send_response(200)
|
| 31 |
self.end_headers()
|
| 32 |
+
self.wfile.write(b"Bot Farm RPG + IA GROQ Online!")
|
| 33 |
def log_message(self, format, *args): pass
|
| 34 |
|
| 35 |
def manter_dock_viva():
|
| 36 |
HTTPServer(('0.0.0.0', 7860), ServidorFalso).serve_forever()
|
| 37 |
|
| 38 |
+
# --- INFILTRAÇÃO ---
|
| 39 |
+
def injetar_cookies(driver):
|
| 40 |
+
driver.get("https://farmrpg.com/robots.txt")
|
| 41 |
+
time.sleep(2)
|
| 42 |
+
for cookie in MEUS_COOKIES:
|
| 43 |
+
try: driver.add_cookie({'name': cookie['name'], 'value': cookie['value'], 'domain': 'farmrpg.com'})
|
| 44 |
+
except: pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
|
| 46 |
+
# --- O CÉREBRO DA IA (GROQ) ---
|
| 47 |
+
def o_groq_decide_a_proxima_acao(texto_do_ecra):
|
| 48 |
+
"""Envia o texto do jogo para o Llama-3 tomar a decisão"""
|
| 49 |
+
prompt_sistema = """
|
| 50 |
+
És uma IA a jogar Farm RPG. O teu objetivo é automatizar tarefas.
|
| 51 |
+
Analisa o texto do ecrã atual e decide a MELHOR ação.
|
| 52 |
+
|
| 53 |
+
Regras estritas:
|
| 54 |
+
1. Se leres 'Inventory Full', 'You are full' ou similar, responde OBRIGATORIAMENTE: VENDER
|
| 55 |
+
2. Se tiveres opções de explorar a floresta e inventário livre, responde: EXPLORAR
|
| 56 |
+
3. Se houver botões de colher/plantar visíveis, responde: FAZENDA
|
| 57 |
+
4. Se o servidor estiver com erro, em manutenção, ou não houver nada para fazer, responde: REPOUSO
|
| 58 |
+
|
| 59 |
+
Responde APENAS com UMA das palavras: VENDER, EXPLORAR, FAZENDA, REPOUSO.
|
| 60 |
+
"""
|
| 61 |
+
|
| 62 |
+
try:
|
| 63 |
+
resposta = cliente_ia.chat.completions.create(
|
| 64 |
+
messages=[
|
| 65 |
+
{"role": "system", "content": prompt_sistema},
|
| 66 |
+
{"role": "user", "content": f"Texto visível no jogo: {texto_do_ecra}"}
|
| 67 |
+
],
|
| 68 |
+
model="llama3-8b-8192",
|
| 69 |
+
temperature=0.1,
|
| 70 |
+
max_tokens=10
|
| 71 |
+
)
|
| 72 |
+
return resposta.choices[0].message.content.strip().upper()
|
| 73 |
+
except Exception as e:
|
| 74 |
+
log(f"Falha de comunicação com o Cérebro Groq: {e}", "ERRO")
|
| 75 |
+
return "REPOUSO"
|
| 76 |
+
|
| 77 |
+
# --- MÓDULOS DE AÇÃO (Os Músculos) ---
|
| 78 |
+
def modulo_mercado(driver):
|
| 79 |
+
log("IA ordenou: Vender tudo. Indo ao mercado...", "INFO")
|
| 80 |
+
driver.get("https://farmrpg.com/index.php#!/sellall.php")
|
| 81 |
+
time.sleep(3)
|
| 82 |
+
log("Inventário esvaziado. Prata guardada!", "SUCESSO")
|
| 83 |
|
| 84 |
+
def modulo_exploracao(driver):
|
| 85 |
+
log("IA ordenou: Explorar. Indo para a Floresta...", "INFO")
|
| 86 |
+
driver.get("https://farmrpg.com/index.php#!/area.php?id=1")
|
| 87 |
+
time.sleep(3)
|
| 88 |
+
sucessos = 0
|
| 89 |
+
for _ in range(12):
|
| 90 |
+
try:
|
| 91 |
+
driver.find_element(By.ID, "explorebtn").click()
|
| 92 |
+
sucessos += 1
|
| 93 |
+
time.sleep(0.5)
|
| 94 |
+
except: break
|
| 95 |
+
log(f"Stamina gasta. {sucessos} explorações efetuadas.", "SUCESSO")
|
| 96 |
+
|
| 97 |
+
def modulo_fazenda(driver):
|
| 98 |
+
log("IA ordenou: Cuidar da Fazenda. Verificando as terras...", "INFO")
|
| 99 |
+
driver.get("https://farmrpg.com/index.php#!/farm.php")
|
| 100 |
+
time.sleep(4)
|
| 101 |
+
try:
|
| 102 |
+
harvest = driver.find_elements(By.XPATH, "//*[contains(text(), 'Harvest All')]")
|
| 103 |
+
if harvest: harvest[0].click(); time.sleep(2); log("Colheu!", "SUCESSO")
|
| 104 |
|
| 105 |
+
plant = driver.find_elements(By.XPATH, "//*[contains(text(), 'Plant All')]")
|
| 106 |
+
if plant: plant[0].click(); log("Plantou!", "SUCESSO")
|
| 107 |
+
except:
|
| 108 |
+
log("Nada a fazer na fazenda no momento.", "INFO")
|
| 109 |
+
|
| 110 |
+
# --- MOTOR DO AGENTE AUTÓNOMO ---
|
| 111 |
+
def motor_agente_autonomo():
|
| 112 |
+
display = Display(visible=0, size=(1920, 1080))
|
| 113 |
+
display.start()
|
| 114 |
+
driver = None
|
| 115 |
+
try:
|
| 116 |
+
driver = Driver(uc=True, headless=False)
|
| 117 |
+
injetar_cookies(driver)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
|
| 119 |
+
while True:
|
| 120 |
+
# 1. OBSERVAR
|
| 121 |
+
driver.get("https://farmrpg.com/index.php#!/index.php")
|
| 122 |
+
time.sleep(4)
|
| 123 |
+
# Extrai apenas os primeiros 1500 caracteres do corpo para não sobrecarregar a API
|
| 124 |
+
texto_visivel = driver.find_element(By.TAG_NAME, "body").text[:1500]
|
| 125 |
+
log("Leitura do ecrã concluída. A consultar IA...", "VISAO")
|
| 126 |
+
|
| 127 |
+
# 2. PENSAR
|
| 128 |
+
comando = o_groq_decide_a_proxima_acao(texto_visivel)
|
| 129 |
+
log(f"A DECISÃO DA IA FOI: {comando}", "GROQ")
|
| 130 |
+
|
| 131 |
+
# 3. AGIR
|
| 132 |
+
if "VENDER" in comando:
|
| 133 |
+
modulo_mercado(driver)
|
| 134 |
+
elif "EXPLORAR" in comando:
|
| 135 |
+
modulo_exploracao(driver)
|
| 136 |
+
elif "FAZENDA" in comando:
|
| 137 |
+
modulo_fazenda(driver)
|
| 138 |
+
else:
|
| 139 |
+
espera = random.randint(30, 45)
|
| 140 |
+
log(f"Comando de Repouso. A aguardar {espera} segundos...", "INFO")
|
| 141 |
+
time.sleep(espera)
|
| 142 |
|
| 143 |
+
# Pequena pausa entre ciclos para evitar sobrecarregar o jogo e a API
|
| 144 |
+
time.sleep(5)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
|
| 146 |
+
except Exception as e:
|
| 147 |
+
log(f"Erro no motor principal: {str(e)[:60]}", "ERRO")
|
| 148 |
+
finally:
|
| 149 |
+
if driver: driver.quit()
|
| 150 |
+
display.stop()
|
| 151 |
|
| 152 |
+
def iniciar_bot():
|
| 153 |
+
print("\n" + "="*50)
|
| 154 |
+
log("🚀 AGENTE IA FARM RPG (Llama-3 Groq) ONLINE!", "SUCESSO")
|
| 155 |
+
print("="*50 + "\n")
|
| 156 |
+
motor_agente_autonomo()
|
| 157 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
if __name__ == "__main__":
|
| 159 |
threading.Thread(target=manter_dock_viva, daemon=True).start()
|
| 160 |
+
iniciar_bot()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|