تعليق جديد
إنشاء تعليقات فريق التحرير
POST/api/v1/addons/shopently.blog/comments
- المصادقة
Bearer- متاح بدءًا من
- BASIC
- الوحدة المثبتة المطلوبة
shopently.blog· إصدار عقد الوحدة 1- الصلاحيات المطلوبة
addon.shopently.blog:comment_create
أمثلة الكود
مثال على الطلب
cURL
: "${SHOPENTLY_SHOP_URL:?}"
curl --disable --globoff --fail-with-body --silent --show-error \
--proto '=https' --connect-timeout 5 --max-time 30 \
--request POST \
--header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
--header 'Idempotency-Key: learn-e53442b24a8748e79c202f8ad4c82b9e' \
--header 'Content-Type: application/json' \
--data-raw '{
"body": "Zapraszamy do zadawania pytań.",
"display_name": "Redakcja",
"locale": "pl",
"post_id": "2103ba96-2713-420b-b197-8a008730c851"
}' \
--url "${SHOPENTLY_SHOP_URL%/}"/api/v1/addons/shopently.blog/comments
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 = ['Idempotency-Key: learn-e53442b24a8748e79c202f8ad4c82b9e', 'Content-Type: application/json'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/addons/shopently.blog/comments');
curl_setopt_array($handle, [
CURLOPT_CUSTOMREQUEST => 'POST',
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);
},
]);
curl_setopt($handle, CURLOPT_POSTFIELDS, '{
"body": "Zapraszamy do zadawania pytań.",
"display_name": "Redakcja",
"locale": "pl",
"post_id": "2103ba96-2713-420b-b197-8a008730c851"
}');
$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 = {'Idempotency-Key': 'learn-e53442b24a8748e79c202f8ad4c82b9e'}
headers["Authorization"] = 'Bearer' + " " + credential
body = '{\n "body": "Zapraszamy do zadawania pytań.",\n "display_name": "Redakcja",\n "locale": "pl",\n "post_id": "2103ba96-2713-420b-b197-8a008730c851"\n}'
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(
'POST', base_url + '/api/v1/addons/shopently.blog/comments', 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))
مثال على الاستجابة 201
{
"data": {
"id": "2247b58d-1521-4fc0-9eec-6c47c259c181",
"status": "approved",
"version": 1
},
"meta": {
"request_id": "75ae817c-2925-48e0-ab57-1216a6e4ed45"
}
}
نظرة عامة
أدر مدونة متجرك بمقالات HTML وصور وكتّاب وبيانات وصفية لمحركات البحث. احفظ المسودات وأعد الترجمات وانشر فورًا أو في موعد تحدده ضمن منطقة زمنية معينة. أدر التعليقات ومراجعتها من اللوحة، ويمكن لمولّد خارجي استخدام API بالصلاحيات التي تمنحها.
BASIC · api.enabled · addons.use(shopently.blog) · addon.shopently.blog:comment_create
المعاملات
ترويسات الطلب
Idempotency-Keyسلسلة نصيةمطلوبمعرّف فريد لعملية كتابة منطقية واحدة.
minLength:1maxLength:128القيود
pattern"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
محتوى الطلب
application/json · مطلوب
bodyسلسلة نصيةمطلوبالتعليق
minLength:1maxLength:5000display_nameسلسلة نصيةمطلوبالاسم
minLength:1maxLength:160expected_versionعدد صحيحاختياريالإصدار المقروء قبل الكتابة؛ يؤدي عدم التطابق إلى رفض التحديث.
const:1localeسلسلة نصيةمطلوباللغة المحددة لهذا الطلب.
minLength:2maxLength:35القيود
pattern"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
post_idسلسلة نصيةمطلوبالمقال
format:"uuid"
الاستجابات
الاستجابة 201
dataكائنحقول إضافية: لامطلوبمحتوى الاستجابة الناجحة.
الحقول ·
dataidسلسلة نصيةمطلوبمعرّف المورد؛ احتفظ به كما أعيد.
format:"uuid"statusسلسلة نصيةمطلوبالحالة التي تقبلها هذه العملية تحديدًا.
القيود
enum["pending", "approved", "rejected", "spam"]
versionعدد صحيحمطلوبإصدار المورد المستخدم للتحكم في التعديلات المتزامنة.
minimum:1maximum:9223372036854775807
metaكائنحقول إضافية: لامطلوبالبيانات الوصفية للاستجابة.
الحقول ·
metarequest_idسلسلة نصيةمطلوبمعرّف الطلب؛ في البيانات الوصفية للاستجابة يحدد طلب HTTP.
minLength:1maxLength:100
حالة HTTP
201- تم إنشاء المورد المخطط
400- طلب غير صالح
401- المصادقة مطلوبة
403- الإذن مرفوض
404- المورد غير موجود
409- تعارض الإصدارات
422- فشل التحقق من البيانات
429- تم تجاوز حد الطلبات
حالات HTTP الأخرى (7)
405- الطريقة غير مسموحة
413- الطلب كبير جدًا
415- تنسيق غير مدعوم
500- خطأ في الخادم
502- خطأ في بوابة API
503- الخدمة غير متاحة
504- انتهت مهلة الانتظار
دليل الأخطاء: ErrorResponse
الترويسات
401
WWW-Authenticateسلسلة نصيةاختيارينظام المصادقة الذي يطلبه الخادم.
405
Allowسلسلة نصيةاختياريطرق HTTP التي يدعمها هذا المورد.
429, 503
Retry-Afterعدد صحيحاختياريالحد الأدنى للانتظار قبل إعادة المحاولة، بالثواني.
minimum:0