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.
Pythonimport 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.
Pythonfor 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.
Pythonbest = 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.
PythonRETRY = {"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.
Pythonprint(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 kreditFaylni 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.
Pythonwith 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.