Automatização

Continue a trabalhar como trabalha hoje.

O seu PIM, ERP, DAM ou uma pasta partilhada já tem os dados e as fotografias. Escolha a primeira receita que servir: todas funcionam com qualquer portal Open Brand Exchange.

Terminal
$ obx push ./export
Publishing to brands.kestrel.example (Kestrel, Kestrel Trail)
images: 27 checked, 3 uploaded (4.2 MB) in 3s
Done: rows: 40, images: 27 → new: 2 · updated: 3 · unchanged: 35
publish.ymlGitHub Action
# .github/workflows/publish.yml
on:
  push:
    paths: ["export/**"]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: openbrandexchange/obx-go/push-action@v0
        with:
          url: ${{ secrets.OBX_URL }}
          token: ${{ secrets.OBX_TOKEN }}
          folder: export

Que receita lhe serve?

Tem…UseCódigo necessário
um CSV ou zip num endereço web, servidor SFTP ou bucket S3Importação agendadanenhum
uma pasta onde chegam as exportaçõesobx watchnenhum
um servidor ou PC que corre tarefas à noitecron ou Agendador de Tarefasuma linha
as exportações num repositório GitGitHub Actionum ficheiro YAML
n8n, Make ou ZapierPassos HTTPnenhum (visual)
um programador que liga o seu PIM ou ERPA API diretamenteum pouco

Um formato para tudo

Todas as formas de publicar leem o mesmo: um products.csv com uma linha por tamanho e fotografias chamadas {style}_{color}_{position}.jpg (referência, cor, posição). Com isso, todas as receitas abaixo funcionam.

products.csv (abreviado)
brand,style_number,name:en,name:nl,item_type,season,materials,color_code,color_name:en,size,gtin
Kestrel,KO-1001,Merino Crew Sweater,Merino trui met ronde hals,sweater,AW26,main: 100% merino_wool,NVY,Navy,S,2000100101018
Kestrel,KO-1001,Merino Crew Sweater,Merino trui met ronde hals,sweater,AW26,main: 100% merino_wool,NVY,Navy,M,2000100101025
Nomes dos ficheiros de fotografia
images/
  KO-1001_NVY_1.jpg     ← style KO-1001, colour NVY, position 1 (front)
  KO-1001_NVY_2.jpg
  KO-1001_NVY_3.jpg

O formato de importação completo

O que precisa

Na sua administração, abra Envio automático → Chaves de acesso e crie uma nova chave. Fica com dois valores: o endereço do seu portal (OBX_URL) e a própria chave (OBX_TOKEN). A chave só é mostrada uma vez.

export OBX_URL=https://brands.kestrel.example
export OBX_TOKEN=obxi_…   # admin → Automatic upload → Access keys (shown once)

Dê a cada sistema a sua própria chave. Assim pode revogar uma sem afetar as outras.

1. Importação agendada (sem código)

Na sua administração: Envio automático → Importações agendadas → Adicionar importação agendada. Escolha a origem e a frequência.

  • Endereço web (HTTPS): o endereço de um products.csv, ou de um zip com products.csv e fotografias. As credenciais são guardadas cifradas.
  • SFTP: servidor, utilizador, palavra-passe ou chave, e a pasta com a exportação.
  • Bucket S3: AWS S3, Cloudflare R2, MinIO ou Backblaze: endpoint, bucket, pasta e uma chave só de leitura.

Escolha «Só adicionar e atualizar» ou «Retirar também os artigos em falta». A segunda opção retira também o que desapareceu do ficheiro, mas para se mais de metade de uma marca fosse desaparecer, para que uma exportação com defeito nunca esvazie o seu catálogo. «Testar ligação» mostra que ficheiros seriam lidos.

A ferramenta obx

O obx é um único programa para Windows, macOS e Linux. Lê OBX_URL e OBX_TOKEN do ambiente, envia apenas fotografias novas ou alteradas, cria as versões web quando necessário e espera até o portal ter processado tudo. Execute-o as vezes que quiser: artigos sem alterações não custam nada.

obx info                                            # check the token, see limits and brands
obx push --csv products.csv --images ./images       # publish a CSV and a folder (or zip) of images
obx push --package export.zip                       # the same, as one zip
obx push --csv products.csv --images ./images --mirror   # also take offline what is no longer in the file
obx push --csv products.csv --images ./images --dry-run  # only check, change nothing
obx watch ./outbox                                  # keep publishing whatever lands in a folder
obx status                                          # recent jobs and their errors

Código de saída 0 = tudo bem, 2 = concluído mas algumas linhas tinham erros (são listadas), 1 = falhou.

Transferir o obx · obx-go

2. Uma pasta que se publica sozinha: obx watch

Deixe o seu PIM, ERP ou um colega guardar exportações numa pasta. O obx watch publica assim que algo muda e ignora fotografias que ficaram iguais. Execute-o como serviço ou com Docker:

obx watch /data/outbox
Docker
docker run -d --restart unless-stopped \
  -e OBX_URL -e OBX_TOKEN \
  -v /data/outbox:/outbox \
  ghcr.io/openbrandexchange/obx watch /outbox

3. cron ou Agendador de Tarefas do Windows

Linux ou macOS
# crontab -e: every night at 02:30
30 2 * * * OBX_URL=https://brands.kestrel.example OBX_TOKEN=obxi_… /usr/local/bin/obx push --csv /exports/products.csv --images /exports/images >> /var/log/obx.log 2>&1
Windows (PowerShell, uma vez)
$action = New-ScheduledTaskAction -Execute "C:\Tools\obx.exe" -Argument "push --csv D:\Export\products.csv --images D:\Export\images"
$trigger = New-ScheduledTaskTrigger -Daily -At 2:30am
[Environment]::SetEnvironmentVariable("OBX_URL", "https://brands.kestrel.example", "Machine")
[Environment]::SetEnvironmentVariable("OBX_TOKEN", "obxi_…", "Machine")
Register-ScheduledTask -TaskName "Publish to OBX" -Action $action -Trigger $trigger -User "SYSTEM"

4. GitHub Action

Guarde OBX_URL e OBX_TOKEN como segredos do repositório. O mesmo funciona no GitLab CI, Bitbucket ou Azure DevOps: instale o obx e execute obx push.

# .github/workflows/publish.yml  (secrets: OBX_URL, OBX_TOKEN)
name: Publish product content
on:
  push:
    branches: [main]
    paths: ["export/**"]
  schedule:
    - cron: "30 2 * * *"
  workflow_dispatch:
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install obx
        run: |
          curl -fsSL https://github.com/openbrandexchange/obx-go/releases/latest/download/obx_linux_amd64.tar.gz | tar -xz obx
          sudo mv obx /usr/local/bin/
      - name: Publish
        env:
          OBX_URL: ${{ secrets.OBX_URL }}
          OBX_TOKEN: ${{ secrets.OBX_TOKEN }}
        run: obx push --csv export/products.csv --assets-csv export/assets.csv --images export/images

5. n8n, Make ou Zapier

Use um passo HTTP Request normal com o cabeçalho Authorization: Bearer seguido da sua chave. Cada passo pode ser repetido sem risco: enviar os mesmos dados duas vezes não muda nada.

Artigo (por exemplo, quando muda no PIM)
PUT {OBX_URL}/obx/v1/ingest/products/KO-1001
Authorization: Bearer obxi_…
Content-Type: application/json

{"style_number": "KO-1001",
 "name": {"en": "Merino Crew Sweater", "nl": "Merino trui met ronde hals"},
 "item_type": "sweater", "season": "AW26",
 "materials": [{"part": "main", "fibers": [{"fiber": "merino_wool", "percentage": 100}]}]}
Cor e tamanho, com o respetivo EAN
PUT {OBX_URL}/obx/v1/ingest/variants/2000100101025
Authorization: Bearer obxi_…
Content-Type: application/json

{"product_external_id": "KO-1001", "gtin": "2000100101025",
 "color": {"code": "NVY", "name": {"en": "Navy"}}, "size": "M"}
Fotografia: primeiro os dados, depois o ficheiro
PUT {OBX_URL}/obx/v1/ingest/assets/KO-1001_NVY_1
Authorization: Bearer obxi_…
Content-Type: application/json

{"product_external_id": "KO-1001", "color_code": "NVY",
 "role": "packshot", "view": "front", "position": 1}

PUT {OBX_URL}/obx/v1/ingest/assets/KO-1001_NVY_1/files/original
Authorization: Bearer obxi_…
Content-Type: image/jpeg

<the image file as binary body>

O Portal para Cloudflare não cria sozinho versões web das fotos. Publique aí com o obx ou através de «Importações» na sua administração: eles criam-nas por si. As fotos que chegam de outra forma, por exemplo por uma importação agendada, são mostradas até lá no tamanho original.

Retirar algo
PATCH {OBX_URL}/obx/v1/ingest/products/KO-1001
Authorization: Bearer obxi_…
Content-Type: application/merge-patch+json

{"status": "unpublished"}

Quer ser avisado quando algo acontece? Na sua administração, adicione uma notificação (webhook) para uma importação concluída ou um novo pedido de acesso, e use-a para disparar o n8n, Make ou Zapier.

6. A API diretamente (para programadores)

Uma integração lembra-se do que enviou da última vez e envia só as alterações, em lotes. Ou envie o CSV tal como está e deixe o portal lê-lo.

Ignorar as fotografias que o portal já tem e enviar um lote
URL="$OBX_URL/obx/v1/ingest"; AUTH="Authorization: Bearer $OBX_TOKEN"

# 1. Upload only the images the node does not have yet (addressed by sha256).
for f in images/*.jpg; do
  sha=$(shasum -a 256 "$f" | cut -d' ' -f1)
  curl -sf -I -H "$AUTH" "$URL/blobs/$sha" >/dev/null || \
    curl -sf -X PUT -H "$AUTH" -H 'Content-Type: image/jpeg' --data-binary @"$f" "$URL/blobs/$sha"
done

# 2. One batch of up to 1000 operations (NDJSON), processed in order.
cat > batch.ndjson <<'EOF'
{"op":"upsert","kind":"product","external_id":"KO-1001","data":{"style_number":"KO-1001","name":{"en":"Merino Crew Sweater"}}}
{"op":"upsert","kind":"variant","external_id":"2000100101025","data":{"product_external_id":"KO-1001","gtin":"2000100101025","color":{"code":"NVY"},"size":"M"}}
{"op":"unpublish","kind":"product","external_id":"KO-0999"}
EOF
curl -s -X POST -H "$AUTH" -H 'Content-Type: application/x-ndjson' \
  -H "Idempotency-Key: nightly-$(date +%F)" --data-binary @batch.ndjson "$URL/batch"
Um CSV e um zip de fotografias de uma só vez
curl -s -X POST -H "Authorization: Bearer $OBX_TOKEN" \
  -F [email protected] -F [email protected] \
  -F 'options={"mode":"upsert"};type=application/json' \
  "$OBX_URL/obx/v1/ingest/imports"          # returns a job; poll $OBX_URL/obx/v1/ingest/jobs/<id>

Todos os pormenores estão na especificação:Ingest API ·receitas de automatização ·SDK Go ·Programadores