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.
$ 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# .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: exportQue receita lhe serve?
| Tem… | Use | Código necessário |
|---|---|---|
| um CSV ou zip num endereço web, servidor SFTP ou bucket S3 | Importação agendada | nenhum |
| uma pasta onde chegam as exportações | obx watch | nenhum |
| um servidor ou PC que corre tarefas à noite | cron ou Agendador de Tarefas | uma linha |
| as exportações num repositório Git | GitHub Action | um ficheiro YAML |
| n8n, Make ou Zapier | Passos HTTP | nenhum (visual) |
| um programador que liga o seu PIM ou ERP | A API diretamente | um 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.
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,2000100101025images/
KO-1001_NVY_1.jpg ← style KO-1001, colour NVY, position 1 (front)
KO-1001_NVY_2.jpg
KO-1001_NVY_3.jpgO 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 errorsCódigo de saída 0 = tudo bem, 2 = concluído mas algumas linhas tinham erros (são listadas), 1 = falhou.
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/outboxdocker run -d --restart unless-stopped \
-e OBX_URL -e OBX_TOKEN \
-v /data/outbox:/outbox \
ghcr.io/openbrandexchange/obx watch /outbox3. cron ou Agendador de Tarefas do Windows
# 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$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/images5. 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.
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}]}]}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"}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.
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.
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"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