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:
marco
2026-09-09 13:28:20 -03:00
parent 9b95ecd551
commit fa2be1a13c
3 changed files with 69 additions and 19 deletions
+22 -3
View File
@@ -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
View File
Binary file not shown.
+47 -16
View File
@@ -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,