Asosiy mazmunga o'tish
Socialift
Qo'llanma

Instagram access token qanday olinadi va yangilanadi

Instagram access token OAuth kodidan olinadi: kod avval qisqa muddatli (1 soat), keyin uzoq muddatli (60 kun) token'ga almashtiriladi. Instagram Login'da bu token kamida 24 soat o'tgach graph.instagram.com orqali yangilanadi. Facebook Login'da esa uzoq muddatli user token olinadi, so'ng sahifadan Page token va Instagram akkaunt ID o'qiladi.

Yangilangan:

Sizga qaysi Instagram token kerak?

Bu ulanish usuliga bog'liq. Instagram API with Instagram Login instagram.com beradigan Instagram User access token bilan graph.instagram.com da ishlaydi. Instagram API with Facebook Login esa Facebook token'lari bilan graph.facebook.com da ishlaydi: user token sahifalar ro'yxatini olish uchun, Page access token esa Instagram endpointlarini chaqirish uchun. Har bir token oilasi o'z hosti bilan ishlaydi.

Ilova siri (app secret) qatnashadigan har qanday token so'rovi faqat serverda bajarilishi kerak. Meta buni Instagram'ning uzoq muddatli token almashinuvi uchun ham, Facebook'ning fb_exchange_token chaqiruvi uchun ham alohida ta'kidlaydi.

Quyidagi jadval barcha token turlarini bir joyga yig'adi — integratsiyadagi ko'p xatolar aynan token turi yoki hostni aralashtirishdan kelib chiqadi.

Instagram token turlari va amal qilish muddati

Instagram token turlari va amal qilish muddati — Platformalar bo'yicha imkoniyatlar jadvali
TokenUsulMuddatQayerdan olinadi
Authorization codeInstagram Login1 soat, bir marta ishlatiladiinstagram.com/oauth/authorize dan redirect
Qisqa muddatli Instagram User tokenInstagram Login1 soatPOST api.instagram.com/oauth/access_token
Uzoq muddatli Instagram User tokenInstagram Login60 kun, yangilanadiGET graph.instagram.com/access_token (ig_exchange_token)
Qisqa muddatli Facebook User tokenFacebook LoginBir necha soatgraph.facebook.com/{version}/oauth/access_token, code bilan
Uzoq muddatli Facebook User tokenFacebook LoginTaxminan 60 kunShu endpoint, grant_type=fb_exchange_token
Page access tokenFacebook LoginUzoq muddatli user token bilan olinsa — muddatsizGET /me/accounts

Muddatsiz Page token ham ma'lum holatlarda bekor bo'lishi mumkin — pastdagi 190 xatosi subkodlari odatiy sabablarni ko'rsatadi.

Instagram Login: koddan uzoq muddatli token'gacha

  1. Foydalanuvchini login oynasiga yuboring

    https://www.instagram.com/oauth/authorize manziliga client_id, redirect_uri, response_type=code, vergul bilan ajratilgan scope (masalan instagram_business_basic,instagram_business_manage_messages) va tasodifiy state qiymati bilan yo'naltiring.

  2. Kodni qabul qiling

    Instagram redirect_uri ga ?code=... bilan qaytaradi; oxiridagi #_ kodning qismi emas, uni olib tashlang. Kod 1 soat amal qiladi va faqat bir marta ishlatiladi.

  3. Qisqa muddatli token'ga almashtiring

    https://api.instagram.com/oauth/access_token ga POST so'rov bilan client_id, client_secret, grant_type=authorization_code, redirect_uri va code form maydonlarini yuboring. Javobda qisqa muddatli token, user_id va berilgan ruxsatlar keladi.

  4. Uzoq muddatli token oling

    GET https://graph.instagram.com/access_token — grant_type=ig_exchange_token, client_secret va access_token bilan. expires_in taxminan 5 184 000 soniya, ya'ni 60 kun.

  5. Muddati bilan saqlang

    Token'ni shifrlangan holda expires_at (hozirgi vaqt + expires_in) bilan birga saqlang — bu sana yangilash vazifasi uchun kerak bo'ladi.

Xuddi shu oqim Socialift SDK'da

instagram_callback.py
import os
from socialift import Instagram

async def instagram_callback(code: str, state: str, expected_state: str) -> dict:
    if state != expected_state:
        raise ValueError("state mos kelmadi")  # CSRF himoyasi
    async with Instagram.from_env() as ig:
        bundle = await ig.exchange_code(code, redirect_uri=os.environ["IG_REDIRECT_URI"])
        profile = await ig.profile(bundle.access_token)
    return {
        "username": profile.username,
        "token": bundle.access_token,     # saqlashdan oldin shifrlang
        "expires_at": bundle.expires_at,  # taxminan 60 kundan keyin
    }

exchange_code ikkala qadamni bajaradi: api.instagram.com ga form-data POST va ig_exchange_token chaqiruvi. Natija — access_token, expires_in va hisoblangan expires_at bor TokenBundle.

ig.login_url(redirect_uri=..., state=...) login havolasini SDK'ning standart instagram_business_* scope'lari bilan yasaydi; toraytirish uchun scopes=[...] bering. SDK state'ni saqlamaydi — uni sessiyada saqlash sizning vazifangiz.

Instagram long-lived token qanday yangilanadi?

GET https://graph.instagram.com/refresh_access_token so'rovini grant_type=ig_refresh_token va joriy token bilan yuborasiz. Javobda yana taxminan 60 kun amal qiladigan yangi uzoq muddatli token keladi.

Uchta shart bor: token kamida 24 soatlik bo'lishi, muddati tugamagan bo'lishi va foydalanuvchi instagram_business_basic ruxsatini bergan bo'lishi kerak. 60 kun ichida yangilanmagan token butunlay tugaydi va uni yangilab bo'lmaydi — foydalanuvchi qayta login qilishi kerak.

Amalda har kuni yoki har hafta ishlaydigan vazifa (cron) yaqin bir-ikki haftada tugaydigan token'larni yangilaydi. Yangilash arzon; cron to'xtab qolgani uchun akkauntni yo'qotish esa qimmat.

Token'larni avtomatik yangilash vazifasi

refresh_tokens.py
from datetime import datetime, timedelta, timezone
from socialift import AuthError, Instagram

async def refresh_instagram_tokens(accounts) -> None:
    soon = datetime.now(timezone.utc) + timedelta(days=10)
    async with Instagram.from_env() as ig:
        for acc in accounts:  # o'z bazangizdagi yozuvlar
            if acc.expires_at > soon:
                continue
            try:
                bundle = await ig.refresh_token(acc.token)
            except AuthError:
                acc.status = "reconnect_required"  # muddati tugagan yoki bekor qilingan
                continue
            acc.token, acc.expires_at = bundle.access_token, bundle.expires_at

AuthError qayta urinish bilan hal bo'lmaydi: akkauntni «qayta ulash kerak» holatiga o'tkazing va foydalanuvchiga xabar bering.

Facebook Login: user token → Page token → Instagram akkaunt ID

  1. Facebook orqali login

    Foydalanuvchini Facebook Login'dan o'tkazing (Business ilovalarda konfiguratsiya ID bilan) va instagram_basic, pages_show_list hamda kerakli imkoniyat ruxsatlarini so'rang.

  2. Kodni almashtiring

    graph.facebook.com dagi GET /oauth/access_token — client_id, client_secret, redirect_uri va code bilan — bir necha soatda tugaydigan qisqa muddatli user token qaytaradi.

  3. Uzoq muddatli user token oling

    Xuddi shu endpointni grant_type=fb_exchange_token, client_id, client_secret va fb_exchange_token bilan chaqiring. Natija odatda taxminan 60 kun amal qiladi.

  4. Sahifalar va ularning token'lari

    Uzoq muddatli user token bilan GET /me/accounts foydalanuvchi MANAGE, CREATE_CONTENT, MODERATE yoki ADVERTISE vazifasiga ega sahifalarni access_token bilan qaytaradi. Shu yo'l bilan olingan Page token muddatsiz.

  5. Instagram akkauntni toping

    GET /{page-id}?fields=instagram_business_account bog'langan Instagram professional akkaunt ID sini beradi. Barcha Instagram so'rovlarida aynan shu ID ishlatiladi.

  6. Instagram endpointlarini chaqiring

    So'rovlarni Page token bilan graph.facebook.com/{version}/<IG_ID>/... manziliga yuboring.

Facebook Login oqimi SDK bilan

facebook_callback.py
import os
from socialift import Facebook, Instagram

async def facebook_callback(code: str) -> list[dict]:
    async with Facebook.from_env() as fb:
        user = await fb.exchange_code(code, redirect_uri=os.environ["FB_REDIRECT_URI"])
        print("berilgan:", await fb.granted_scopes(user.access_token))
        pages = await fb.pages(user.access_token)

    accounts = [p for p in pages if p.instagram_id]
    async with Instagram.via_facebook(app_secret=os.environ["FACEBOOK_APP_SECRET"]) as ig:
        for page in accounts:
            profile = await ig.profile(page.access_token, ig_user_id=page.instagram_id)
            print(page.name, "->", profile.username)
    return [{"page_id": p.id, "ig_user_id": p.instagram_id, "page_token": p.access_token} for p in accounts]

fb.exchange_code ikkala almashinuvni bitta chaqiruvda bajaradi va uzoq muddatli user token qaytaradi; redirect_uri login havolasidagi bilan belgi-ma-belgi bir xil bo'lishi kerak.

fb.pages /me/accounts so'rovining o'zida instagram_business_account ni ham so'raydi — har bir sahifa uchun alohida so'rov kerak bo'lmaydi.

fb.granted_scopes debug_token ni o'qiydi: foydalanuvchi dialogda ayrim ruxsatlarni olib tashlashi mumkin, shuning uchun haqiqatda nima berilganini tekshiring.

Instagram access token'ni qanday tekshirish (debug) mumkin?

Facebook token'lari uchun GET /debug_token?input_token=<token> so'rovini app access token ({app-id}|{app-secret}) yoki ilova dasturchisining user token'i bilan yuboring. Javobda is_valid, expires_at, data_access_expires_at, scopes, granular_scopes (sahifa ID kabi maqsad obyektlar bilan) va user_id bor. Xuddi shu ma'lumotni Meta dasturchi vositalaridagi Access Token Debugger ham ko'rsatadi.

Instagram User token uchun eng tez tekshiruv — arzon so'rov, masalan GET graph.instagram.com/me?fields=user_id,username. Oddiy javob kelsa token ishlaydi, 190 xatosi kelsa foydalanuvchi qayta ulanishi kerak.

Log'ga xatoning code, error_subcode va fbtrace_id maydonlarini yozing — token'ning o'zini hech qachon. Meta qo'llab-quvvatlash xizmati aynan fbtrace_id ni so'raydi.

190 xatosi va boshqa token xatolari

190 xatosi va boshqa token xatolari — Platformalar bo'yicha imkoniyatlar jadvali
KodMa'nosiNima qilish kerak
190Access token yaroqsiz yoki muddati tugaganQayta urinmang; akkauntni uzilgan deb belgilang va qayta login so'rang
190 / 458Foydalanuvchi ilovaga login qilmaganQayta autentifikatsiya
190 / 459Foydalanuvchi checkpoint'daAvval facebook.com ga kirishi kerak
190 / 460Parol o'zgartirilganQayta login so'rang
190 / 463Token muddati tugaganQayta autentifikatsiya; keyingi safar oldinroq yangilang
190 / 464Tasdiqlanmagan foydalanuvchiAkkauntni facebook.com da tasdiqlashi kerak
190 / 467Yaroqsiz access tokenLogin orqali yangi token oling
10, 200–299Ruxsat yo'q yoki tasdiqlanmaganScope yoki App Review'ni tuzating; qayta urinish yordam bermaydi

Socialift SDK'da 190 va 102 kodlari AuthError, 10 va 200–299 kodlari PermissionError ko'taradi; ikkalasida ham Meta javobidagi code va subcode bor.

Instagram token'larini xavfsiz saqlash

Socialift kabinetining "Ulanishlar" bo'limida OAuth token'lari serverda shifrlanadi va brauzerga yuborilmaydi. O'z backend'ingizda ham shu qoidalarga amal qiling:

  • App secret va barcha token almashinuvlari faqat serverda — secret brauzer yoki mobil ilovaga hech qachon bormasin.
  • Token'larni bazada shifrlangan holda, har birining expires_at qiymati bilan saqlang.
  • Token'ni log yoki xato kuzatish tizimiga yozmang; o'rniga akkaunt ID va fbtrace_id yozing.
  • Har bir login uchun tasodifiy state yarating va callback'da solishtiring — bu CSRF'dan himoya.
  • AuthError ni vaqtinchalik xato emas, holat o'zgarishi (qayta ulash kerak) deb qabul qiling.
  • Foydalanuvchi uzilganda faqat yozuvni o'chirmang, Meta tomonida ham ruxsatni bekor qiling (Facebook Login uchun fb.revoke).

← Blogga qaytish

Ko'p so'raladigan savollar

Instagram access token qancha vaqt amal qiladi?

Instagram Login'da qisqa muddatli token 1 soat, uzoq muddatli token 60 kun amal qiladi, har bir yangilash yana 60 kun beradi. Facebook Login'da uzoq muddatli user token taxminan 60 kun yashaydi, undan olingan Page token esa muddatsiz.

Muddati tugagan Instagram token'ni yangilash mumkinmi?

Yo'q. refresh_access_token faqat kamida 24 soatlik va hali amal qilayotgan uzoq muddatli token bilan ishlaydi. 60 kun ichida yangilanmagan token butunlay tugaydi va foydalanuvchi qayta login qilishi kerak.

Instagram API'dagi 190 xatosi nimani anglatadi?

190 — OAuthException: access token yaroqsiz, muddati tugagan yoki bekor qilingan. error_subcode sababni ko'rsatadi (463 — muddat tugagan, 460 — parol o'zgargan, 458 — ilovaga login qilinmagan). Qayta urinish yordam bermaydi, yangi token kerak.

Nega Instagram User token graph.facebook.com da ishlamaydi?

Instagram Login token'lari graph.instagram.com uchun, Facebook Login esa graph.facebook.com da Facebook User va Page token'lari bilan ishlaydi. Token'ni bergan login oqimiga mos hostdan foydalaning.

Instagram uchun Page token shartmi?

Faqat Facebook Login'da. U yerda Instagram endpointlari akkauntga bog'langan sahifaning Page token'i bilan chaqiriladi, Instagram akkaunt ID esa sahifaning instagram_business_account maydonidan olinadi. Instagram Login'ga sahifa umuman kerak emas.

Manbalar

  1. Meta: Business Login for Instagram
  2. Meta: Get long-lived access tokens
  3. Meta: Instagram API with Facebook Login — get started
  4. Meta: Graph API error handling
  5. Meta: debug_token reference
  6. Meta: Overview of the Instagram API

Bog'liq sahifalar