Asosiy mazmunga o'tish
Socialift
Texnik qo'llanma

Instagram story API: STORIES konteyneri va e'lon qilish

Instagram story API orqali xuddi oddiy post kabi joylanadi: POST /<IG_ID>/media bilan konteyner yaratiladi va unga media_type=STORIES qo'shiladi, so'ng POST /<IG_ID>/media_publish uni e'lon qiladi. Story uchun alohida endpoint yo'q, caption parametri ham yo'q, konteyner esa 24 soatda eskiradi. Rasm faqat JPEG va 8 MB gacha, video esa 3–60 soniya bo'lishi kerak.

Yangilangan:

Instagram story API orqali qanday joylanadi?

Ikki chaqiruv. Birinchisi — POST /<IG_ID>/media, parametrlari image_url yoki video_url va media_type=STORIES. Ikkinchisi — POST /<IG_ID>/media_publish, parametri creation_id. Video bo'lsa ikkinchi chaqiruvdan oldin konteyner FINISHED bo'lishini kuting. Meta faylni o'zi yuklab oladi, shuning uchun havola ochiq HTTPS bo'lishi kerak.

Story uchun boshqa media_type qiymati kerak emas: rasmmi yoki videomi — buni image_url yoki video_url berilgani hal qiladi. Ya'ni bitta konteynerda ikkalasi birga bo'lmaydi.

Story 24 soatdan keyin lentadan yo'qoladi. Konteyner ham 24 soat yashaydi — e'lon qilinmagan konteyner EXPIRED bo'ladi va uni qayta ishlatib bo'lmaydi.

Story media talablari

Bu talablarni SDK ham, kabinet ham tekshira olmaydi — fayl Meta tomonda yuklanadi. Mos kelmasa konteyner ERROR holatiga tushadi.

Story media talablari — Platformalar bo'yicha imkoniyatlar jadvali
NimaRasmVideo
FormatJPEG (faqat)MOV yoki MP4
Hajmi8 MB gacha100 MB gacha
Davomiyligiyo'q3–60 soniya
Nisbattavsiya 9:160.1:1 dan 10:1 gacha, tavsiya 9:16
KodeksRGBH264 yoki HEVC, ovoz AAC 48 kHz
Kadrlaryo'q23–60 FPS

boryo'q

PNG va WebP qabul qilinmaydi — yuklashdan oldin JPEG'ga o'tkazing. Havola avtorizatsiya so'rasa yoki muddati tugagan bo'lsa, Meta faylni ololmaydi.

Xom so'rovlar: konteyner va e'lon

SDK'siz ham oqim aynan shunday. Birinchi javobda konteyner id'si keladi, u ikkinchi so'rovga creation_id bo'lib kiradi.

story.sh
# 1) Story konteyneri
curl -X POST "https://graph.facebook.com/v26.0/$IG_ID/media" \
  -d "image_url=https://cdn.example.com/story.jpg" \
  -d "media_type=STORIES" \
  -d "access_token=$TOKEN"
# -> {"id":"17998...."}

# 2) Video bo'lsa — konteyner holatini kuting
curl -G "https://graph.facebook.com/v26.0/17998...." \
  -d "fields=status_code" -d "access_token=$TOKEN"
# -> {"status_code":"FINISHED"}

# 3) E'lon qilish
curl -X POST "https://graph.facebook.com/v26.0/$IG_ID/media_publish" \
  -d "creation_id=17998...." -d "access_token=$TOKEN"

Instagram Login yo'lida bazaviy manzil graph.instagram.com, Facebook Login yo'lida graph.facebook.com — endpoint nomlari bir xil.

Rasm uchun kutish shart emas: konteyner odatda darhol tayyor bo'ladi. Video uchun status_code FINISHED bo'lmaguncha media_publish chaqirmang.

Nega story konteynerida caption yo'q

Content Publishing API'da caption lentadagi postning tavsifi. Story lentaga tushmaydi, unda tavsif maydoni yo'q — shuning uchun media_type=STORIES bilan yuborilgan caption hech qayerda ko'rinmaydi.

Stikerlar ham API'da yo'q: havola, so'rovnoma, savol, joylashuv, musiqa, @eslatma va heshteg stikerlarini Graph API qo'ymaydi. Agar story'da matn yoki havola kerak bo'lsa, uni tasvirning o'ziga (JPEG yoki videoning kadriga) chizib qo'yish kerak.

Socialift SDK'da shu sabab publish_story() ataylab caption qabul qilmaydi — bo'lmagan parametrga o'rin qoldirilmagan.

Ruxsatlar: ikki login yo'li uchun

Instagram'ning ikki oqimi bor va ular uchun scope'lar butunlay boshqacha. Facebook sahifasi faqat bitta yo'lda kerak.

Ruxsatlar: ikki login yo'li uchun — Platformalar bo'yicha imkoniyatlar jadvali
Nima qilinadiInstagram LoginFacebook Login
Story joylashinstagram_business_basic + instagram_business_content_publishinstagram_basic + instagram_content_publish + pages_read_engagement
Faol story'lar ro'yxatiyo'q — edge mavjud emasinstagram_basic + pages_read_engagement
Tokenfoydalanuvchi tokeni (graph.instagram.com)Page tokeni (graph.facebook.com)
Facebook sahifasishart emasbog'langan sahifa shart

Facebook Login yo'lida foydalanuvchi Page rolini Business Manager orqali olgan bo'lsa, qo'shimcha ads_management yoki ads_read kerak bo'ladi.

Faol story'lar ro'yxatini kim o'qiy oladi

Story'lar media edge'iga tushmaydi — Meta ular uchun alohida GET /<IG_ID>/stories edge'ini beradi. Javobdagi yozuvlar oddiy IG Media obyektlari, story ekanini esa media_product_type == "STORY" bildiradi: media_type story uchun ham IMAGE yoki VIDEO qaytaradi, ya'ni u bo'yicha ajratib bo'lmaydi.

Muhimi: bu edge Meta hujjatida «Instagram API with Facebook Login only» deb belgilangan. Instagram Login tokeni bilan u umuman yo'q, va Instagram Login oqimida faol story'lar ro'yxatini olishning rasmiy yo'li ham yo'q. Socialift SDK shuning uchun bu holatda so'rov yubormasdan ConfigurationError ko'taradi — Meta'dan keladigan chalg'ituvchi «nonexisting field» xatosini kutishdan ko'ra aniq aytgan yaxshi.

Ro'yxatda faqat oxirgi 24 soat bor: arxiv ham, «highlights» ham API'da yo'q. Jonli efir story'lari va foydalanuvchi qayta ulashganda paydo bo'lgan story ham qaytmaydi.

Kunlik limit: hujjatning o'zida ikki xil raqam

Story ham oddiy post kabi media_publish orqali chiqadi, ya'ni e'lon limitiga kiradi — hujjatda story'ni chegaradan chiqaradigan gap yo'q.

Lekin raqamning o'zi Meta hujjatining turli sahifalarida bir xil emas: umumiy Content Publishing sahifasida surilib boruvchi 24 soat uchun 100 post deyilgan, media_publish va content_publishing_limit sahifalarida esa 50. Shuning uchun bu sonni kodga qattiq yozmang.

To'g'ri yo'l — qiymatni so'rab bilish: GET /<IG_ID>/content_publishing_limit javobida quota_usage (oynada nechta post chiqqani) va config obyektida quota_total hamda quota_duration keladi. Ixtiyoriy since parametri 24 soatdan eski bo'lmagan Unix vaqtini oladi. Limitni javobdan o'qing va shunga qarab navbatni sekinlashtiring.

Konteynerlarning alohida chegarasi ham bor: akkaunt surilib boruvchi 24 soatda 400 tagacha konteyner yarata oladi. E'lon qilinmagan konteyner 24 soatdan keyin eskiradi, shuning uchun ularni oldindan ko'plab yaratish foydasiz.

Socialift SDK bilan Instagram story joylash

SDK konteyner yaratish, kutish va e'lon qilishni bitta chaqiruvga yig'adi va container_id bilan media_id qaytaradi.

ig_story.py
import asyncio, os
from socialift import ContainerNotReadyError, Instagram

CDN = "https://cdn.example.com"

async def main():
    token = os.environ["IG_USER_TOKEN"]
    async with Instagram.from_env() as ig:
        photo = await ig.publish_story(token, image_url=f"{CDN}/story.jpg")
        try:
            clip = await ig.publish_story(token, video_url=f"{CDN}/story.mp4", wait_timeout=120.0)
        except ContainerNotReadyError as exc:
            print("konteyner hali tayyor emas:", exc.container_id)
            return
        active = await ig.stories(token, limit=25)
        print(photo["media_id"], clip["media_id"], len(active))

asyncio.run(main())

publish_story image_url yoki video_url dan faqat bittasini oladi — ikkalasi berilsa ConfigurationError ko'tariladi.

Video uchun konteyner tayyor bo'lguncha wait_timeout soniyagacha (standart 300) kutiladi. Vaqt tugasa ContainerNotReadyError keladi va undagi container_id bilan videoni qayta yuklamasdan davom ettirish mumkin: konteyner 24 soat yashaydi.

Facebook Login yo'lida Instagram.via_facebook(app_secret=...) bilan klient yarating, Page tokeni va ig_user_id= bering.

stories() faqat Facebook Login yo'lida ishlaydi; Instagram Login tokenida SDK so'rov yubormasdan ConfigurationError beradi.

Facebook Page story: rasm va video oqimi

Page story'lari Instagram'dagi konteyner oqimini umuman ishlatmaydi — bu yerda ikki xil, o'ziga xos protokol bor.

  1. Rasm: avval e'lon qilinmagan rasm

    photo_stories edge'i faqat photo_id oladi, havola qabul qilmaydi. Shuning uchun avval POST /<PAGE_ID>/photos?published=false&url=<havola> chaqiriladi — u faqat id qaytaradi va rasm lentada ko'rinmaydi.

  2. Rasm: story sifatida e'lon qilish

    Olingan id bilan POST /<PAGE_ID>/photo_stories?photo_id=<id>. E'lon qilinmagan rasm Facebook serverida taxminan 24 soat turadi, shundan keyin photo_id yaroqsiz bo'ladi.

  3. Video: sessiyani ochish

    POST /<PAGE_ID>/video_stories?upload_phase=start — javobda video_id va upload_url keladi. upload_url rupload.facebook.com ga ishora qiladi va uni o'zingiz yig'maysiz, javobdan olasiz.

  4. Video: faylni yuklash

    O'sha upload_url ga POST. Token bu qadamda query'da emas, Authorization: OAuth <token> sarlavhasida ketadi. Havola bersangiz file_url sarlavhasi va bo'sh tana, fayl bersangiz offset va file_size sarlavhalari va tanada baytlar.

  5. Video: yakunlash

    POST /<PAGE_ID>/video_stories?upload_phase=finish&video_id=<id>. Bundan oldin holat uploading_phase.status == "complete" bo'lishini kuting: GET /<VIDEO_ID>?fields=status.

Page story: SDK namunasi va uzilgan yuklash

SDK ikkala oqimni ham ichida bajaradi: rasm uchun ikki qadamni, video uchun uch qadamni va uzilgan yuklashni davom ettirishni.

page_story.py
import asyncio, os
from socialift import Facebook

async def main():
    page_id = os.environ["FB_PAGE_ID"]
    page_token = os.environ["FB_PAGE_TOKEN"]
    async with Facebook.from_env() as fb:
        photo = await fb.publish_photo_story(
            page_id, page_token, photo_url="https://cdn.example.com/story.jpg"
        )
        clip = await fb.publish_video_story(
            page_id, page_token, video="/srv/media/story.mp4", upload_attempts=3
        )
        state = await fb.video_story_status(clip["video_id"], page_token)
        print(photo["post_id"], state.get("publishing_phase"))

        for item in await fb.stories(page_id, page_token, limit=25):
            print(item["post_id"], item["status"])

asyncio.run(main())

publish_photo_story photo_url yoki photo_id dan aniq bittasini oladi. photo_id kerak bo'ladi, agar birinchi urinish ikkinchi qadamda uzilib qolgan bo'lsa — rasmni qayta yuklash shart emas.

publish_video_story yuklash uzilsa uploading_phase.bytes_transfered ni so'raydi va o'sha baytdan davom ettiradi (upload_attempts gacha). Faylni boshidan yuborish kerak emas.

Ruxsatlar: pages_manage_posts, pages_read_engagement, pages_show_list va Page'da CREATE_CONTENT vazifasi.

Video talablari: .mp4, H.264 yoki H.265, ovoz AAC 48 kHz; nisbat 9:16; o'lcham 540x960 dan 1080x1920 gacha; 24–60 FPS. Davomiylik bo'yicha Meta hujjatining bir joyida 3–90 soniya, boshqasida 60 soniyadan oshmasin deyilgan — xavfsizi 3–60 soniya.

Tipik xatolar va ulardan qochish

  • Rasm PNG yoki WebP — Instagram story uchun faqat JPEG qabul qilinadi.
  • Havola imzolangan va muddati tugagan yoki login so'raydi — Meta faylni o'sha payt yuklab oladi.
  • Video konteyneri FINISHED bo'lmasdan media_publish chaqirilgan.
  • Bitta konteynerga ham image_url, ham video_url berilgan.
  • Story'ga caption yoki stiker kutilmoqda — API ularni qo'ymaydi.
  • Instagram Login tokeni bilan GET /<IG_ID>/stories chaqirilgan — bu edge u yerda yo'q.
  • Kunlik limit kodga raqam bilan yozilgan — uni content_publishing_limit dan o'qing.
  • Page story videosi 540p dan past — xato uchinchi qadamda emas, yuklashdan keyingi holatda chiqadi.
  • Page rasmi 24 soatdan ko'p kutib qolgan: e'lon qilinmagan photo_id eskirgan.

← Blogga qaytish

Ko'p so'raladigan savollar

Instagram story API orqali joylash uchun qaysi ruxsat kerak?

Instagram Login yo'lida instagram_business_basic va instagram_business_content_publish. Facebook Login yo'lida instagram_basic, instagram_content_publish va pages_read_engagement, Page tokeni bilan. Foydalanuvchi Page rolini Business Manager orqali olgan bo'lsa, qo'shimcha ads_management yoki ads_read kerak bo'ladi.

Nega story'ga caption qo'sha olmayman?

Story lentadagi post emas, unda tavsif maydoni yo'q. Content Publishing API'da caption faqat lenta postlari uchun; media_type=STORIES bilan yuborilgan caption hech qayerda ko'rinmaydi. Matn kerak bo'lsa uni rasm yoki videoning o'ziga chizib qo'yish kerak.

API orqali story stikeri yoki havola qo'shsa bo'ladimi?

Yo'q. Graph API story stikerlarini — havola, so'rovnoma, savol, joylashuv, musiqa, @eslatma va heshtegni — qo'llab-quvvatlamaydi. Ular faqat Instagram ilovasidan qo'yiladi.

Faol story'lar ro'yxatini qanday olaman?

GET /<IG_ID>/stories bilan, lekin bu edge faqat Facebook Login oqimida mavjud. Instagram Login tokenida u umuman yo'q. Ro'yxatda faqat oxirgi 24 soat bo'ladi; arxiv va highlights API'da yo'q.

Sutkasiga nechta story joylash mumkin?

Story oddiy post bilan bir xil media_publish limitiga kiradi, lekin Meta hujjatining o'zi ikki xil raqam beradi: umumiy sahifada 100, media_publish va content_publishing_limit sahifalarida 50. Shuning uchun raqamni kodga yozmang — GET /<IG_ID>/content_publishing_limit javobidagi quota_total va quota_usage ni o'qing.

Facebook Page story'si Instagram'nikidan farq qiladimi?

Ha, butunlay. Page'da konteyner yo'q: rasm avval published=false bilan yuklanadi va photo_id orqali photo_stories ga beriladi, video esa upload_phase=start, rupload.facebook.com ga yuklash va upload_phase=finish bosqichlaridan o'tadi.

Manbalar

  1. Meta: Publish content using the Instagram Platform
  2. Meta: IG User Stories reference
  3. Meta: Page Stories API
  4. Meta: Instagram API with Facebook Login

Bog'liq sahifalar