Tasks disponíveis

NomeTipoDescriçãoExemplo de usoDisparar
bgg scraping Scrapes sleeve/cardset info, rank, weight, and weight-vote breakdown for a BGG game.
CLI:  python cli.py bgg "https://boardgamegeek.com/boardgame/13/catan"
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/bgg/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -H "Content-Type: application/json" \
    -d '{"ref": "https://boardgamegeek.com/boardgame/13/catan"}'
`ref` aceita a URL completa do jogo (com ou sem slug/sufixo, ex: .../13/catan/sleeves)
ou só o id numérico (ex: "13").
bling_export_to_iset automation Exporta produto(s) do Bling pra loja virtual 'iSET' já configurada no ERP -- a mesma ação do botão 'Exportar produtos multiloja' da listagem de produtos, replicando as chamadas reais em vez de clicar na UI. Selecione por id(s) do Bling (direto, sem busca) ou por SKU/nome exato (busca 1 produto); se 'ids_bling' vier preenchido, 'busca_sku_nome' é ignorado.
CLI:  python cli.py bling_export_to_iset busca_sku_nome=BDD101
      python cli.py bling_export_to_iset ids_bling=16674025429 ids_bling=16384133188
API:  curl -X POST http://<host>:8001/tasks/bling_export_to_iset/run-sync \
        -H "X-API-Key: <sua API_KEY>" -F "ids_bling=16674025429"
Campos:
  busca_sku_nome  -- SKU (campo 'codigo' no Bling) ou nome EXATO do produto;
                     usado só quando 'ids_bling' vier vazio; resolve 1 produto
                     e recusa (listando os candidatos) se o nome bater em mais de um
  ids_bling       -- 1+ ids internos do Bling (repita o campo, ou um por linha no
                     dashboard); tem prioridade -- se preenchido, ignora 'busca_sku_nome'
                     e exporta todos numa chamada só, sem precisar buscar nada
Usado só se 'ids_bling' (abaixo) estiver vazio. Resolve 1 produto só.
Um id por linha. Se preenchido, ignora o campo de busca acima e exporta todos de uma vez.
bling_login login Loga no Bling (ou reaproveita a sessão salva) e persiste os cookies em data/sessions/bling.json, deixando as próximas tasks bling_* já logadas. Use pra testar credenciais, aquecer/renovar a sessão, ou com 'forcar' pra descartar tudo e logar do zero (sessão suspeita de corrompida).
CLI:  python cli.py bling_login forcar=nao
      python cli.py bling_login forcar=sim   (limpa a sessão salva antes)
API:  curl -X POST http://<host>:8001/tasks/bling_login/run-sync \
        -H "X-API-Key: <sua API_KEY>"
Resposta: {site, mode, url} onde mode é sessao_reaproveitada | login_refeito | fresh_apos_descarte.
Credenciais: BLING_USER / BLING_PASS no ambiente (ver .env.example).
Descarta a sessão salva (cookies) antes de logar — use se a sessão parecer corrompida.
fornecedor_catalogo scraping Tira um snapshot do catálogo de um fornecedor -- disponibilidade, estoque e preço de tabela de cada produto -- pra alimentar decisão de compra em outro repo. Sem `codigos`: varre o catálogo inteiro. Com `codigos` (um ou mais códigos do fornecedor): resolve cada um individualmente via busca, devolvendo o casamento código->produto. Fornecedores cadastrados em tasks/fornecedor_catalogo/fornecedores.py: meeplebr, grok, asmodee, mosaico. Por padrão, sem login -- só o que a busca pública do fornecedor mostra. `autenticado=true` loga antes de coletar (ver sites/<fornecedor>.py); no catálogo MeepleBR isso NÃO muda o preço coletado -- ver NOTES.md 'Preço logado'. Fornecedores 'grok' (B2B Mercos) e 'asmodee' (B2B Oracle Commerce Cloud) EXIGEM autenticado=true -- nenhum dos dois tem catálogo anônimo, sem isso a chamada falha com erro claro (ver sites/grok.NOTES.md e NOTES.md deste diretório).
CLI (catálogo inteiro):
  python cli.py fornecedor_catalogo fornecedor=meeplebr
CLI (resolução por código, repita o campo pra vários):
  python cli.py fornecedor_catalogo fornecedor=meeplebr codigos=0208 codigos=0341
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/fornecedor_catalogo/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -H "Content-Type: application/json" \
    -d '{"fornecedor": "meeplebr", "codigos": ["0208", "0341"]}'
`fornecedor` é o nome cadastrado em fornecedores.py (default meeplebr). `codigos` é opcional -- lista de códigos do fornecedor a resolver individualmente; omitido, a task varre o catálogo inteiro.
Um ou mais códigos pra resolver individualmente em vez de varrer o catálogo inteiro.
Loga no fornecedor (ver sites/<fornecedor>.py) antes de coletar, em vez da busca anônima de sempre -- vale tanto pro catálogo completo quanto pra 'codigos'. Ver NOTES.md 'Preço logado': no catálogo MeepleBR testado o preço coletado (min_price_range) é IDÊNTICO logado ou não -- ligar isso não muda o resultado hoje pra ela. Já pra 'grok' (Mercos) e 'asmodee' (OCC) é OBRIGATÓRIO -- sem login a busca de nenhum dos dois traz produto nenhum (Mercos responde 401; OCC responde totalNumRecs=0, disfarçado de catálogo vazio) -- ver sites/grok.NOTES.md e a NOTES.md deste diretório.
fornecedor_carrinho scraping Faz o carrinho do fornecedor (Grok/Mercos, Asmodee/OCC ou MeepleBR/Dooca) espelhar exatamente uma lista de CODIGO:QUANTIDADE (quantidade do SITE) -- adiciona o que falta, ajusta quantidade divergente e REMOVE o que está no carrinho e não está na lista. Sem executar=sim só devolve o plano; com executar=sim aplica e relê o carrinho (campo `confere`). Não finaliza pedido.
CLI (plano):
  python cli.py fornecedor_carrinho fornecedor=grok itens=GRK0082:2 itens=GRK0165:1
CLI (aplicar):
  python cli.py fornecedor_carrinho fornecedor=grok itens=GRK0082:2 executar=sim
  python cli.py fornecedor_carrinho fornecedor=asmodee itens=GMG102:2 itens=TGM001:12 executar=sim
  python cli.py fornecedor_carrinho fornecedor=meeplebr itens=0209:4 itens=0210:10 executar=sim
Sem itens, só com vazio=sim: esvazia o carrinho.
grok_login login Loga na Grok Games (B2B Mercos, grokgames.mercos.com) ou reaproveita a sessão salva e persiste os cookies em data/sessions/grok.json, deixando fornecedor_catalogo coletar o catálogo (custo, EAN, dimensões...) com sessão autenticada -- obrigatória aqui, o Mercos não tem catálogo anônimo (ver sites/grok.NOTES.md). Use pra testar credenciais, aquecer/renovar a sessão, ou com 'forcar' pra descartar tudo e logar do zero.
CLI:  python cli.py grok_login forcar=nao
      python cli.py grok_login forcar=sim   (limpa a sessão salva antes)
API:  curl -X POST http://<host>:8001/tasks/grok_login/run-sync \
        -H "X-API-Key: <sua API_KEY>"
Resposta: {site, mode, url} onde mode é sessao_reaproveitada | login_refeito | fresh_apos_descarte.
Credenciais: GROK_USER / GROK_PASS no ambiente (ver .env.example).
Descarta a sessão salva (cookies) antes de logar — use se a sessão parecer corrompida.
meeplebr_login login Loga na MeepleBR (ou reaproveita a sessão salva) e persiste os cookies em data/sessions/meeplebr.json, deixando fornecedor_catalogo coletar o catálogo com sessão autenticada. Use pra testar credenciais, aquecer/renovar a sessão, ou com 'forcar' pra descartar tudo e logar do zero (sessão suspeita de corrompida).
CLI:  python cli.py meeplebr_login forcar=nao
      python cli.py meeplebr_login forcar=sim   (limpa a sessão salva antes)
API:  curl -X POST http://<host>:8001/tasks/meeplebr_login/run-sync \
        -H "X-API-Key: <sua API_KEY>"
Resposta: {site, mode, url} onde mode é sessao_reaproveitada | login_refeito | fresh_apos_descarte.
Credenciais: MEEPLEBR_USER / MEEPLEBR_PASS no ambiente (ver .env.example).
Descarta a sessão salva (cookies) antes de logar — use se a sessão parecer corrompida.
game_images scraping Recebe o nome de um jogo e, se informada, a editora. Procura primeiro só no site da editora do jogo e depois nos lojistas (tasks/game_images/stores.py), escolhe o melhor match e baixa as imagens de produto -- parando ao juntar 8 imagens boas (resolução suficiente pro tratamento padrão).
CLI:  python cli.py game_images nome=Catan
      python cli.py game_images nome=Catan sku=BUY-CATAN01   (SKU só identifica a saída)
      python cli.py game_images "nome=Dungeon Fighter (2ª Edição)" editora=Asmodee
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/game_images/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F "nome=Catan" -F "sku=BUY-CATAN01"
`nome` é o jogo a buscar; `sku` (opcional) vira o nome da pasta de saída e
identifica o resultado -- não muda a busca. `editora` (opcional) escolhe o
ÚNICO site de editora buscado; vazia ou sem site no catálogo = só lojistas.
Imagens em data/output/game_images/<sku-ou-nome>/<loja>/; o JSON traz status
(processado/sem_lojas/sem_imagens), candidatos considerados com score e as
imagens por loja.
Só o site desta editora é buscado, antes dos lojistas. Vazia = só lojistas.
game_links_search scraping Given a game name, finds its page URL on ComparaJogos, BoardGameGeek (BGG) and Ludopedia -- the piece that feeds tasks/salvar_links_produto (meca-produtos), which needs those 3 URLs already resolved.
CLI:  python cli.py game_links_search "Valheim: O Jogo de Tabuleiro"
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/game_links_search/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -H "Content-Type: application/json" \
    -d '{"ref": "Valheim: O Jogo de Tabuleiro"}'
`ref` e o nome do jogo (em portugues ou ingles -- os 3 sites fazem busca por substring, entao um nome parcial tambem funciona, ex: "Valheim").
ludopedia_game_code scraping Given a ludopedia.com.br/jogo/<slug> page URL, returns the site's internal id_jogo (game code) -- replaces the n8n sub-workflow 'Function LudoApi website para codigo do jogo' (id 7BkglJN5907GA11B), whose plain HTTP Request node gets 403'd by Cloudflare; this fetches through the same stealth browser tasks/bgg and tasks/game_links_search already use for ludopedia.com.br.
CLI:  python cli.py ludopedia_game_code "https://ludopedia.com.br/jogo/valheim-the-board-game"
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/ludopedia_game_code/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -H "Content-Type: application/json" \
    -d '{"ref": "https://ludopedia.com.br/jogo/valheim-the-board-game"}'
`ref` e a URL completa da pagina do jogo na Ludopedia (formato ludopedia.com.br/jogo/<slug> -- e o mesmo `LudoLink` que o sub-workflow antigo recebia).
iset_add_product_images automation Loga no painel iSET (mecadosjogos.com.br/admin), acha um produto por SKU ou nome, sobe uma ou mais imagens e define a primeira como imagem principal.
CLI:  python cli.py iset_add_product_images produto=GRK0219 imagens=https://exemplo.com/foto1.jpg imagens=C:/imgs/foto2.jpg
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/iset_add_product_images/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F "produto=GRK0219" -F "imagens=https://exemplo.com/foto1.jpg" \
    -F "imagens=https://exemplo.com/foto2.jpg"
Campos:
  produto           -- SKU (preferido) ou nome do produto no painel (obrigatório)
  imagens           -- 1+ imagens (repita o campo): cada uma uma URL http(s) ou um
                       caminho de arquivo local acessível pelo servidor
  imagem_principal  -- opcional, índice (0-based) da imagem que vira a principal (padrão 0)
  substituir        -- opcional (true/false, padrão false): true remove as imagens que o
                       produto já tinha, depois do upload conferido (sem ele, soma)
Requer ISET_ADMIN_USER e ISET_ADMIN_PASS configurados como variável de ambiente no servidor.
Selecione um ou mais arquivos, ou arraste-os sobre este campo.
Uma URL por linha. Pode combinar com arquivos anexados acima.
0 = a primeira imagem (arquivos anexados contam antes das URLs).
Depois do upload conferido (Principal na imagem nova), remove a galeria de antes e relê. Desmarcado: as imagens novas se somam às que já estão lá.
iset_configurar_pre_venda automation Configura um ou mais produtos do painel iSET como 'pré-venda': categorias, marcações, disponibilidade/pagamento e o campo adicional de ciência de pré-venda. Loga uma vez e processa o lote em sequência; para cada produto lê o estado atual e só altera o que estiver diferente, salva, reabre e reconfere (checklist).
CLI:  python cli.py iset_configurar_pre_venda itens='[{"sku":"GRK0134","eh_lancamento":false,"data_prevista":"2026-07-17"}]'
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/iset_configurar_pre_venda/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F 'itens=[{"sku":"GRK0134","eh_lancamento":false,"data_prevista":"2026-07-17"}]'
Campos:
  itens -- lista de produtos. JSON (lista de objetos) OU uma linha por item
           no formato 'sku; lançamento(true/false); data(aaaa-mm-dd)'. A data é
           opcional (sem data = limpa o campo 'Disponível em').
Requer ISET_ADMIN_USER e ISET_ADMIN_PASS configurados como variável de ambiente.
Cada linha: SKU; lançamento (true/false); data prevista (aaaa-mm-dd, opcional). Também aceita JSON: [{"sku":"GRK0134","eh_lancamento":false,"data_prevista":"2026-07-17"}].
iset_remover_pre_venda automation Remove a configuração de 'pré-venda' de um ou mais produtos do painel iSET, devolvendo-os ao estado de entrega imediata (espelho de iset_configurar_pre_venda). Loga uma vez e processa o lote em sequência; para cada produto lê o estado atual e só altera o que estiver diferente, salva, reabre e reconfere (checklist). A data prevista é ignorada -- a remoção sempre limpa o campo 'Disponível em'.
CLI:  python cli.py iset_remover_pre_venda itens='[{"sku":"GRK0134","eh_lancamento":false}]'
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/iset_remover_pre_venda/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F 'itens=[{"sku":"GRK0134","eh_lancamento":false}]'
Campos:
  itens -- lista de produtos. JSON (lista de objetos) OU uma linha por item
           no formato 'sku; lançamento(true/false)'. A data prevista, se vier,
           é ignorada na remoção (o campo 'Disponível em' é sempre limpo).
Requer ISET_ADMIN_USER e ISET_ADMIN_PASS configurados como variável de ambiente.
Cada linha: SKU; lançamento (true/false). A data prevista é ignorada na remoção. Também aceita JSON: [{"sku":"GRK0134","eh_lancamento":false}].
iset_pre_venda_pendentes chain Lote de pré-venda da data table do n8n 'pre_venda / pronta_entrega': lê as linhas alterar=true, grava cada SKU na iSET (pré-venda ou pronta entrega) e avisa o workflow do n8n, que marca na_loja/alterar na tabela. Sem pendências, termina ok sem logar. Mesma lógica da cadeia iset/pre-venda-pendentes do op.
CLI:  python cli.py iset_pre_venda_pendentes simular=false   (simular=true: só o plano)
API (lote grande: responde 202 e entrega o resultado por webhook):
  curl -X POST https://<host>/tasks/iset_pre_venda_pendentes/run-async \
    -H "X-API-Key: <sua API_KEY>" -H "Content-Type: application/json" \
    -d '{"result_webhook_url": "https://<receptor>"}'
Opcional: "simular": true -- lê a tabela e cada produto, devolve o plano, não grava
nem avisa o n8n.
NÃO aponte result_webhook_url para os Webhooks de pré-venda do workflow
iLobrK32qmg1Jrli: a própria task já os avisa (passo avisar).
Requer ISET_ADMIN_USER, ISET_ADMIN_PASS, N8N_BASE_URL e N8N_API_KEY no ambiente.
Lê a tabela e cada produto e devolve o plano (mudancas).
iset_atualizar_resumo automation Atualiza o 'Breve Resumo' (campo da aba Descrição) de um produto do painel iSET: recebe um SKU e uma descrição curta, abre o produto, substitui o breve resumo pela descrição informada, salva e reconfere pela verdade do servidor (idempotente -- só grava se o texto atual divergir).
CLI:  python cli.py iset_atualizar_resumo sku=GRK0134 descricao_curta='Jogo de blefe e dedução para 4-8 jogadores.'
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/iset_atualizar_resumo/run-sync \
    -H "X-API-Key: <sua API_KEY>" -H "Content-Type: application/json" \
    -d '{"sku": "GRK0134", "descricao_curta": "Jogo de blefe e dedução para 4-8 jogadores."}'
Campos:
  sku             -- SKU do produto (busca exata no painel; cai pra nome se não achar).
  descricao_curta -- texto do breve resumo a gravar (substitui o atual por inteiro).
Requer ISET_ADMIN_USER e ISET_ADMIN_PASS configurados como variável de ambiente.
Substitui o campo 'Breve Resumo' da aba Descrição do produto.
iset_get_product_images scraping Loga no painel iSET (mecadosjogos.com.br/admin), acha um produto por SKU ou nome, e coleta os links de todas as imagens já cadastradas nele (lendo a página pública do produto), opcionalmente enviando o resultado a um webhook.
CLI:  python cli.py iset_get_product_images produto=GRK0219
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/iset_get_product_images/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F "produto=GRK0219" -F "webhook_url=https://exemplo.com/webhook"
Campos:
  produto            -- SKU (preferido) ou nome do produto no painel (obrigatório)
  webhook_url        -- opcional; se informado, o JSON {produto_id, sku, nome, imagens}
                        é enviado por POST pra essa URL. Sem isso, a task só retorna
                        o resultado (útil pra testar via run-sync).
  ativar_se_inativo  -- opcional, padrão false. A lista de imagens vem da página pública
                        do produto, que só existe se ele estiver ATIVO na loja (ver
                        NOTES.md). Com true, um produto inativo é ativado temporariamente
                        pra essa leitura e desativado de novo em seguida -- ele fica de
                        fato visível/comprável na loja real durante essa janela.
Requer ISET_ADMIN_USER e ISET_ADMIN_PASS configurados como variável de ambiente no servidor.
Se preenchido, o JSON com os links das imagens é enviado pra essa URL.
Se o produto estiver desativado, ativa ele, lê as imagens e desativa de novo -- durante esse tempo ele fica visível/comprável na loja de verdade.
iset_get_product_images_admin automation Loga no painel iSET, acha um produto por SKU ou nome e lê os links das imagens direto do formulário de edição do PAINEL (fonte da verdade, sem cache) -- funciona mesmo com produto inativo. A task irmã iset_get_product_images lê a página pública (o que o cliente vê, sujeita a cache logo após mudanças).
CLI:  python cli.py iset_get_product_images_admin produto=AZU001
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/iset_get_product_images_admin/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F "produto=AZU001" -F "webhook_url=https://exemplo.com/webhook"
Campos:
  produto      -- SKU (preferido) ou nome do produto no painel (obrigatório)
  webhook_url  -- opcional; se informado, o JSON {produto_id, sku, nome, imagens}
                  é enviado por POST pra essa URL (mesmo payload da task irmã).
Diferente da iset_get_product_images (página pública), esta lê o painel:
reflete um upload imediatamente (sem cache da loja) e não exige produto ativo.
Requer ISET_ADMIN_USER e ISET_ADMIN_PASS configurados no servidor.
Se preenchido, o JSON com os links das imagens é enviado pra essa URL.
iset_publish_game_images chain Cadeia completa acionável pelo n8n: busca imagens do jogo nas lojas do catálogo (game_images), trata pro padrão da loja (image_prep), sobe pro produto no iSET pelo SKU (iset_add_product_images) e colhe os links direto do painel — sem o cache da página pública — enviando o resultado pra um webhook (iset_get_product_images_admin).
Recomendado pro n8n -- fire-and-forget (a cadeia leva minutos; a resposta chega
pelo webhook informado nos campos):
  curl -X POST http://<host>:8001/tasks/iset_publish_game_images/run \
    -H "X-API-Key: <sua API_KEY>" \
    -F "sku=AZU001" -F "nome=Azul" -F "sufixo_slug=meca dos jogos" \
    -F "webhook_url=https://n8n.exemplo/webhook/abc"
Alternativa bloqueante (devolve o JSON completo na resposta): trocar /run por /run-sync.
CLI:  python cli.py iset_publish_game_images sku=AZU001 nome=Azul webhook_url=https://...
Campos:
  sku          -- produto no iSET que recebe as imagens (obrigatório)
  nome         -- nome do jogo a buscar nas lojas (obrigatório)
  editora      -- opcional; só o site desta editora é buscado, antes dos lojistas
                  (vazia ou sem site no catálogo = só lojistas)
  sufixo_slug  -- opcional; nome dos arquivos vira <nome>-<sufixo>-N.jpg (padrão "meca dos jogos")
  webhook_url  -- opcional; recebe {produto_id, sku, nome, imagens} ao final
  acumular     -- opcional (true/false, padrão false): por padrão as imagens que o
                  produto já tinha saem depois do upload conferido (republicar não
                  duplica); true soma as novas às de antes
Os links vêm do PAINEL (iset_get_product_images_admin): refletem o upload na
hora, sem o cache da página pública, e funcionam com produto inativo.
Status possíveis no JSON: publicado | sem_lojas | sem_imagens | tratamento_sem_imagens | upload_falhou.
ATENÇÃO: o webhook é enviado pelo último passo -- se a cadeia falhar antes
(sem_lojas, upload_falhou...), NENHUM webhook é disparado; monitore o job/JSON.
Só o site desta editora é buscado, antes dos lojistas. Vazia = só lojistas.
Apague pra não usar sufixo nenhum.
Recebe o JSON com os links das imagens do produto ao final da cadeia.
Desmarcado (padrão): depois do upload conferido, a galeria de antes sai -- republicar troca as imagens em vez de duplicar.
image_prep automation Trata imagens de produto pro padrão da loja: centraliza o assunto, corta/preenche pra 1200x800, comprime pra menos de 100KB e remove duplicatas perceptuais. Saída pronta pra usar no iset_add_product_images.
CLI:  python cli.py image_prep imagens=C:/fotos/catan1.jpg imagens=https://loja.com/catan2.jpg nome_base=catan
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/image_prep/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F "imagens=https://loja.com/catan.jpg" -F "nome_base=catan"
Campos:
  imagens      -- 1+ imagens (repita o campo): caminhos locais e/ou URLs (obrigatório)
  nome_base    -- base do nome dos arquivos de saída (ex: "catan")
  largura, altura, max_kb -- opcionais; padrão 1200x800, 100KB (core/images/defaults.py)
  sufixo_slug  -- opcional; padrão "meca dos jogos" ("" omite)
  debug        -- opcional; salva as imagens intermediárias de cada estágio
Saída em data/output/image_prep/<nome_base>-<timestamp>/, com relatório por
estágio de cada imagem no JSON retornado.
Selecione um ou mais arquivos, ou arraste-os sobre este campo.
Uma URL por linha. Pode combinar com arquivos anexados acima.
Vira o começo do nome de cada saída: catan-meca-dos-jogos-1.jpg
Apague pra não usar sufixo nenhum.
iset_xml automation Loga no painel iSET (mecadosjogos.com.br/admin) e clica em "Recriar XML" para os feeds de XML cadastrados.
CLI:  python cli.py iset_xml all
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/iset_xml/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F "ref=all"
`ref` aceita "all" (recria todos os feeds cadastrados) ou o id numérico de um feed específico (ex: "1").
Requer ISET_ADMIN_USER e ISET_ADMIN_PASS configurados como variável de ambiente no servidor.
store_images scraping Extrai e baixa as imagens de produto de uma página de loja (qualquer e-commerce): dados estruturados JSON-LD primeiro, depois og:image e heurísticas de galeria.
CLI:  python cli.py store_images "https://www.bravojogos.com.br/catan"
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/store_images/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -F "url=https://www.bravojogos.com.br/catan"
`url` é a página do produto na loja. As imagens são salvas em
data/output/store_images/<slug-da-url>/ e o JSON retornado traz origem,
resolução e caminho local de cada uma.
op_bling_export_to_iset automation Exporta produto(s) do Bling pra loja virtual 'iSET' já configurada no ERP -- a mesma ação do botão 'Exportar produtos multiloja' da listagem de produtos, replicando as chamadas reais em vez de clicar na UI. Selecione por id(s) do Bling (direto, sem busca) ou por SKU/nome exato (busca 1 produto); se 'ids_bling' vier preenchido, 'busca_sku_nome' é ignorado.
CLI:  python cli.py bling_export_to_iset busca_sku_nome=BDD101
      python cli.py bling_export_to_iset ids_bling=16674025429 ids_bling=16384133188
API:  curl -X POST http://<host>:8001/tasks/bling_export_to_iset/run-sync \
        -H "X-API-Key: <sua API_KEY>" -F "ids_bling=16674025429"
Campos:
  busca_sku_nome  -- SKU (campo 'codigo' no Bling) ou nome EXATO do produto;
                     usado só quando 'ids_bling' vier vazio; resolve 1 produto
                     e recusa (listando os candidatos) se o nome bater em mais de um
  ids_bling       -- 1+ ids internos do Bling (repita o campo, ou um por linha no
                     dashboard); tem prioridade -- se preenchido, ignora 'busca_sku_nome'
                     e exporta todos numa chamada só, sem precisar buscar nada
Usado só se 'ids_bling' (abaixo) estiver vazio. Resolve 1 produto só.
Um id por linha. Se preenchido, ignora o campo de busca acima e exporta todos de uma vez.
op_fornecedor_catalogo scraping Tira um snapshot do catálogo de um fornecedor -- disponibilidade, estoque e preço de tabela de cada produto -- pra alimentar decisão de compra em outro repo. Sem `codigos`: varre o catálogo inteiro. Com `codigos` (um ou mais códigos do fornecedor): resolve cada um individualmente via busca, devolvendo o casamento código->produto. Fornecedores cadastrados em tasks/fornecedor_catalogo/fornecedores.py: meeplebr, grok, asmodee, mosaico. Por padrão, sem login -- só o que a busca pública do fornecedor mostra. `autenticado=true` loga antes de coletar (ver sites/<fornecedor>.py); no catálogo MeepleBR isso NÃO muda o preço coletado -- ver NOTES.md 'Preço logado'. Fornecedores 'grok' (B2B Mercos) e 'asmodee' (B2B Oracle Commerce Cloud) EXIGEM autenticado=true -- nenhum dos dois tem catálogo anônimo, sem isso a chamada falha com erro claro (ver sites/grok.NOTES.md e NOTES.md deste diretório).
CLI (catálogo inteiro):
  python cli.py fornecedor_catalogo fornecedor=meeplebr
CLI (resolução por código, repita o campo pra vários):
  python cli.py fornecedor_catalogo fornecedor=meeplebr codigos=0208 codigos=0341
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/fornecedor_catalogo/run-sync \
    -H "X-API-Key: <sua API_KEY>" \
    -H "Content-Type: application/json" \
    -d '{"fornecedor": "meeplebr", "codigos": ["0208", "0341"]}'
`fornecedor` é o nome cadastrado em fornecedores.py (default meeplebr). `codigos` é opcional -- lista de códigos do fornecedor a resolver individualmente; omitido, a task varre o catálogo inteiro.
Um ou mais códigos pra resolver individualmente em vez de varrer o catálogo inteiro.
Loga no fornecedor (ver sites/<fornecedor>.py) antes de coletar, em vez da busca anônima de sempre -- vale tanto pro catálogo completo quanto pra 'codigos'. Ver NOTES.md 'Preço logado': no catálogo MeepleBR testado o preço coletado (min_price_range) é IDÊNTICO logado ou não -- ligar isso não muda o resultado hoje pra ela. Já pra 'grok' (Mercos) e 'asmodee' (OCC) é OBRIGATÓRIO -- sem login a busca de nenhum dos dois traz produto nenhum (Mercos responde 401; OCC responde totalNumRecs=0, disfarçado de catálogo vazio) -- ver sites/grok.NOTES.md e a NOTES.md deste diretório.
op_iset_publish_game_images chain Cadeia completa acionável pelo n8n: busca imagens do jogo nas lojas do catálogo (game_images), trata pro padrão da loja (image_prep), sobe pro produto no iSET pelo SKU (iset_add_product_images) e colhe os links direto do painel — sem o cache da página pública — enviando o resultado pra um webhook (iset_get_product_images_admin).
Recomendado pro n8n -- fire-and-forget (a cadeia leva minutos; a resposta chega
pelo webhook informado nos campos):
  curl -X POST http://<host>:8001/tasks/iset_publish_game_images/run \
    -H "X-API-Key: <sua API_KEY>" \
    -F "sku=AZU001" -F "nome=Azul" -F "sufixo_slug=meca dos jogos" \
    -F "webhook_url=https://n8n.exemplo/webhook/abc"
Alternativa bloqueante (devolve o JSON completo na resposta): trocar /run por /run-sync.
CLI:  python cli.py iset_publish_game_images sku=AZU001 nome=Azul webhook_url=https://...
Campos:
  sku          -- produto no iSET que recebe as imagens (obrigatório)
  nome         -- nome do jogo a buscar nas lojas (obrigatório)
  editora      -- opcional; só o site desta editora é buscado, antes dos lojistas
                  (vazia ou sem site no catálogo = só lojistas)
  sufixo_slug  -- opcional; nome dos arquivos vira <nome>-<sufixo>-N.jpg (padrão "meca dos jogos")
  webhook_url  -- opcional; recebe {produto_id, sku, nome, imagens} ao final
  acumular     -- opcional (true/false, padrão false): por padrão as imagens que o
                  produto já tinha saem depois do upload conferido (republicar não
                  duplica); true soma as novas às de antes
Os links vêm do PAINEL (iset_get_product_images_admin): refletem o upload na
hora, sem o cache da página pública, e funcionam com produto inativo.
Status possíveis no JSON: publicado | sem_lojas | sem_imagens | tratamento_sem_imagens | upload_falhou.
ATENÇÃO: o webhook é enviado pelo último passo -- se a cadeia falhar antes
(sem_lojas, upload_falhou...), NENHUM webhook é disparado; monitore o job/JSON.
Só o site desta editora é buscado, antes dos lojistas. Vazia = só lojistas.
Apague pra não usar sufixo nenhum.
Recebe o JSON com os links das imagens do produto ao final da cadeia.
Desmarcado (padrão): depois do upload conferido, a galeria de antes sai -- republicar troca as imagens em vez de duplicar.
op_iset_get_product_images_admin automation Loga no painel iSET, acha um produto por SKU ou nome e lê os links das imagens direto do formulário de edição do PAINEL (fonte da verdade, sem cache) -- funciona mesmo com produto inativo. A task irmã iset_get_product_images lê a página pública (o que o cliente vê, sujeita a cache logo após mudanças). Variante local (operador): por padrão manda o resultado pro webhook n8n que substitui as imagens do produto no Bling.
CLI:  python cli.py op_iset_get_product_images_admin produto=meeple0208
CLI (só ler, sem disparar nada):
      python cli.py op_iset_get_product_images_admin produto=meeple0208 webhook_url=none
API (blocks and returns the result as JSON):
  curl -X POST http://<host>:8001/tasks/op_iset_get_product_images_admin/run-sync \n    -H "X-API-Key: <sua API_KEY>" -H "Content-Type: application/json" \n    -d '{"produto": "meeple0208"}'
Campos:
  produto      -- SKU (preferido) ou nome do produto no painel (obrigatório)
  webhook_url  -- opcional. VAZIO = usa o DEFAULT do perfil ativo, setting
                  OP_IMAGENS_WEBHOOK_URL (no perfil 'operador': o webhook n8n
                  'Procedure Bling Substituir Imagens em Produto ID', que TROCA
                  as imagens do produto no Bling). Passe uma URL pra mandar pra
                  outro lugar, ou 'none' pra não disparar webhook nenhum. Sem
                  perfil/sem esse setting, vazio = não dispara nada.
ATENÇÃO: o default tem efeito EXTERNO (altera o produto no Bling). O n8n acha o
produto pela Data Table 'Produtos Catalogo' casando SkuMeca com o sku do payload:
se o produto for recém-cadastrado e não estiver lá, o webhook responde 200 e nada
é atualizado -- confira no Bling, não só pelo HTTP. Ver NOTES.md.
Requer ISET_ADMIN_USER e ISET_ADMIN_PASS configurados no servidor.
Vazio usa o webhook n8n que SUBSTITUI as imagens do produto no Bling. Informe outra URL pra desviar, ou 'none' pra não disparar nada.

Sessões

Sites com login e o estado da sessão salva (data/sessions/). "Renovar/Testar" reaproveita a sessão se ela ainda vale; "Resetar" descarta os cookies e loga do zero.

👁 Assistir navegador ao vivo Abre em nova aba (funciona do celular). Dentro da transmissão dá pra alternar pra "Assumir controle" depois de ver o que está rolando — envia seus cliques/teclado pro navegador, útil pra resolver checagens (Cloudflare etc.) na mão.

Manutenção do navegador — use se um job travar com "cannot open display" ou o navegador ficar pendurado.


"Reinicializar navegador" reinicia só o display/Xvfb (cirúrgico). "Reiniciar serviço" reinicia o container inteiro (recupera o app travado; o Xvfb sobe limpo).

SiteSessão salvaAções
bling 2026-08-15 18:46 (há 76 dia(s))
grok nenhuma — o primeiro job loga do zero
meeplebr nenhuma — o primeiro job loga do zero

Jobs recentes

Ver histórico completo →

JobTaskRefStatusCriado em
78416f63bb3f iset_atualizar_resumo {"sku": "MVB0034", "descricao_curta": "Protetor para cartas transparente de plástico PP, ideal para uso Side-Load. Cada embalagem contém 100 unidades."} done 2026-10-30T19:04:53.285097+00:00
29acea6af236 iset_atualizar_resumo {"sku": "MVB0031", "descricao_curta": "Protetor para cartas feito de plástico polipropileno transparente e não tóxico, ideal para preservar suas cartas em jogos de tabuleiro."} done 2026-10-30T18:30:55.892467+00:00
0c5b2b58dd50 iset_atualizar_resumo {"sku": "MVB0010", "descricao_curta": "Protetor para cartas de 70 x 120mm, em polipropileno transparente importado e não tóxico. Contém 100 unidades."} done 2026-10-30T18:20:17.675967+00:00
6a3c2a3ff9cb iset_atualizar_resumo {"sku": "MVB0005", "descricao_curta": "Protetor para cartas de 41 x 63 mm, feito de plástico PP transparente importado, não tóxico e disponível em pacote com 100 unidades."} done 2026-10-30T18:10:25.147918+00:00
ef59011621bc iset_atualizar_resumo {"sku": "MVB0018", "descricao_curta": "Protetor Premium para cartas de 70 x 120mm, feito de plástico polipropileno transparente importado e não tóxico. Contém 100 unidades."} done 2026-10-30T18:00:18.225641+00:00
1eb496304357 iset_atualizar_resumo {"sku": "MVB0006", "descricao_curta": "Protetor para cartas de alta qualidade, feito de plástico polipropileno transparente importado. Ideal para proteger suas cartas em jogos de tabuleiro."} done 2026-10-30T17:49:24.360963+00:00
fa3057004764 iset_atualizar_resumo {"sku": "MVB0017", "descricao_curta": "Protetores de cartas 80 x 120 mm feitos de plástico PP transparente, importado, sem PVC e 50% mais espesso. O pacote contém 100 unidades."} done 2026-10-30T17:30:44.706065+00:00
961f75792884 iset_atualizar_resumo {"sku": "MVB0003", "descricao_curta": "Protetor para cartas de 45 x 68 mm, feito em plástico PP transparente importado, não tóxico. Contém 100 unidades."} done 2026-10-30T17:19:34.429110+00:00
69cb86c2df0e iset_atualizar_resumo {"sku": "MVB0032", "descricao_curta": "Protetor para cartas de alta qualidade, feito de plástico polipropileno transparente importado. Ideal para proteger suas cartas em jogos de tabuleiro."} done 2026-10-30T17:09:41.339224+00:00
9cbfacd4ae48 iset_atualizar_resumo {"sku": "MVB0027", "descricao_curta": "Protetor para cartas de alta qualidade, feito de plástico PP transparente importado, não tóxico e com 100 unidades."} done 2026-10-30T17:00:08.605245+00:00
b885a1e06571 iset_atualizar_resumo {"sku": "MVB0028", "descricao_curta": "Protetor para cartas no tamanho 63,5 x 88 mm, feito de plástico polipropileno transparente importado e não tóxico. Contém 100 unidades."} done 2026-10-30T16:50:06.379944+00:00
71eadeb71667 iset_atualizar_resumo {"sku": "MVB0004", "descricao_curta": "Protetor para cartas de 56 x 87mm, feito de plástico PP transparente importado, não tóxico e de alta qualidade. Contém 100 unidades."} done 2026-10-30T16:39:41.210415+00:00
f33801d59694 iset_atualizar_resumo {"sku": "MVB0016", "descricao_curta": "Protetor para cartas de alta qualidade, feito de plástico polipropileno transparente importado, 50% mais espesso e não tóxico. Contém 100 unidades."} done 2026-10-30T16:29:00.992224+00:00
257e9ea04d79 iset_atualizar_resumo {"sku": "MVB0001", "descricao_curta": "Protetores para cartas de alta qualidade, confeccionados em plástico PP transparente importado. Ideal para proteger suas cartas durante os jogos."} done 2026-10-30T16:19:12.694125+00:00
3b75b330730d iset_atualizar_resumo {"sku": "MVB0007", "descricao_curta": "Protetor para cartas transparente de alta qualidade, fabricado em plástico polipropileno importado, com 100 unidades de 65 x 100 mm."} done 2026-10-30T15:46:20.847417+00:00
ac47614e97c8 iset_xml {"ref": "all"} done 2026-10-30T04:01:45.069818+00:00
56f302cd5cf6 iset_pre_venda_pendentes {} done 2026-10-29T20:46:31.494017+00:00
86aa389656dd iset_xml {"ref": "all"} done 2026-10-29T04:01:15.082597+00:00
daaaf45b4bf6 iset_xml {"ref": "all"} done 2026-10-28T04:01:16.873832+00:00
a652b378d661 iset_pre_venda_pendentes {} done 2026-10-27T23:40:43.262470+00:00

Último deploy: 30/10/2026 16:04