رفع صور المقالات
مقالات وكتّاب وتعليقات خاضعة للإشراف ونشر مجدول.
POST/api/v1/addons/shopently.blog/media
- المصادقة
Bearer- متاح بدءًا من
- BASIC
- الوحدة المثبتة المطلوبة
shopently.blog· إصدار عقد الوحدة 1- الصلاحيات المطلوبة
addon.shopently.blog:media_upload
أمثلة الكود
مثال على الطلب
cURL
: "${SHOPENTLY_SHOP_URL:?}"
case "${SHOPENTLY_IMAGE_FILE:?}" in *[!a-zA-Z0-9/._\ -]*) echo "Unsupported image path" >&2; exit 1;; esac
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-3ccd36e66a3647eaaf03bf4cddfb471a' \
--form "file=@${SHOPENTLY_IMAGE_FILE:?};filename=article.png;type=image/png" \
--url "${SHOPENTLY_SHOP_URL%/}"/api/v1/addons/shopently.blog/media
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-3ccd36e66a3647eaaf03bf4cddfb471a'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/addons/shopently.blog/media');
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);
},
]);
$image = getenv('SHOPENTLY_IMAGE_FILE') ?: '';
if (!is_file($image) || !is_readable($image) || filesize($image) > 5242880) {
throw new RuntimeException('Expected a readable PNG image up to 5 MiB');
}
curl_setopt($handle, CURLOPT_POSTFIELDS, ['file' => new CURLFile($image, 'image/png', 'article.png')]);
$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-3ccd36e66a3647eaaf03bf4cddfb471a'}
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 True:
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/media', 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": {
"bytes": 366,
"height": 100,
"id": "e8663afe-3c38-461c-a142-a980085630af",
"version": 1,
"width": 200
},
"meta": {
"request_id": "56412902-d48f-42a2-a128-8f3cc940c768"
}
}
نظرة عامة
أدر مدونة متجرك بمقالات HTML وصور وكتّاب وبيانات وصفية لمحركات البحث. احفظ المسودات وأعد الترجمات وانشر فورًا أو في موعد تحدده ضمن منطقة زمنية معينة. أدر التعليقات ومراجعتها من اللوحة، ويمكن لمولّد خارجي استخدام API بالصلاحيات التي تمنحها.
BASIC · api.enabled · addons.use(shopently.blog) · addon.shopently.blog:media_upload
المعاملات
ترويسات الطلب
Idempotency-Keyسلسلة نصيةمطلوبمعرّف فريد لعملية كتابة منطقية واحدة.
minLength:1maxLength:128القيود
pattern"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
محتوى الطلب
multipart/form-data · مطلوب
fileسلسلة نصيةمطلوبالصورة (PNG; multipart/form-data)
format:"binary"
الاستجابات
الاستجابة 201
dataكائنحقول إضافية: لامطلوبمحتوى الاستجابة الناجحة.
الحقول ·
databytesعدد صحيحمطلوبالحجم بالبايت
minimum:1maximum:15728640heightعدد صحيحمطلوبالارتفاع
minimum:1maximum:1600idسلسلة نصيةمطلوبمعرّف المورد؛ احتفظ به كما أعيد.
format:"uuid"versionعدد صحيحمطلوبإصدار المورد المستخدم للتحكم في التعديلات المتزامنة.
minimum:1maximum:9223372036854775807widthعدد صحيحمطلوبالعرض
minimum:1maximum:1600
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