Xatolarni ishlash va avtomatik qayta urinish
Socialift SDK barcha platformalar xatolarini bitta ierarxiyaga keltiradi: AuthError — token yaroqsiz, PermissionError — ruxsat yetishmaydi, RateLimitError — limit, NotFoundError — obyekt yo'q, TransportError — tarmoq nosozligi. Limit xatolari, HTTP 429 va 5xx javoblar hamda tarmoq uzilishlari RetryPolicy bo'yicha avtomatik qayta uriniladi: standart 3 urinish, 0,5 soniyadan boshlanadigan eksponensial kechikish va jitter.
Yangilangan:
Qaysi xatoni ushlash kerak?
Aniq sinflarni oldin, umumiy ApiError ni oxirida ushlang. AuthError — foydalanuvchini qayta ulashga yuboring; PermissionError — scope yoki App Review'ni tuzating, qayta urinish yordam bermaydi; RateLimitError — retry_after yoki o'z kechikishingiz bilan keyinroq takrorlang; TransportError — tarmoq muammosi, odatda vaqtinchalik. Litsenziya xatolari (LicenseError) alohida shoxcha va ApiError ga kirmaydi.
Xatolar ierarxiyasi va atributlari
| Sinf | Ota-sinf | Atributlar | Ma'nosi |
|---|---|---|---|
SocialiftError | Exception | yo'q | SDK'ning barcha xatolari, litsenziya xatolari ham |
ConfigurationError | SocialiftError | yo'q | Sozlama yetishmaydi yoki noto'g'ri (masalan, bo'sh app_id); so'rov yuborilmasdan chiqadi |
ApiError | SocialiftError | message, provider, status, code, subcode, payload, url | Platforma API'si xato qaytardi |
AuthError | ApiError | ApiError bilan bir xil | Token yaroqsiz, muddati tugagan yoki bekor qilingan |
PermissionError | ApiError | ApiError bilan bir xil | Ruxsat (scope), App Review yoki chatdagi huquq yetishmaydi |
RateLimitError | ApiError | ApiError + retry_after (soniya yoki None) | So'rovlar chegarasi — kutib qayta urinish kerak |
NotFoundError | ApiError | ApiError bilan bir xil | Obyekt yo'q yoki token egasiga ko'rinmaydi |
TransportError | SocialiftError | url | Ulanish uzildi, DNS yoki timeout — HTTP status yo'q |
LicenseError | SocialiftError | yo'q | Litsenziya xatolari — «Autentifikatsiya» sahifasida |
boryo'qJadvalni yon tomonga suring
Izohlar va cheklovlar
socialift.PermissionError Python'ning o'rnatilgan PermissionError nomi bilan bir xil — import qilganda taxallus bering: from socialift import PermissionError as ScopeError. str(exc) formati: [provider] xabar (HTTP status, code=...).
Platforma xatosi qaysi sinfga tushadi?
SDK xatoni quyidagi qoidalar bo'yicha tasniflaydi; hech biriga mos kelmaganlari oddiy ApiError bo'lib qoladi.
| Sinf | Meta (Facebook, Instagram, Ads) | TikTok | Telegram Bot API | |
|---|---|---|---|---|
RateLimitError | code 4, 17, 32, 613 yoki HTTP 429 | HTTP 429 | rate_limit_exceeded, spam_risk_too_many_posts, spam_risk yoki HTTP 429 | HTTP 429 yoki javobda parameters.retry_after |
AuthError | code 190, 102 yoki HTTP 401 | HTTP 401 | access_token_invalid, access_token_expired, invalid_access_token, token_not_found yoki HTTP 401 | HTTP 401 yoki tavsifda «unauthorized» |
PermissionError | code 10, 200–299 yoki HTTP 403 | HTTP 403 | scope_not_authorized, scope_permission_missed, unaudited_client_can_only_post_to_private_accounts, url_ownership_unverified, spam_risk_user_banned_from_posting yoki HTTP 403 | HTTP 403 yoki tavsifda «forbidden» (masalan, foydalanuvchi botni bloklagan) |
NotFoundError | code 803 yoki HTTP 404 | HTTP 404 | publish_id_not_found, video_not_found yoki HTTP 404 | HTTP 404 yoki tavsifda «not found» |
Izohlar va cheklovlar
Tekshiruv tartibi: limit → auth → ruxsat → topilmadi. Meta'da exc.code — error.code, exc.subcode — error_subcode, xabar sifatida error_user_msg (bo'lsa) yoki message olinadi. LinkedIn'da exc.code — serviceErrorCode. TikTok'da string kod HTTP statusdan ustun turadi, exc.code bo'sh qoladi, asl kod exc.payload ichida, log_id esa xabar matniga qo'shiladi. Telegram'da exc.code — error_code, bot tokeni esa exc.url da yashiriladi.
Telegram akkaunt (MTProto) xatolari qanday tarjima qilinadi?
TelegramAccount Telethon istisnolarini shu ierarxiyaga o'tkazadi, shuning uchun bitta except bloki bot, akkaunt va boshqa platformalar uchun ishlaydi.
RateLimitErrorFloodWaitErrorva boshqaFlood…xatolari;code=420,retry_after— Telegram aytgan soniyalar. SDK o'zi kutmaydi: 20 daqiqalik kutish ilovani muzlatib qo'ymasligi uchun qaror sizda.AuthErrorAuthKeyUnregisteredError,SessionRevokedError,SessionExpiredError,UserDeactivatedError,AuthKeyDuplicatedError,UnauthorizedError— sessiya yaroqsiz, akkauntni qayta ulash kerak (status=401).PermissionErrorChatAdminRequiredError,ChatWriteForbiddenError,UserBannedInChannelError,ChannelPrivateError,UserPrivacyRestrictedError,MessageDeleteForbiddenError,AdminsTooMuchError,UserNotParticipantError,ChatRestrictedError(status=403).NotFoundErrorUsernameNotOccupiedError,PeerIdInvalidError,MessageIdInvalidError,ChannelInvalidError,UserIdInvalidError,InviteHashInvalidErrorva Telethon obyekt topolmaganda beradiganValueError(status=404).TransportErrorConnectionError,OSError,TimeoutError— Telegram bilan aloqa uzildi.
Meta xato kodlari nimani anglatadi?
Meta Graph API xatosi error obyektida keladi: message, type, code, error_subcode, error_user_title, error_user_msg, fbtrace_id. SDK butun javobni exc.payload ga saqlaydi — Meta qo'llab-quvvatlashiga murojaat qilganda kerak bo'ladigan fbtrace_id shu yerda.
Meta hujjatiga ko'ra: 4 — ilova darajasidagi limit, 17 — foydalanuvchi darajasidagi limit, 32 — Pages API'da sahifa darajasidagi limit, 613 — alohida endpoint limiti; 190 — access token muddati tugagan yoki yaroqsiz, 102 — API sessiyasi; 10 — ruxsat berilmagan yoki bekor qilingan, 200–299 — aniq ruxsatlarga oid xatolar.
Meta limitlar uchun standart Retry-After sarlavhasini hujjatlashtirmaydi; Business Use Case limitlarida taxminiy kutish vaqti X-Business-Use-Case-Usage sarlavhasidagi estimated_time_to_regain_access maydonida (daqiqalarda) keladi. Shuning uchun Meta'dan kelgan RateLimitError da retry_after odatda None — kechikishni o'zingiz belgilang.
Qaysi xatolar avtomatik qayta uriniladi?
Facebook, Instagram, Ads, LinkedIn, TikTok va Telegram klientlarida SDK uch holatda qayta urinadi: RateLimitError; HTTP 429, 500, 502, 503 yoki 504 bilan tugagan ApiError; TransportError (aiohttp ulanish xatolari va timeout). AuthError, PermissionError, NotFoundError va boshqa 4xx javoblar darhol ko'tariladi. Urinishlar tugasa, oxirgi xato ko'tariladi.
Kechikish: provayder Retry-After sarlavhasini yuborgan bo'lsa, SDK aynan shuncha kutadi — bu qiymat backoff_max bilan cheklanmaydi. Aks holda RetryPolicy formulasi ishlaydi. HTTP xatosidan keyingi har bir qayta urinish socialift logger'iga WARNING sifatida yoziladi.
Istisnolar: TikTok xatoni HTTP 200 javob tanasida qaytarsa, u qayta urinishsiz ko'tariladi. TelegramAccount (MTProto) RetryPolicy ishlatmaydi: FloodWaitError darhol RateLimitError bo'lib chiqadi, ulanish urinishlari esa connection_retries parametri bilan boshqariladi.
Timeout va ulanish xatolari POST so'rovlarda ham qayta uriniladi. So'rov platformaga yetib borgan, lekin javob kelmagan bo'lsa, amal ikki marta bajarilishi mumkin — takrorlanishi xavfli yozuv amallari uchun RetryPolicy(attempts=1) bilan alohida klient ishlating.
RetryPolicy standart qiymatlari
| Parametr | Standart | Ma'nosi |
|---|---|---|
attempts | 3 | Jami urinishlar soni, birinchisi bilan birga |
backoff_base | 0.5 | Birinchi kechikish asosi, soniya |
backoff_max | 30.0 | Kechikishning yuqori chegarasi (jitter'dan oldin), soniya |
jitter | True | Kechikishni tasodifiy 0,5–1,5 barobarga ko'paytiradi |
timeout (klient parametri) | 30.0 | Bitta HTTP so'rovning umumiy timeout'i, soniya |
Izohlar va cheklovlar
Formula: min(backoff_base × 2^(n−1), backoff_max), keyin jitter. Standart sozlamada birinchi xatodan keyin taxminan 0,25–0,75 s, ikkinchisidan keyin 0,5–1,5 s kutiladi, uchinchi xato esa ko'tariladi.
O'z RetryPolicy'ingizni qanday berish mumkin?
import os
from socialift import Facebook, RetryPolicy, Telegram
# Fon vazifalari uchun: ko'proq urinish, uzunroq kechikish va timeout
patient = RetryPolicy(attempts=5, backoff_base=1.0, backoff_max=60.0)
fb = Facebook.from_env(retry=patient, timeout=60.0)
# Takrorlanishi xavfli yozuv amallari uchun: qayta urinishsiz
once = RetryPolicy(attempts=1)
bot = Telegram(token=os.environ["TELEGRAM_BOT_TOKEN"], retry=once)retry= va timeout= barcha HTTP klientlarda (Facebook, Instagram, LinkedIn, TikTok, Telegram, Ads), ularning from_env() va Instagram.via_facebook() konstruktorlarida qabul qilinadi. Siyosat har bir klient uchun alohida beriladi — global sozlama yo'q.
Tavsiya etilgan ishlov: to'rt holat
Qayta urinishlar tugagach xato sizning kodingizga yetadi. Quyidagi naqsh fon vazifasi uchun.
import logging
from socialift import ApiError, AuthError, RateLimitError, TransportError
from socialift import PermissionError as ScopeError
log = logging.getLogger("app")
async def sync_profile(ig, account, jobs):
# account va jobs — ilovangiz obyektlari (baza yozuvi va vazifalar navbati)
try:
return await ig.profile(account.token, ig_user_id=account.ig_user_id)
except AuthError:
account.needs_reconnect = True # foydalanuvchini qayta OAuth'ga yuboring
except ScopeError as exc:
log.error("Ruxsat yetishmaydi: %s", exc) # scope yoki App Review — qayta urinish foydasiz
except RateLimitError as exc:
await jobs.retry_later(account.id, delay=exc.retry_after or 300)
except TransportError:
await jobs.retry_later(account.id, delay=30)
except ApiError as exc:
log.error("%s status=%s code=%s", exc.provider, exc.status, exc.code)except tartibi muhim: AuthError, PermissionError va RateLimitError — ApiError vorislari, shuning uchun ular oldin turadi.
SDK muddati tugagan tokenni o'zi yangilamaydi. Yangilash metodlari: Instagram.refresh_token (Instagram Login), TikTok.refresh_token, LinkedIn.refresh; bekor qilingan token uchun esa foydalanuvchi qayta login qiladi.
Xatolar bilan ishlash bo'yicha tekshiruv ro'yxati
AuthErrorvaPermissionErrorni qayta urinmang — ular qayta ulash yoki konfiguratsiyani tuzatishni talab qiladi.RateLimitErrordaretry_afterbo'lmasa, navbat orqali daqiqalar bilan o'lchanadigan kechikish qo'ying.- Log uchun
str(exc),exc.status,exc.codevaexc.payloaddan foydalaning.exc.urlni log'ga yozmang: Meta so'rovlarida undaaccess_tokenquery parametri bo'ladi. LicenseErrorniApiErrordan alohida ushlang — bu platforma emas, litsenziya muammosi.ConfigurationError— kod yoki muhit o'zgaruvchisidagi xato; uni ishga tushishda aniqlang.
Ko'p so'raladigan savollar
RateLimitError'da retry_after None bo'lsa, qancha kutish kerak?
Meta uchun bu odatiy holat: Meta limitlar uchun standart Retry-After sarlavhasini hujjatlashtirmaydi. Kechikishni o'zingiz tanlang (masalan, bir necha daqiqa) va vazifani navbat orqali qayta ishga tushiring. SDK'ning ichki qayta urinishlari soniyalar bilan o'lchanadi va uzoq limitdan chiqishga mo'ljallanmagan.
SDK AuthError'dan keyin tokenni o'zi yangilaydimi?
Yo'q. SDK tokenni saqlamaydi va avtomatik yangilamaydi. Muddati tugashidan oldin yangilash yoki foydalanuvchini qayta OAuth'ga yuborish — ilovangiz vazifasi. TokenBundle.is_expiring() tokenni oldindan yangilash vaqtini aniqlashga yordam beradi.
Nega PermissionError qayta urinishda tuzalmaydi?
Chunki sabab so'rovda emas, ruxsatlarda: kerakli scope so'ralmagan, app platformaning tekshiruvidan (masalan, Meta App Review) o'tmagan yoki Telegram chatida huquq yo'q. Konfiguratsiyani tuzating va foydalanuvchini kerakli ruxsatlar bilan qayta ulang.
Qayta urinishni butunlay o'chirsa bo'ladimi?
Ha: klientga retry=RetryPolicy(attempts=1) bering. Shunda har qanday xato birinchi urinishdan keyin darhol ko'tariladi. Bu takrorlanishi xavfli amallar — post e'lon qilish, xabar yuborish — uchun foydali.
TikTok xato kodini qayerdan olaman?
TikTok string kod qaytaradi (masalan, access_token_invalid). SDK uni sinfga aylantiradi, lekin exc.code ga yozmaydi: asl kod exc.payload ichida, TikTok qo'llab-quvvatlashi so'raydigan log_id esa xabar matniga qo'shilgan.
TransportError bilan ApiError farqi nima?
ApiError — platforma javob berdi, lekin xato bilan: status va ko'pincha code bor. TransportError — javob umuman kelmadi (ulanish uzildi, DNS, timeout), shuning uchun status yo'q. TransportError avtomatik qayta uriniladi, ApiError esa faqat limit, 429 va 5xx holatlarida.