| Nome | Tipo | Descrição | Exemplo de uso | Disparar |
|---|---|---|---|---|
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 |
|
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). |
|
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. |
|
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). |
|
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). |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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 |
|
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. |
|
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. |
|
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. |
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.
| Site | Sessão salva | Açõ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 |
| Job | Task | Ref | Status | Criado 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