+import datetime
+
import requests
+from django.conf import settings
from django.core.management.base import BaseCommand
-import datetime
+
+# Skeepers / Avis Vérifiés - Published API (OAuth2 client credentials)
+# Replaces the legacy cl.avis-verifies.com "publication" API deactivated on
+# 2026-11-17. See https://apidocs.skeepers.io/migrations-published.html
+SKEEPERS_TOKEN_URL = 'https://auth.skeepers.io/realms/skeepers/protocol/openid-connect/token'
+SKEEPERS_API_URL = 'https://api.skeepers.io/verified-reviews/v1/published'
+SKEEPERS_AUDIENCE = 'verified-reviews'
+
class Command(BaseCommand):
- help = "Fetch product reviews"
-
- def handle(self, *args, **kwargs):
- product_id = "CONF0124"
- url = f'http://cl.avis-verifies.com/fr/cache/8/d/a/8da32059-03b0-23c4-1554-4f4b505a8c6a/AWS/PRODUCT_API/REVIEWS/{product_id}.json'
- response = requests.get(url)
- if response.status_code == 200:
- avis_list = response.json()
- for avis in avis_list:
- print("*"*7)
- print(avis)
- print("*"*7)
- date = avis['publish_date']
- if date == 'Array':
- date = avis['review_date']
- if date == 'Array':
- continue
+ help = "Fetch product reviews from the Skeepers Published API"
+
+ def add_arguments(self, parser):
+ parser.add_argument('--product', default='CONF0124')
+
+ def get_token(self):
+ response = requests.post(
+ SKEEPERS_TOKEN_URL,
+ data={
+ 'grant_type': 'client_credentials',
+ 'client_id': settings.SKEEPERS_CLIENT_ID,
+ 'client_secret': settings.SKEEPERS_CLIENT_SECRET,
+ 'audience': SKEEPERS_AUDIENCE,
+ },
+ timeout=10,
+ )
+ response.raise_for_status()
+ return response.json()['access_token']
+
+ def handle(self, *args, **options):
+ product_id = options['product']
+ if not settings.SKEEPERS_CLIENT_ID or not settings.SKEEPERS_CLIENT_SECRET:
+ self.stderr.write("SKEEPERS_CLIENT_ID / SKEEPERS_CLIENT_SECRET are not configured")
+ return
+
+ token = self.get_token()
+ response = requests.get(
+ SKEEPERS_API_URL + '/products/reviews',
+ params={'product_variation_id': product_id, 'limit': 200},
+ headers={'Authorization': 'Bearer %s' % token},
+ timeout=10,
+ )
+ if response.status_code != 200:
+ self.stderr.write("Failed to fetch reviews: %s" % response.status_code)
+ return
+
+ for avis in response.json():
+ print("*" * 7)
+ print(avis)
+ date = avis.get('publish_date') or avis.get('review_date')
+ if date:
avis['publish_date'] = datetime.datetime.strptime(
- date, '%Y-%m-%d %H:%M:%S')
- else:
- self.stderr.write(f"Failed to fetch reviews: {response.status_code}")
+ date[:19], '%Y-%m-%dT%H:%M:%S')
+ print("*" * 7)