Pređi na sadržaj
ShopentlyLearn

Fotografija · WebP

Pregled fotografija članaka

GET/api/v1/addons/shopently.blog/media/{media_id}/file

Autentifikacija
Bearer
Dostupno od
BASIC
Potreban instalirani modul
shopently.blog · Verzija ugovora modula 1
Potrebna ovlašćenja
addon.shopently.blog:media_read

Primeri koda

Primer zahteva

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:?}" \
  --max-filesize 5242880 \
  --output "${SHOPENTLY_OUTPUT_FILE:?}" \
  --url "${SHOPENTLY_SHOP_URL%/}"'/api/v1/addons/shopently.blog/media/e8663afe-3c38-461c-a142-a980085630af/file?variant=thumbnail'

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/media/e8663afe-3c38-461c-a142-a980085630af/file?variant=thumbnail');
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'] ?? ''));
}
if (($responseHeaders['content-type'] ?? '') !== 'image/webp' || strlen($raw) > 5242880) {
    throw new RuntimeException('Unexpected image response');
}
$output = fopen(getenv('SHOPENTLY_OUTPUT_FILE') ?: '', 'xb');
if ($output === false) { throw new RuntimeException('Cannot create image output'); }
try {
    if (fwrite($output, $raw) !== strlen($raw)) { throw new RuntimeException('Incomplete image write'); }
} finally { fclose($output); }

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/media/e8663afe-3c38-461c-a142-a980085630af/file?variant=thumbnail', 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 True:
        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))

Primer odgovora 200

text
Content-Type: image/webp
Content-Disposition: inline; filename="image.webp"

Pregled

Vodite blog prodavnice sa HTML člancima, fotografijama, autorima i metapodacima za pretraživače. Čuvajte nacrte, pripremajte prevode i objavljujte odmah ili u izabrano vreme u određenoj vremenskoj zoni. Upravljajte komentarima i moderiranjem u panelu; spoljni generator može da koristi API sa dodeljenim dozvolama.

BASIC · api.enabled · addons.use(shopently.blog) · addon.shopently.blog:media_read

Parametri

Parametri putanje

media_idNiz znakovaObavezno

Identifikator odabrane slikovne datoteke.

format: "uuid"
Primer: "e8663afe-3c38-461c-a142-a980085630af"

Parametri upita

variantNiz znakovaOpciono

Varijanta strukture podataka opisana dozvoljenim vrednostima.

Ograničenja
enum
["original", "card", "thumbnail"]
Podrazumevano: "original"Primer: "thumbnail"

Ova operacija ne prihvata JSON telo.

Odgovori

Odgovor 200

Primer odgovora

HTTP status

200
Uspešan odgovor Šema
400
Nevažeći zahtev
401
Potrebna je autentifikacija
403
Pristup odbijen
404
Resurs nije pronađen
409
Sukob verzija
422
Provera nije uspela
429
Prekoračeno ograničenje zahteva
Ostali HTTP statusi (7)
405
Metoda nije dozvoljena
413
Zahtev je prevelik
415
Nepodržan format
500
Greška servera
502
Greška API mrežnog prolaza
503
Usluga nije dostupna
504
Istek vremena

Katalog grešaka: ErrorResponse

Zaglavlja

401

WWW-AuthenticateNiz znakovaOpciono

Šema autentifikacije koju zahteva server.

405

AllowNiz znakovaOpciono

HTTP metode koje ovaj resurs podržava.

429, 503

Retry-AfterCeli brojOpciono

Najkraće čekanje pre ponavljanja, u sekundama.

minimum: 0