saveapi.org

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.

Go
type 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.

Go
func 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.

Go
ctx, 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 emas

Faqat 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.

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