saveapi.org

Python'da ijtimoiy tarmoq videosini yuklab olish

Bitta GET, bitta JSON shakli, har muvaffaqiyatli yechim uchun 1.5 kredit. Bu qo'llanma javobning o'zidan ko'rinmaydigan qismlar haqida: aralash post qanday keladi, qachon rendition tanlash imkoni bor va qachon yo'q, qaysi xatoda ikkinchi urinish ma'noli, va faylni xotiraga yuklamasdan qanday olish kerak.

Yangilangan

Birinchi chaqiruv

Bu yerda httpx ni tanlashga faqat timeout argumenti ham yetadi: osilib qolgan manba so'rovingizni ushlab turmasligi, balki yiqitishi kerak. O'ttiz soniya oqilona shift — gateway'ning upstream byudjeti undan past.

Python
import httpx

r = httpx.get(
    "https://api.saveapi.org/v1/download",
    params={"url": "https://www.instagram.com/reel/Cx1a2b3c/"},
    headers={"Authorization": "Bearer sk_live_xxxx"},
    timeout=30,
)
data = r.json()

Taxmin qilmang, medias[] ni o'qing

Postda bitta video bo'ladimi yoki o'nta rasm — javobda o'sha bitta massiv turadi. Aralash postlarda turlar post tartibida saqlanadi: ikki rasm va bitta klipli karusel ikkita image va bitta video yozuvini beradi. type bo'yicha shoxlansangiz, bir xil kod hamma platformani qoplaydi.

Python
for media in data["medias"]:
    if media["type"] == "video":
        print("video:", media["url"])
    elif media["type"] == "image":
        print("image:", media["url"])
    elif media["type"] == "audio":
        print("track:", media["url"])

Tanlov bor joyda renditionni tanlang

Ba'zi manbalar bir nechta rendition chiqaradi va bunday javobda formats[] bo'ladi — har birida tayyor havola va aniq hajmi (MB). Ikkinchi so'rov ham, format parametri ham yo'q: ro'yxatni mijoz tomonida filtrlab, chegarangizga sig'adigan eng kattasini oling.

Python
best = None
for fmt in data.get("formats", []):
    if fmt["size_mb"] <= 45 and (best is None or fmt["size_mb"] > best["size_mb"]):
        best = fmt

url = best["url"] if best else data["medias"][0]["url"]

Faqat qaytarib bo'ladigan xatoni qayta urinib ko'ring

Timeout yoki upstream xatosi yana bitta urinishga arziydi. Yopiq post, o'chirilgan post yoki qo'llab-quvvatlanmaydigan domen esa arzimaydi — ikkinchi chaqiruv o'sha javobni qaytaradi va hisoblanadigan xatolarda ikkinchi kreditni ham yeydi. Kodlarni ikki to'plamga ajrating va matnga emas, to'plamga qarab qaror qiling.

Python
RETRY = {"UPSTREAM_TIMEOUT", "UPSTREAM_ERROR"}

def download(link: str, attempts: int = 2) -> dict:
    for attempt in range(attempts):
        data = httpx.get(API, params={"url": link}, headers=HEAD, timeout=30).json()
        if data["success"]:
            return data
        if data["error"]["code"] not in RETRY:
            raise RuntimeError(data["error"]["message"])   # qayta urinish yordam bermaydi
    raise RuntimeError("source unavailable")

Chegara sarlavhalarini kuzating

Har javobda kalitning daqiqadagi chegarasi va undan qolgani bor, pullik kalitlarda esa paketdagi qolgan kredit ham. Balansni taymer bilan so'rab turish o'rniga shularni qo'lingizdagi javobdan o'qing.

Python
print(r.headers["X-RateLimit-Limit"])       # kalitning daqiqadagi chegarasi
print(r.headers["X-RateLimit-Remaining"])   # shu daqiqada qolgani
print(r.headers.get("X-Credits-Remaining")) # paketdagi qolgan kredit

Faylni xotiraga emas, oqim bilan oling

Yechilgan manzil to'g'ridan-to'g'ri manba CDN'iga ishora qiladi, ya'ni baytlar API orqali o'tmaydi. Uni oqim bilan diskka yozing: 4K reelni xotiraga yuklash — konteynerni o'ldirishning eng tez yo'li.

Python
with httpx.stream("GET", data["medias"][0]["url"]) as source:
    with open("reel.mp4", "wb") as out:
        for chunk in source.iter_bytes():
            out.write(chunk)

Boshlashdan oldingi savollar

Rasmiy Python SDK bormi?
Yo'q, bitta endpointga u unchalik kerak ham emas. Butun mijoz — Bearer sarlavhali httpx chaqiruvi; sakkiz qatorlik o'ram funksiya sizga tiplash va qayta urinishni yangilab turiladigan bog'liqliksiz beradi.
Fayl API orqali o'tadimi?
Yo'q. Sizga manba CDN'iga ishora qiladigan manzil keladi va baytlarni to'g'ridan-to'g'ri o'sha yerdan olasiz — shuning uchun yuklash tezligi bizga emas, o'sha CDN'ga bog'liq.
Chaqiruv qancha turgani qayerda ko'rinadi?
Javobdagi credits.spent va credits.remaining da. Muvaffaqiyatli yechim — 1.5 kredit (Instagram story 5, Rutube 3). Yopiq yoki topilmagan post 0.1 kredit, bizning tomondagi nosozlik esa umuman hisoblanmaydi.

Bu yerda ishlatilgan platformalar

Boshqa qo'llanmalar

Qo'llanmani o'z kalitingiz bilan ishga tushiring

Kalit bir daqiqada. 1 000 bepul kredit, kartasiz, muddatsiz.

Kalit oling va sinab ko'ringTo'liq API ma'lumotnomasi