Demo : http://store.borninthe80s.fr
Script pour aller chercher les informations de la collection via Discogs via l’API Python et les ajouter ensuite dans WooCOmmerce.
- Librairies utilisées
Ce script permet de synchroniser les listings de Discogs avec une boutique WooCommerce. Il gère plusieurs cas pour ajouter ou mettre à jour les produits.
Fonctionnalités principales
- Connexion à l’API Discogs pour récupérer les listings en vente.
- Connexion à l’API WooCommerce pour ajouter ou mettre à jour les produits.
- Gestion des stocks activée sur WooCommerce.
- Ajout ou mise à jour des attributs spécifiques aux produits :
- Artiste
- Format
- Genre
- Label
- Pays
- Sortie
- Style
- URLPHOTO_Discogs (URL de la photo sur Discogs, invisible)
- URL_Discogs (URL de la fiche Discogs, invisible)
- ID_Discogs (ID Discogs, invisible)
Fonctionnement
Étape 1 : Récupération des listings Discogs
Le script :
- Se connecte à l’API Discogs en utilisant un token d’authentification.
- Récupère tous les listings marqués “For Sale”.
- Ignore les listings qui ne sont pas en vente.
Étape 2 : Préparation des données
Pour chaque disque en vente, le script :
- Construit un titre au format : Artiste – Titre.
- Ajoute une description détaillée avec des informations comme :
- Label
- Format
- Pays
- Année de sortie
- Genre
- Style
- Prépare les attributs WooCommerce.
Étape 3 : Vérification de l’existence dans WooCommerce
Pour chaque disque, le script vérifie s’il existe déjà dans WooCommerce en utilisant le champ SKU (ID Discogs) :
- Cas 1 : Le produit n’existe pas dans WooCommerce
→ Le produit est ajouté avec un stock initial de 1.
- Cas 2 : Le produit existe et son stock est égal à 1
→ Aucune action n’est effectuée.
- Cas 3 : Le produit existe mais son stock est à 0
→ Le stock est remis à 1.
Étape 4 : Gestion des stocks
Lors de la mise à jour ou de l’ajout des produits :
- La gestion des stocks est activée.
- Le stock initial est défini à 1.
Pré-requis
- Une clé API Discogs valide.
- Une configuration correcte de WooCommerce (URL, Consumer Key, Consumer Secret).
- Les attributs correspondants doivent exister dans WooCommerce (par exemple, “Artiste”, “Format”).
Logs
Le script affiche des messages pour chaque étape :
- Succès lors de l’ajout ou de la mise à jour des produits.
- Erreurs éventuelles lors des appels aux API.
Cas d’utilisation
Ce script est idéal pour les utilisateurs qui souhaitent :
- Synchroniser automatiquement leur inventaire Discogs avec WooCommerce.
- Garder leur stock à jour en fonction des ventes ou de l’ajout de nouveaux disques.
Limites
- Les erreurs de connexion aux API ou les mauvais formats de données ne sont pas automatiquement corrigés.
- Les catégories WooCommerce doivent être configurées manuellement avant l’exécution.
Améliorations possibles
- Ajouter des fichiers de logs pour un suivi détaillé.
- Gérer les erreurs de mise à jour des stocks de manière plus robuste.
Code
import discogs_client
import csv
import time
import requests # Pour télécharger les photos
from datetime import datetime
import os
from woocommerce import API
# Configuration WooCommerce
wcapi = API(
url="https://store.borninthe80s.fr", # Remplacez par l'URL correcte
consumer_key="montoken",
consumer_secret="montoken",
version="wc/v3",
timeout=30
)
# Authentification Discogs
TOKEN = 'montoken'
client = discogs_client.Client('DiscogsPrestashopApp/1.0', user_token=TOKEN)
def get_product_by_sku(sku):
try:
response = wcapi.get(f"products?sku={sku}")
if response.status_code == 200:
products = response.json()
return products[0] if products else None
else:
print(f"Erreur lors de la recherche du produit SKU {sku} : {response.status_code}")
return None
except Exception as e:
print(f"Erreur lors de la récupération du produit SKU {sku} : {e}")
return None
def update_stock(product_id, quantity):
try:
print(f"Mise à jour du stock pour le produit ID {product_id} à {quantity}")
data = {"stock_quantity": quantity, "manage_stock": True}
response = wcapi.put(f"products/{product_id}", data)
if response.status_code == 200:
print(f"Stock mis à jour avec succès pour le produit ID {product_id}")
else:
print(f"Erreur lors de la mise à jour du stock pour le produit ID {product_id} : {response.status_code}")
except Exception as e:
print(f"Erreur lors de la mise à jour du stock pour le produit ID {product_id} : {e}")
def ajouter_produit_woocommerce(product):
try:
print(f"Ajout du produit dans WooCommerce : {product['name']}")
response = wcapi.post("products", product)
if response.status_code == 201: # Produit créé
print(f"Produit ajouté avec succès : {response.json()['name']}")
else:
print(f"Erreur WooCommerce : {response.status_code} - {response.json()}")
except Exception as e:
print(f"Erreur lors de l'ajout du produit : {e}")
# Récupérer les listings de Discogs
try:
print("Connexion à l'API Discogs...")
user = client.identity()
print(f"Connecté en tant que : {user.username}")
print("Récupération des listings en vente depuis Discogs...")
listings = client.user(user.username).inventory
print(f"Nombre total de listings récupérés : {len(listings)}")
for i, listing in enumerate(listings):
print(f"Traitement du listing {i + 1}/{len(listings)}")
if listing.status != 'For Sale':
print(f"Listing ignoré (statut non 'For Sale') : {listing.release.title}")
continue
release = listing.release
artists = ", ".join([artist.name for artist in release.artists])
formats = ", ".join([
format['name'] + (", " + ", ".join(format.get('descriptions', [])) if 'descriptions' in format else "")
for format in release.formats
])
styles = ", ".join(release.styles or [])
labels = ", ".join([label.name for label in release.labels])
label_catalog_numbers = ", ".join(
[label.data['catno'] for label in release.labels if 'catno' in label.data and label.data['catno']]
)
photo_url = release.images[0]['uri'] if release.images else None
discogs_url = release.data.get('uri', 'URL non disponible')
# Préparer les données du produit pour WooCommerce
description_prefix = (
f"Label: {labels}\n"
f"Format: {formats}\n"
f"Pays: {release.country}\n"
f"Sortie: {release.year}\n"
f"Genre: {', '.join(release.genres or [])}\n"
f"Style: {styles}\n\n"
)
product_data = {
"name": f"{artists} - {release.title}",
"type": "simple",
"regular_price": str(listing.price.value),
"description": description_prefix + (listing.comments or ""),
"categories": [{"id": 15}], # Remplacez par une catégorie valide
"images": [{"src": photo_url}] if photo_url else [],
"sku": str(listing.id), # Ajouter l'ID Discogs dans le champ UGS
"manage_stock": True, # Activer la gestion des stocks
"stock_quantity": 1, # Définir le stock initial à 1
"attributes": [
{"name": "Artiste", "visible": True, "options": [artists]},
{"name": "Format", "visible": True, "options": [formats]},
{"name": "Genre", "visible": True, "options": [', '.join(release.genres or [])]},
{"name": "Label", "visible": True, "options": [labels]},
{"name": "Pays", "visible": True, "options": [release.country]},
{"name": "Sortie", "visible": True, "options": [str(release.year)]},
{"name": "Style", "visible": True, "options": [styles]},
{"name": "URLPHOTO_Discogs", "visible": False, "options": [photo_url] if photo_url else ["Aucune photo"]},
{"name": "URL_Discogs", "visible": False, "options": [discogs_url]},
{"name": "ID_Discogs", "visible": False, "options": [str(listing.id)]}
]
}
# Vérifier si le produit existe déjà dans WooCommerce
existing_product = get_product_by_sku(product_data['sku'])
if existing_product:
stock_quantity = existing_product.get('stock_quantity', 0)
if stock_quantity == 1:
print(f"Le produit {existing_product['name']} existe déjà avec un stock de 1, aucune action nécessaire.")
elif stock_quantity == 0:
update_stock(existing_product['id'], 1)
else:
print(f"Le produit {existing_product['name']} a un stock inattendu ({stock_quantity}), vérifiez manuellement.")
else:
ajouter_produit_woocommerce(product_data)
print("Traitement des listings terminé.")
except Exception as e:
print(f"Erreur : {e}")