Gestão Financeira WYD
Veja quanto você gastou no WYD Global
Analise seu fluxo de gasto, comportamentos e investimentos no jogo.
Carregue um arquivo .json ou use o código de captura abaixo.
Como obter seus dados
Abra a loja do WYD Global. Na seleção de BRASIL / GLOBAL, clique com o botão direito e depois em Exibir código fonte do frame.
Na nova aba que abrir, remova o texto view-source: da URL e pressione Enter.
A loja vai carregar novamente em uma nova aba.
Pressione F12 ou clique com o botão direito e escolha Inspecionar. Vá até a aba Console.
⚠ Se você acha que copiar este código dará acesso à sua senha, cartão ou itens, simplesmente não o faça. O código apenas intercepta a resposta da API de pacotes pública.
(function(){
function capturar(txt){
try{
const d=JSON.parse(txt);
const h=d.historic||[];
if(!h.length)return;
const j=JSON.stringify(h);
navigator.clipboard.writeText(j)
.then(()=>console.log('%c\u2705 Historic copiado! ('+h.length+' registros) \u2014 Volte ao Dashboard e clique \'Copiar por c\u00f3digo\'','color:#4ade80;font-weight:bold;font-size:13px;'))
.catch(()=>{console.log('%c\u26a0 Cole manualmente:','color:#f0c040;font-weight:bold;');console.log(j);});
}catch(e){}
}
/* fetch */
const _f=window.fetch;
window.fetch=async function(...a){
const res=await _f(...a);
const url=(typeof a[0]==='string'?a[0]:a[0]?.url)||'';
if(url.includes('cashdata'))res.clone().json().then(d=>capturar(JSON.stringify(d)));
return res;
};
/* XMLHttpRequest */
const _open=XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open=function(m,u,...r){this._wyd_url=u;return _open.apply(this,[m,u,...r]);};
const _send=XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send=function(...a){
this.addEventListener('load',function(){
if(this._wyd_url&&this._wyd_url.includes('cashdata'))capturar(this.responseText);
});
return _send.apply(this,a);
};
console.log('%c\u2694 WYD Monitor ativo! V\u00e1 at\u00e9 Pacotes.','color:#f0c040;font-weight:bold;font-size:14px;');
})();
Após colar o código e pressionar Enter, confirme que aparece a mensagem: ⚔ WYD Monitor ativo! Vá até Pacotes.
Em seguida, clique em uma das lojas BRASIL / GLOBAL e verifique se aparece a mensagem: ✅ Historic copiado! (XXX registros) — Volte ao Dashboard e clique 'Copiar por código'
Clique em 📋 Copiar por código no topo desta página e autorize a extração do conteúdo copiado — ou pressione Ctrl+V manualmente na caixa de texto e clique em PROCESSAR.
| Peça | Sucesso | Tent avg | Souls avg |
|---|
Digite o nome de um item para descobrir como obtê-lo.
Este é um macro totalmente gratuito e open-source desenvolvido em Python para automatizar o uso da Jóia da Recuperação ou Ervas de Cura em debuffs permitidos no jogo.
O uso é por sua conta e risco, mas o código é aberto para que qualquer um possa verificar sua segurança e funcionamento. Ideal para quem busca agilidade e precisão média em momentos críticos de debuff.
📜 Termos de Uso: A modificação é permitida, porém os créditos para GtOkAi e o link wydglobal.pro não podem ser removidos sob nenhuma circunstância.
Instale o Python 3.10+
Baixe e instale a versão mais recente em python.org. IMPORTANTE: Marque a opção "Add Python to PATH" durante a instalação para que os comandos funcionem no terminal.
Prepare a pasta e os Ativos
Crie uma pasta chamada macro_assets no mesmo diretório onde ficará o macro. Salve as imagens abaixo dentro dela com seus respectivos nomes exatos:
anchor.png
enfraquecer.png
congelar.png
cancel.png
Crie o arquivo requirements.txt
Este arquivo gerencia as bibliotecas necessárias. Crie-o na pasta raiz e cole o conteúdo:
opencv-python
numpy
pyautogui
pynput
Pillow
customtkinter
pygetwindow
No seu terminal, dentro da pasta do projeto, execute:
pip install -r requirements.txt
Salve o macro.py e Execute
Crie um arquivo chamado macro.py e cole o código completo abaixo. Para abrir a
interface,
use o comando:
# Macro de Jóia e Erva - Criado por GtOkAi
# wydglobal.pro
import os
import time
import threading
import queue
import cv2
import numpy as np
import pyautogui
import pygetwindow as gw
from pynput import keyboard
import customtkinter as ctk
from PIL import Image
# ─── Configurações e Caminhos ──────────────────────────────────────────────────
PASTA_RECURSOS = 'macro_assets'
IMG_ANCORA = os.path.join(PASTA_RECURSOS, 'anchor.png')
NOME_JANELA = "With Your Destiny"
DEBUFFS = {
'enfraquecer.png': 't',
'congelar.png': 't',
'cancel.png': 'e'
}
# ─── Parâmetros de Detecção ───────────────────────────────────────────────────
LIMITE_CONFIANCA = 0.8
LARGURA_VARREDURA_ESQ = 350
LARGURA_VARREDURA_DIR = 350
ALTURA_VARREDURA = 80
INTERVALO_VERIFICACAO = 0.15 # Reduzido para maior velocidade com GUI
# ─── Classe Principal da Interface ───────────────────────────────────────────
class MacroInterface(ctk.CTk):
def __init__(self):
super().__init__()
self.title("Macro de Jóia e Erva - por GtOkAi - wydglobal.pro")
self.geometry("500x550")
ctk.set_appearance_mode("dark")
ctk.set_default_color_theme("blue")
self.executando = False
self.thread_monitor = None
self.fila_log = queue.Queue()
# Layout
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
# Cabeçalho
self.label_titulo = ctk.CTkLabel(self, text="MACRO DE JÓIA E ERVA", font=ctk.CTkFont(size=20, weight="bold"))
self.label_titulo.grid(row=0, column=0, padx=20, pady=(20, 5))
self.label_subtitle = ctk.CTkLabel(self, text="wydglobal.pro", font=ctk.CTkFont(size=12), text_color="gray")
self.label_subtitle.grid(row=1, column=0, padx=20, pady=(0, 20))
# Status
self.frame_status = ctk.CTkFrame(self)
self.frame_status.grid(row=2, column=0, padx=20, pady=10, sticky="ew")
self.frame_status.grid_columnconfigure(0, weight=1)
self.label_status = ctk.CTkLabel(self.frame_status, text="Status: Desconectado", font=ctk.CTkFont(weight="bold"))
self.label_status.grid(row=0, column=0, padx=20, pady=10)
# Console de Logs
self.textbox_log = ctk.CTkTextbox(self, width=460, height=200)
self.textbox_log.grid(row=3, column=0, padx=20, pady=10, sticky="nsew")
self.textbox_log.configure(state="disabled")
# Botões
self.button_start = ctk.CTkButton(self, text="INICIAR MACRO (F6)", command=self.toggle_macro, height=50, font=ctk.CTkFont(size=16, weight="bold"))
self.button_start.grid(row=4, column=0, padx=20, pady=20, sticky="ew")
# Listener de Teclado
self.listener = keyboard.Listener(on_press=self.tecla_pressionada)
self.listener.start()
# Update loop para logs
self.update_logs()
def update_logs(self):
while not self.fila_log.empty():
msg = self.fila_log.get()
self.textbox_log.configure(state="normal")
self.textbox_log.insert("end", f"[{time.strftime('%H:%M:%S')}] {msg}\n")
self.textbox_log.see("end")
self.textbox_log.configure(state="disabled")
self.after(100, self.update_logs)
def log(self, msg):
self.fila_log.put(msg)
def set_status(self, text, color="white"):
self.label_status.configure(text=f"Status: {text}", text_color=color)
self.log(text)
def tecla_pressionada(self, tecla):
if tecla == keyboard.Key.f6:
self.toggle_macro()
def toggle_macro(self):
if not self.executando:
self.executando = True
self.button_start.configure(text="PARAR MACRO (F6)", fg_color="#ef4444", hover_color="#991b1b")
self.thread_monitor = threading.Thread(target=self.loop_monitoramento, daemon=True)
self.thread_monitor.start()
else:
self.executando = False
self.button_start.configure(text="INICIAR MACRO (F6)", fg_color=["#3B8ED0", "#1F6AA5"], hover_color=["#367E96", "#144870"])
self.set_status("Interrompido", "#ef4444")
# ─── Lógica de Monitoramento (Rodando em Thread) ──────────────────────────
def loop_monitoramento(self):
modelos = self.carregar_recursos()
if not modelos:
self.executando = False
return
while self.executando:
self.set_status("Buscando Janela do Jogo...", "#38bdf8")
janelas = gw.getWindowsWithTitle(NOME_JANELA)
janela = next((j for j in janelas if NOME_JANELA in j.title), None)
if not janela:
time.sleep(2)
continue
if janela.isMinimized:
self.set_status("Janela Minimizada", "#facc15")
time.sleep(2)
continue
self.set_status("Buscando Âncora...", "#38bdf8")
regiao_busca_ancora = (janela.left, janela.top, 500, 300)
try:
ancora = pyautogui.locateOnScreen(IMG_ANCORA, region=regiao_busca_ancora, confidence=0.8)
if not ancora:
time.sleep(1)
continue
except:
time.sleep(1)
continue
self.set_status("Monitorando Debuffs", "#4ade80")
# Definir região baseada na âncora
m_esq = max(0, int(ancora.left - LARGURA_VARREDURA_ESQ))
m_topo = max(0, int(ancora.top - (ALTURA_VARREDURA // 2)))
m_largura = min(pyautogui.size()[0] - m_esq, int(LARGURA_VARREDURA_ESQ + LARGURA_VARREDURA_DIR + ancora.width))
m_altura = min(pyautogui.size()[1] - m_topo, int(ALTURA_VARREDURA))
regiao_debuffs = (m_esq, m_topo, m_largura, m_altura)
while self.executando:
# Revalidar janela
nova_janela = gw.getWindowsWithTitle(NOME_JANELA)
j_atual = next((j for j in nova_janela if NOME_JANELA in j.title), None)
if not j_atual or j_atual.left != janela.left or j_atual.top != janela.top:
break
# Scan
screenshot = pyautogui.screenshot(region=regiao_debuffs)
screenshot_cinza = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2GRAY)
for nome, (template, tecla) in modelos.items():
res = cv2.matchTemplate(screenshot_cinza, template, cv2.TM_CCOEFF_NORMED)
_, val_max, _, _ = cv2.minMaxLoc(res)
if val_max >= LIMITE_CONFIANCA:
self.log(f"DETECTADO: {nome.split('.')[0].upper()} -> Acionando {tecla.upper()}")
pyautogui.press(tecla)
time.sleep(0.8)
time.sleep(INTERVALO_VERIFICACAO)
def carregar_recursos(self):
if not os.path.exists(IMG_ANCORA):
self.log(f"ERRO: Âncora não encontrada em {IMG_ANCORA}")
return None
modelos = {}
for arq, tecla in DEBUFFS.items():
path = os.path.join(PASTA_RECURSOS, arq)
if os.path.exists(path):
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
if img is not None:
modelos[arq] = (img, tecla)
else:
self.log(f"Aviso: {arq} não encontrado.")
if not modelos:
self.log("ERRO: Nenhum debuff carregado.")
return None
return modelos
if __name__ == "__main__":
app = MacroInterface()
app.mainloop()
python macro.py
Após abrir a interface, é só clicar em INICIAR MACRO (F6)::
Ultima Atualizacao
...
Carregando...
Players Rastreados
...
Na categoria atual
Arenas Detectadas
...
Carregando...
Distribuição de Reinos
Membros por Guild (Top 10)
Top Level up
Poder Total das Guilds
Leaderboard de Guilds (Level Médio)
| Rank | Guild | Membros | Level Médio | Poder Total |
|---|