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
| Token | Usul | Muddat | Qayerdan olinadi |
|---|---|---|---|
| Authorization code | Instagram Login | 1 soat, bir marta ishlatiladi | instagram.com/oauth/authorize dan redirect |
| Qisqa muddatli Instagram User token | Instagram Login | 1 soat | POST api.instagram.com/oauth/access_token |
| Uzoq muddatli Instagram User token | Instagram Login | 60 kun, yangilanadi | GET graph.instagram.com/access_token (ig_exchange_token) |
| Qisqa muddatli Facebook User token | Facebook Login | Bir necha soat | graph.facebook.com/{version}/oauth/access_token, code bilan |
| Uzoq muddatli Facebook User token | Facebook Login | Taxminan 60 kun | Shu endpoint, grant_type=fb_exchange_token |
| Page access token | Facebook Login | Uzoq muddatli user token bilan olinsa — muddatsiz | GET /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
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.
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.
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.
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.
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
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
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_atAuthError 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
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.
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.
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.
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.
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.
Instagram endpointlarini chaqiring
So'rovlarni Page token bilan graph.facebook.com/{version}/<IG_ID>/... manziliga yuboring.
Facebook Login oqimi SDK bilan
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
| Kod | Ma'nosi | Nima qilish kerak |
|---|---|---|
| 190 | Access token yaroqsiz yoki muddati tugagan | Qayta urinmang; akkauntni uzilgan deb belgilang va qayta login so'rang |
| 190 / 458 | Foydalanuvchi ilovaga login qilmagan | Qayta autentifikatsiya |
| 190 / 459 | Foydalanuvchi checkpoint'da | Avval facebook.com ga kirishi kerak |
| 190 / 460 | Parol o'zgartirilgan | Qayta login so'rang |
| 190 / 463 | Token muddati tugagan | Qayta autentifikatsiya; keyingi safar oldinroq yangilang |
| 190 / 464 | Tasdiqlanmagan foydalanuvchi | Akkauntni facebook.com da tasdiqlashi kerak |
| 190 / 467 | Yaroqsiz access token | Login orqali yangi token oling |
| 10, 200–299 | Ruxsat yo'q yoki tasdiqlanmagan | Scope 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.
AuthErrorni 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).
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.