Go'da ijtimoiy tarmoq videosini yuklab olish
Go mijozi — bitta sarlavhali so'rov va tipli dekod. Bu qo'llanma atrofidagi intizomni qo'shadi: sekin manba goroutine'ni osib qo'ymasin deb context muddati, xato kodini satr qidiruvi emas maydon qiladigan struct va faylni xotiraga o'qish o'rniga io.Copy bilan oqizish.
Yangilangan
Avval tiplar
Success, Medias va ko'rsatkichli Error maydonli struct xato kodini satr qidiruvi emas, maydon qiladi. Tipni lokal va kichik saqlang — javobdagi yangi ixtiyoriy maydon uni e'tiborsiz qoldiradigan dekodni buza olmaydi.
Gotype Media struct {
Type string `json:"type"`
URL string `json:"url"`
}
type Resolved struct {
Success bool `json:"success"`
Medias []Media `json:"medias"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}So'rov
http.NewRequestWithContext muddatni olib yuradi; url.QueryEscape havolani kodlaydi. Bitta sarlavha, bitta dekod. Sizning tomoningizda boshqa hech narsa kerak emas — cookie yo'q, sessiya yo'q, brauzer yo'q.
Gofunc resolve(ctx context.Context, link string) (*Resolved, error) {
u := "https://api.saveapi.org/v1/download?url=" + url.QueryEscape(link)
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, u, nil)
req.Header.Set("Authorization", "Bearer sk_live_xxxx")
res, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
var out Resolved
return &out, json.NewDecoder(res.Body).Decode(&out)
}Faylni io.Copy bilan oqizing
Media URL to'g'ri platforma CDN'iga ishora qiladi. Javob tanasidan faylga io.Copy fayl hajmidan qat'i nazar xotirani tekis ushlaydi; API baytlarni hech qachon proksi qilmaydi.
Goctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
data, err := resolve(ctx, "https://www.instagram.com/reel/ABC123/")
if err != nil || !data.Success {
log.Fatal(err, data.Error.Code)
}
res, _ := http.Get(data.Medias[0].URL) // to'g'ridan-to'g'ri CDN
defer res.Body.Close()
f, _ := os.Create("video.mp4")
defer f.Close()
io.Copy(f, res.Body) // oqim, xotiraga emasFaqat qayta urinish tuzatadiganini qayta uring
UPSTREAM_TIMEOUT va UPSTREAM_ERROR ikkinchi urinishga loyiq va hech narsa turmaydi. PRIVATE_CONTENT va MEDIA_NOT_FOUND yakuniy va har safar 0.1 kredit turadi — ularga qayta urinish sikli o'sha javobga kredit sarflash usuli. Qayta uriniladigan to'plamni bitta joyda saqlang.
Allaqachon bor sarlavhalarni o'qing
Har javobda X-RateLimit-Limit, X-RateLimit-Remaining va pullik kalitda X-Credits-Remaining keladi. Alohida balans chaqiruvisiz cheklanishdan oldin sekinlashish uchun shu yetarli.
Boshlashdan oldingi savollar
- Rasmiy Go SDK bormi?
- Yo'q. Bu qo'llanmadagi tipli struct va so'rov — SDK'ning o'zi; paket sakkiz qator uchun bog'liqlik qo'shardi.
- formats[] ni qanday ishlayman?
- VK va Rutube uchun struct'ga Formats []Format maydoni qo'shing; boshqa joyda maydon shunchaki yo'q va bo'sh qoladi.
- Ko'p havolani parallel yechsam bo'ladimi?
- Ha, kalitning daqiqalik chegarasi ichida. Chegara o'lchamidagi semafor va X-RateLimit-Remaining sarlavhasi cheklanishdan saqlaydi.
Bu yerda ishlatilgan platformalar
Boshqa qo'llanmalar
Qo'llanmani o'z kalitingiz bilan ishga tushiring
Kalit bir daqiqada. 1 000 bepul kredit, kartasiz, muddatsiz.