feat(config): add support for multiple session periods
Replace single time range configuration with support for up to 10
configurable session periods. Rename INTERVALO_CLIQUE_ESPERA to
INTERVALO_CLIQUE_GLOBAL for clarity. Update dentro_horario function
to accept list of period tuples instead of individual start/end times.
BREAKING CHANGE: HORA_INICIO and HORA_FIM environment variables are
replaced by PERIODO_{n}_INICIO and PERIODO_{n}_FIM variables (n=1-10).
INTERVALO_CLIQUE_ESPERA is renamed to INTERVALO_CLIQUE_GLOBAL.
This commit is contained in:
@@ -4,8 +4,27 @@ INTERVALO_MAXIMO_CLIQUE=20
|
||||
INTERVALO_PRIMEIRO_CLIQUE=10
|
||||
MAXIMO_CLIQUES_POR_SESSAO=20
|
||||
INTERVALO_ENTRE_SESSOES=3300
|
||||
INTERVALO_CLIQUE_ESPERA=900
|
||||
INTERVALO_CLIQUE_GLOBAL=900
|
||||
MAXIMO_FALHAS=10
|
||||
HORA_INICIO=09:00
|
||||
HORA_FIM=18:00
|
||||
# Períodos de sessão (até 10). Deixe vazio para desativar um período.
|
||||
PERIODO_1_INICIO=09:00
|
||||
PERIODO_1_FIM=12:00
|
||||
PERIODO_2_INICIO=14:00
|
||||
PERIODO_2_FIM=18:00
|
||||
PERIODO_3_INICIO=
|
||||
PERIODO_3_FIM=
|
||||
PERIODO_4_INICIO=
|
||||
PERIODO_4_FIM=
|
||||
PERIODO_5_INICIO=
|
||||
PERIODO_5_FIM=
|
||||
PERIODO_6_INICIO=
|
||||
PERIODO_6_FIM=
|
||||
PERIODO_7_INICIO=
|
||||
PERIODO_7_FIM=
|
||||
PERIODO_8_INICIO=
|
||||
PERIODO_8_FIM=
|
||||
PERIODO_9_INICIO=
|
||||
PERIODO_9_FIM=
|
||||
PERIODO_10_INICIO=
|
||||
PERIODO_10_FIM=
|
||||
CONFIANCA=0.9
|
||||
|
||||
Executable → Regular
BIN
Binary file not shown.
@@ -24,13 +24,32 @@ INTERVALO_MAXIMO_CLIQUE = int(os.getenv("INTERVALO_MAXIMO_CLIQUE", "30"))
|
||||
INTERVALO_PRIMEIRO_CLIQUE = int(os.getenv("INTERVALO_PRIMEIRO_CLIQUE", "10"))
|
||||
MAXIMO_CLIQUES_POR_SESSAO = int(os.getenv("MAXIMO_CLIQUES_POR_SESSAO", "20"))
|
||||
INTERVALO_ENTRE_SESSOES = int(os.getenv("INTERVALO_ENTRE_SESSOES", "60"))
|
||||
INTERVALO_CLIQUE_ESPERA = int(os.getenv("INTERVALO_CLIQUE_ESPERA", "900"))
|
||||
INTERVALO_CLIQUE_GLOBAL = int(os.getenv("INTERVALO_CLIQUE_GLOBAL", "900"))
|
||||
MAXIMO_FALHAS = int(os.getenv("MAXIMO_FALHAS", "5"))
|
||||
HORA_INICIO = os.getenv("HORA_INICIO", "09:00")
|
||||
HORA_FIM = os.getenv("HORA_FIM", "18:00")
|
||||
CONFIANCA = float(os.getenv("CONFIANCA", "0.8"))
|
||||
IMAGEM_BOTAO = os.path.join(os.path.dirname(os.path.abspath(__file__)), "botaoparaclicar.png")
|
||||
LOG_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "log.txt")
|
||||
PERIODOS_SESSAO = []
|
||||
|
||||
def _carregar_periodos():
|
||||
periodos = []
|
||||
for i in range(1, 11):
|
||||
ini = os.getenv(f"PERIODO_{i}_INICIO", "").strip()
|
||||
fim = os.getenv(f"PERIODO_{i}_FIM", "").strip()
|
||||
if ini and fim:
|
||||
periodos.append((ini, fim))
|
||||
return periodos
|
||||
|
||||
PERIODOS_SESSAO = _carregar_periodos()
|
||||
|
||||
def dentro_horario(periodos: list) -> bool:
|
||||
agora = datetime.now().time()
|
||||
for ini, fim in periodos:
|
||||
hi = datetime.strptime(ini, "%H:%M").time()
|
||||
hf = datetime.strptime(fim, "%H:%M").time()
|
||||
if hi <= agora <= hf:
|
||||
return True
|
||||
return False
|
||||
|
||||
pyautogui.FAILSAFE = True
|
||||
|
||||
@@ -88,9 +107,8 @@ def painel_config() -> None:
|
||||
(C_CYAN, "Espera antes do 1º clique", f"{INTERVALO_PRIMEIRO_CLIQUE}s"),
|
||||
(C_YELLOW, "Máximo de cliques por sessão", str(MAXIMO_CLIQUES_POR_SESSAO)),
|
||||
(C_YELLOW, "Intervalo entre sessões", f"{INTERVALO_ENTRE_SESSOES}s"),
|
||||
(C_CYAN, "Clique de espera entre sessões", f"{INTERVALO_CLIQUE_ESPERA}s"),
|
||||
(C_CYAN, "Clique global de espera", f"{INTERVALO_CLIQUE_GLOBAL}s"),
|
||||
(C_MAG, "Máximo de falhas", str(MAXIMO_FALHAS)),
|
||||
(C_WHITE, "Horário de funcionamento", f"{HORA_INICIO} às {HORA_FIM}"),
|
||||
(C_GRAY, "Confiança mínima", str(CONFIANCA)),
|
||||
]
|
||||
|
||||
@@ -116,6 +134,15 @@ def painel_config() -> None:
|
||||
)
|
||||
print()
|
||||
|
||||
if PERIODOS_SESSAO:
|
||||
print(C_WHITE + BOLD + center(" 📅 Períodos de sessão", C_TITLE) + RST)
|
||||
print()
|
||||
for idx, (ini, fim) in enumerate(PERIODOS_SESSAO, 1):
|
||||
print(C_WHITE + f" {idx}. " + C_CYAN + f"{ini} → {fim}" + RST)
|
||||
else:
|
||||
print(C_RED + center(" ⚠ Nenhum período configurado!", C_RED) + RST)
|
||||
print()
|
||||
|
||||
def cabecalho_sessao(num: int) -> None:
|
||||
print()
|
||||
print(C_MAG + BOLD + f" 🔄 SESSÃO {num} 🔄" + RST)
|
||||
@@ -149,12 +176,6 @@ def log(mensagem: str, cor: str = C_WHITE) -> None:
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def dentro_horario(hora_inicio: str, hora_fim: str) -> bool:
|
||||
agora = datetime.now().time()
|
||||
hi = datetime.strptime(hora_inicio, "%H:%M").time()
|
||||
hf = datetime.strptime(hora_fim, "%H:%M").time()
|
||||
return hi <= agora <= hf
|
||||
|
||||
def encontrar_botao(imagem_path: str, confianca: float = 0.8):
|
||||
if not os.path.isfile(imagem_path):
|
||||
log(f"ERRO: Imagem '{imagem_path}' não encontrada.", C_RED)
|
||||
@@ -219,15 +240,25 @@ def main() -> None:
|
||||
while True:
|
||||
agora = datetime.now()
|
||||
|
||||
if not dentro_horario(HORA_INICIO, HORA_FIM):
|
||||
if not dentro_horario(PERIODOS_SESSAO):
|
||||
log(
|
||||
f"[Sessão {numero_sessao}] Fora do horário permitido ({agora.strftime('%H:%M:%S')}).",
|
||||
f"[Sessão {numero_sessao}] Fora de todos os períodos configurados ({agora.strftime('%H:%M:%S')}).",
|
||||
C_YELLOW,
|
||||
)
|
||||
log(f"Pausando até {HORA_INICIO}...", C_GRAY)
|
||||
log(f"[Espera] Dormindo {INTERVALO_CLIQUE_GLOBAL}s até o próximo clique global...", C_GRAY)
|
||||
time.sleep(INTERVALO_CLIQUE_GLOBAL)
|
||||
pos_global = encontrar_botao(IMAGEM_BOTAO, CONFIANCA)
|
||||
if pos_global:
|
||||
gx, gy = pos_global
|
||||
log(
|
||||
f"[Espera] Clicando globalmente em ({gx}, {gy})...",
|
||||
C_GREEN,
|
||||
)
|
||||
pyautogui.click(gx, gy)
|
||||
else:
|
||||
log("[Espera] Botão não encontrado no clique global.", C_RED)
|
||||
falhas_consecutivas = 0
|
||||
cliques_na_sessao = 0
|
||||
time.sleep(30)
|
||||
continue
|
||||
|
||||
if primeiro_clique:
|
||||
@@ -283,7 +314,7 @@ def main() -> None:
|
||||
)
|
||||
tempo_restante = INTERVALO_ENTRE_SESSOES
|
||||
while tempo_restante > 0:
|
||||
tempo_ate_clique = min(tempo_restante, INTERVALO_CLIQUE_ESPERA)
|
||||
tempo_ate_clique = min(tempo_restante, INTERVALO_CLIQUE_GLOBAL)
|
||||
log(
|
||||
f"[Espera] Dormindo {tempo_ate_clique}s (restam {tempo_restante}s)...",
|
||||
C_GRAY,
|
||||
|
||||
Reference in New Issue
Block a user