Commentaire
Lire les commentaires et leur état de modération
GET/api/v1/addons/shopently.blog/comments/{comment_id}
- Authentification
Bearer- Disponible à partir de
- BASIC
- Module installé requis
shopently.blog· Version du contrat du module 1- Autorisations requises
addon.shopently.blog:comment_read
Exemples de code
Exemple de requête
cURL
: "${SHOPENTLY_SHOP_URL:?}"
curl --disable --globoff --fail-with-body --silent --show-error \
--proto '=https' --connect-timeout 5 --max-time 30 \
--request GET \
--header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
--url "${SHOPENTLY_SHOP_URL%/}"/api/v1/addons/shopently.blog/comments/2247b58d-1521-4fc0-9eec-6c47c259c181
PHP
<?php
declare(strict_types=1);
$baseUrl = rtrim(getenv('SHOPENTLY_SHOP_URL') ?: '', '/');
$origin = parse_url($baseUrl);
if (!$origin || ($origin['scheme'] ?? '') !== 'https' || empty($origin['host']) ||
isset($origin['user'], $origin['pass']) || isset($origin['user']) || isset($origin['path']) ||
isset($origin['query']) || isset($origin['fragment'])) {
throw new RuntimeException('SHOPENTLY_SHOP_URL must be an HTTPS origin');
}
$credential = getenv('SHOPENTLY_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
throw new RuntimeException('Invalid credential');
}
$headers = [];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/addons/shopently.blog/comments/2247b58d-1521-4fc0-9eec-6c47c259c181');
curl_setopt_array($handle, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 30,
CURLOPT_HEADERFUNCTION => static function ($handle, string $line) use (&$responseHeaders): int {
if (str_contains($line, ':')) {
[$name, $value] = explode(':', $line, 2);
$responseHeaders[strtolower(trim($name))] = trim($value);
}
return strlen($line);
},
]);
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false) {
throw new RuntimeException('Transport error: ' . $error);
}
if ($status < 200 || $status >= 300) {
throw new RuntimeException('HTTP ' . $status . '; request_id=' .
($responseHeaders['x-request-id'] ?? '') . '; retry_after=' . ($responseHeaders['retry-after'] ?? ''));
}
$result = $raw === '' ? null : json_decode($raw, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), PHP_EOL;
Python
from contextlib import ExitStack
import json
import os
from urllib.parse import urlsplit
import requests # python -m pip install requests
base_url = os.environ["SHOPENTLY_SHOP_URL"].rstrip("/")
origin = urlsplit(base_url)
if origin.scheme != "https" or not origin.hostname or origin.username or origin.password or origin.path or origin.query or origin.fragment:
raise ValueError("SHOPENTLY_SHOP_URL must be an HTTPS origin")
credential = os.environ['SHOPENTLY_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
raise ValueError("Invalid credential")
headers = {}
headers["Authorization"] = 'Bearer' + " " + credential
body = None
if body is not None:
headers["Content-Type"] = "application/json"
with ExitStack() as stack:
session = stack.enter_context(requests.Session())
files = None
if False:
image = stack.enter_context(open(os.environ["SHOPENTLY_IMAGE_FILE"], "rb"))
if os.fstat(image.fileno()).st_size > 5242880:
raise ValueError("Image exceeds 5 MiB")
files = {"file": ("article.png", image, "image/png")}
response = session.request(
'GET', base_url + '/api/v1/addons/shopently.blog/comments/2247b58d-1521-4fc0-9eec-6c47c259c181', headers=headers,
data=body.encode("utf-8") if body is not None else None, files=files,
timeout=(5, 30), allow_redirects=False,
)
if not 200 <= response.status_code < 300:
raise RuntimeError(f"HTTP {response.status_code}; request_id={response.headers.get('X-Request-ID', '')}; retry_after={response.headers.get('Retry-After', '')}")
if False:
if response.headers.get("Content-Type") != "image/webp" or len(response.content) > 5242880:
raise ValueError("Unexpected image response")
with open(os.environ["SHOPENTLY_OUTPUT_FILE"], "xb") as output:
output.write(response.content)
else:
result = response.json() if response.content else None
print(json.dumps(result, ensure_ascii=False, indent=2))
Exemple de réponse 200
{
"data": {
"actor_id": "api_key_7da1addab52348fcbf1284d01a152ebb",
"actor_kind": "api",
"body": "Zapraszamy do zadawania pytań.",
"created_at": "2026-10-07T23:17:44.892022Z",
"display_name": "Redakcja",
"edited_at": null,
"id": "2247b58d-1521-4fc0-9eec-6c47c259c181",
"locale": "pl",
"moderation_reason": null,
"post_id": "2103ba96-2713-420b-b197-8a008730c851",
"status": "approved",
"updated_at": "2026-10-07T23:17:44.892022Z",
"version": 1
},
"meta": {
"request_id": "c29e8186-8b51-4f6a-9479-f6a0be76cc23"
}
}
Vue d’ensemble
Animez le blog de votre boutique avec des articles HTML, des photos, des auteurs et des métadonnées pour les moteurs de recherche. Enregistrez des brouillons, préparez des traductions et publiez immédiatement ou à une heure choisie dans un fuseau précis. Gérez les commentaires et leur modération dans le panneau ; un générateur externe peut utiliser l’API avec les autorisations accordées.
BASIC · api.enabled · addons.use(shopently.blog) · addon.shopently.blog:comment_read
Paramètres
Paramètres de chemin
comment_idChaîneObligatoireIdentifiant de ressource ; conserver la valeur renvoyée.
format:"uuid"
Cette opération n'accepte pas de corps JSON.
Réponses
Réponse 200
dataObjetChamps supplémentaires: NonObligatoireDonnées d'une réponse réussie.
Champs ·
dataactor_idChaîneObligatoireIdentifiant de l’acteur
minLength:1maxLength:63actor_kindChaîneObligatoireType d’acteur
Contraintes
enum["administrator", "customer", "api"]
bodyChaîneObligatoireCommentaire
minLength:1maxLength:5000created_atChaîneObligatoireDate et heure de création.
format:"date-time"display_nameChaîneObligatoireNom
minLength:1maxLength:160edited_atChaîne nullObligatoireModifié
Chaîne:format:"date-time"idChaîneObligatoireIdentifiant de ressource ; conserver la valeur renvoyée.
format:"uuid"localeChaîneObligatoireLangue sélectionnée pour cette requête.
minLength:2maxLength:35Contraintes
pattern"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
moderation_reasonChaîne nullObligatoireMotif de modération
Chaîne:maxLength:500post_idChaîneObligatoireArticle
format:"uuid"statusChaîneObligatoireStatut accepté par cette opération précise.
Contraintes
enum["pending", "approved", "rejected", "spam"]
updated_atChaîneObligatoireDate et heure de la dernière modification.
format:"date-time"versionEntierObligatoireVersion de ressource utilisée pour le contrôle de concurrence.
minimum:1maximum:9223372036854775807
metaObjetChamps supplémentaires: NonObligatoireMétadonnées de la réponse.
Champs ·
metarequest_idChaîneObligatoireIdentifiant de demande ; dans les métadonnées, identifiant de la requête HTTP.
minLength:1maxLength:100
Statut HTTP
200- Réponse réussie Schéma
400- Requête invalide
401- Authentification requise
403- Accès refusé
404- Ressource introuvable
409- Conflit de version
422- Échec de validation
429- Limite de requêtes dépassée
Autres statuts HTTP (7)
405- Méthode non autorisée
413- Requête trop volumineuse
415- Format non pris en charge
500- Erreur du serveur
502- Erreur de passerelle API
503- Service indisponible
504- Délai de passerelle dépassé
Catalogue des erreurs: ErrorResponse
En-têtes
401
WWW-AuthenticateChaîneFacultatifSchéma d'authentification exigé par le serveur.
405
AllowChaîneFacultatifMéthodes HTTP prises en charge par cette ressource.
429, 503
Retry-AfterEntierFacultatifDélai minimal avant une nouvelle tentative, en secondes.
minimum:0