Asosiy mazmunga o'tish
Socialift
Hujjatlar bo'limlari
Tushunchalar

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

Xatolar ierarxiyasi va atributlari — Platformalar bo'yicha imkoniyatlar jadvali
SinfOta-sinfAtributlarMa'nosi
SocialiftErrorExceptionyo'qSDK'ning barcha xatolari, litsenziya xatolari ham
ConfigurationErrorSocialiftErroryo'qSozlama yetishmaydi yoki noto'g'ri (masalan, bo'sh app_id); so'rov yuborilmasdan chiqadi
ApiErrorSocialiftErrormessage, provider, status, code, subcode, payload, urlPlatforma API'si xato qaytardi
AuthErrorApiErrorApiError bilan bir xilToken yaroqsiz, muddati tugagan yoki bekor qilingan
PermissionErrorApiErrorApiError bilan bir xilRuxsat (scope), App Review yoki chatdagi huquq yetishmaydi
RateLimitErrorApiErrorApiError + retry_after (soniya yoki None)So'rovlar chegarasi — kutib qayta urinish kerak
NotFoundErrorApiErrorApiError bilan bir xilObyekt yo'q yoki token egasiga ko'rinmaydi
TransportErrorSocialiftErrorurlUlanish uzildi, DNS yoki timeout — HTTP status yo'q
LicenseErrorSocialiftErroryo'qLitsenziya 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.

Platforma xatosi qaysi sinfga tushadi? — Platformalar bo'yicha imkoniyatlar jadvali
SinfMeta (Facebook, Instagram, Ads)LinkedInTikTokTelegram Bot API
RateLimitErrorcode 4, 17, 32, 613 yoki HTTP 429HTTP 429rate_limit_exceeded, spam_risk_too_many_posts, spam_risk yoki HTTP 429HTTP 429 yoki javobda parameters.retry_after
AuthErrorcode 190, 102 yoki HTTP 401HTTP 401access_token_invalid, access_token_expired, invalid_access_token, token_not_found yoki HTTP 401HTTP 401 yoki tavsifda «unauthorized»
PermissionErrorcode 10, 200–299 yoki HTTP 403HTTP 403scope_not_authorized, scope_permission_missed, unaudited_client_can_only_post_to_private_accounts, url_ownership_unverified, spam_risk_user_banned_from_posting yoki HTTP 403HTTP 403 yoki tavsifda «forbidden» (masalan, foydalanuvchi botni bloklagan)
NotFoundErrorcode 803 yoki HTTP 404HTTP 404publish_id_not_found, video_not_found yoki HTTP 404HTTP 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.

RateLimitError
FloodWaitError va boshqa Flood… xatolari; code=420, retry_after — Telegram aytgan soniyalar. SDK o'zi kutmaydi: 20 daqiqalik kutish ilovani muzlatib qo'ymasligi uchun qaror sizda.
AuthError
AuthKeyUnregisteredError, SessionRevokedError, SessionExpiredError, UserDeactivatedError, AuthKeyDuplicatedError, UnauthorizedError — sessiya yaroqsiz, akkauntni qayta ulash kerak (status=401).
PermissionError
ChatAdminRequiredError, ChatWriteForbiddenError, UserBannedInChannelError, ChannelPrivateError, UserPrivacyRestrictedError, MessageDeleteForbiddenError, AdminsTooMuchError, UserNotParticipantError, ChatRestrictedError (status=403).
NotFoundError
UsernameNotOccupiedError, PeerIdInvalidError, MessageIdInvalidError, ChannelInvalidError, UserIdInvalidError, InviteHashInvalidError va Telethon obyekt topolmaganda beradigan ValueError (status=404).
TransportError
ConnectionError, 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

RetryPolicy standart qiymatlari — Platformalar bo'yicha imkoniyatlar jadvali
ParametrStandartMa'nosi
attempts3Jami urinishlar soni, birinchisi bilan birga
backoff_base0.5Birinchi kechikish asosi, soniya
backoff_max30.0Kechikishning yuqori chegarasi (jitter'dan oldin), soniya
jitterTrueKechikishni tasodifiy 0,5–1,5 barobarga ko'paytiradi
timeout (klient parametri)30.0Bitta 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?

retry.py
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.

handle_errors.py
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

  • AuthError va PermissionError ni qayta urinmang — ular qayta ulash yoki konfiguratsiyani tuzatishni talab qiladi.
  • RateLimitError da retry_after bo'lmasa, navbat orqali daqiqalar bilan o'lchanadigan kechikish qo'ying.
  • Log uchun str(exc), exc.status, exc.code va exc.payload dan foydalaning. exc.url ni log'ga yozmang: Meta so'rovlarida unda access_token query parametri bo'ladi.
  • LicenseError ni ApiError dan 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.

Manbalar

  1. Meta: Graph API error handling
  2. Meta: Graph API rate limiting
  3. LinkedIn API error handling
  4. TikTok API v2 error handling
  5. Telegram Bot API

Bog'liq sahifalar