Ana içeriğe geç

Hatalar

Başarısız bir HTTP API isteği; makinece okunabilen, kararlı bir code ve insanlar için okunabilir bir message içeren JSON hata gövdesi döndürür. Eşleştirme code üzerinden yapılır; message istenirse kişiye gösterilebilir, ancak asla ayrıştırılmamalıdır.

Eşleştirme message veya yalnız durum koduna göre değil, code üzerinden yapılır

message insanlar için yazılır. Yerelleştirilmiş olabilir (mesajların çoğu şu an Türkçedir) ve ifadesi haber verilmeden değişebilir. Birçok farklı kod aynı HTTP durumunu paylaştığından yalnız durum kodu da yeterli değildir.

Hata yanıtı

Alan Tür Açıklama
code string Hata kodu kaydındaki kararlı hata kodu
message string İnsanlar için okunabilir açıklama; yerelleştirilmiş olabilir
error string "404 Not Found" gibi HTTP durum satırı. Eski istemciler için tutulur; code tercih edilmelidir

Bildirecek daha fazla bilgisi olan bir hata, bunların yanına en üst düzeyde başka üyeler ekler: hız sınırı reddi global ve retry_after ekler, doğrulama hatası errors ekleyebilir ve birkaç işlem de kendi sayfalarında belgelenen kendi üyelerini ekler.

{
  "error": "404 Not Found",
  "code": "NOT_FOUND",
  "message": "Kanal bulunamadı"
}

JSON gövdesi olmayan yanıtlar

Hiçbir yolla eşleşmeyen bir adrese yapılan istek boş gövdeyle 404 döndürür. Geçerli JSON olmayan ya da işlemin alan türleriyle uyuşmayan bir istek gövdesi, HTTP çatısı tarafından 400 ve düz metin gövdeyle reddedilir. İstemciler, gövdesi boş olan veya JSON olmayan 4xx ya da 5xx yanıtlarını işleyebilmelidir.

Durum kodları

Durum Anlamı
200 JSON gövdeli başarı
204 Gövdesiz başarı
400 İstek hatalı biçimli, doğrulamadan geçemedi veya bir ön koşulu karşılamadı
401 Kimlik bilgisi eksik, hatalı biçimli, bilinmiyor, süresi dolmuş veya iptal edilmiş. Bkz. Kimlik doğrulama
403 Çağıranın kimliği doğrulanmış, ancak işlemi yapmasına izin verilmiyor
404 Kaynak yok veya çağıran tarafından görülemiyor
409 İstek mevcut durumla çakışıyor; örneğin ad veya adres zaten kullanımda
410 İşlem kaldırılmış
413 İstek gövdesi çok büyük
429 Bir hız sınırı aşıldı
500 Dahili bir hata veya yapılandırılmamış bir sunucu tarafı özelliği

5xx yanıtı çağıranın hatası değildir. Geri çekilmeyle (backoff) daha sonra yeniden denenir. 500 her zaman genel mesajı taşır ve asla dahili ayrıntı içermez.

Hata kodu kaydı

En üst düzeydeki code alanının alabileceği değerler bunlardır. Hataların çoğu genel kodlardan birini kullanır; daha kesin bir yanıt gerektiren işlemler özel bir kod kullanır.

Genel kodlar

Kod Durum Açıklama
BAD_REQUEST 400 İstek hatalı biçimli veya bir ön koşulu karşılamadı
INVALID_FORM_BODY 400 Bir veya daha fazla alan doğrulamadan geçemedi. Bkz. Doğrulama hataları
UNAUTHORIZED 401 Kimlik bilgisi eksik veya geçersiz
FORBIDDEN 403 Çağıran işlemi yapamaz; örneğin eksik bir izin, zaman aşımındaki bir üye veya üye olmayan biri
NOT_FOUND 404 Kaynak yok veya görülemiyor
CONFLICT 409 İstek mevcut durumla çakışıyor
PAYLOAD_TOO_LARGE 413 İstek gövdesi izin verilen boyutu aşıyor
RATE_LIMITED 429 Bir hız sınırı kovası tükendi. Bkz. Hız sınırları
INTERNAL_SERVER_ERROR 500 Beklenmeyen dahili bir hata

Özel kodlar

Kod Durum Açıklama
SLOWMODE_RATE_LIMITED 400 Kanalın yavaş mod aralığı dolmadı. Gövdede retry_after bulunur. Bkz. Yavaş mod
CAPTCHA_REQUIRED 400 İşlem bir CAPTCHA çözümü gerektiriyor. Bkz. CAPTCHA işleme
INVALID_CAPTCHA 400 CAPTCHA çözümü reddedildi veya doğrulanamadı
SUDO_MODE_REQUIRED 403 İşlem yakın zamanda yeniden doğrulama gerektiriyor. Bkz. Sudo kipi. Bu gövdenin error üyesi "SUDO_REQUIRED" olur
IP_AUTHORIZATION_REQUIRED 403 Yeni bir konumdan yapılan girişin e-postayla onaylanması gerekiyor. Gövdede ticket, email, ip_authorization_required ve resend_available_in bulunur
MISSING_PERMISSIONS 403 Çağıranda, işlemin açıkça denetlediği bir sunucu izni eksik; örneğin bir üyeyi ses kanalları arasında taşıma veya üye aramasını açma
MISSING_ACCESS 403 Çağıran hedefe erişemez; örneğin gizlilik ayarları çağırandan gelen aramaları veya grup davetlerini engelleyen bir kullanıcı ya da yalnız personele açık bir alan
MISSING_OAUTH_SCOPE 403 Bir OAuth2 erişim token'ı işlemin gerektirdiği kapsamı taşımıyor. Gövdede required_scope bulunur. Bkz. OAuth2 erişim token'ları
UNKNOWN_USER 404 Hedef kullanıcı yok
UNKNOWN_MEMBER 404 Hedef kullanıcı sunucunun üyesi değil
NO_USERS_WITH_TEBHOSTAG_EXIST 404 Arkadaşlık isteğindeki kullanıcı adı ve ayırıcıyla eşleşen kullanıcı yok
ALREADY_FRIENDS 400 Kullanıcılar zaten arkadaş
CANNOT_SEND_FRIEND_REQUEST_TO_SELF 400 Arkadaşlık isteğinin hedefi çağıranın kendisi
CANNOT_SEND_FRIEND_REQUEST_TO_BLOCKED_USER 400 Çağıran hedefi engellemiş
FRIEND_REQUEST_BLOCKED 400 Hedefin ayarları çağırandan arkadaşlık isteği kabul etmiyor
MAX_FRIENDS 400 Çağıran ilişki sınırına ulaştı
MAX_APPLICATIONS 400 Çağıran zaten 25 uygulamaya sahip. Bkz. Uygulama oluştur
CANNOT_SEND_MESSAGES_TO_USER 400 Hedefin gizlilik ayarları çağırandan gelen doğrudan mesajları engelliyor
USER_NOT_IN_VOICE 400 Hedef üye bir ses kanalına bağlı değil
INVALID_OR_RESTRICTED_RTC_REGION 400 İstenen ses bölgesi yok veya kullanılamıyor
MEMBER_ROLE_ENUM_REMOVED 410 Kaldırılmış eski bir üye rolü işlemi çağrıldı. Mesaj, yerine kullanılacak yolu belirtir

Her kodun message değeri o duruma özgü açıklamayı verir. İşlem sayfaları, her işlemin döndürebileceği kodları listeler.

Doğrulama hataları

Alan düzeyindeki bir doğrulama hatası, code değeri INVALID_FORM_BODY olan 400 döndürür. İki biçimde gelir.

errors dizisiyle. Hatanın makinece okunabilir bir nedeni varsa gövde alanı ve nedeni belirtir:

{
  "error": "400 Bad Request",
  "code": "INVALID_FORM_BODY",
  "message": "Hakkımda çok sık değiştirildi; 12 dakika sonra yeniden dene.",
  "errors": [
    {
      "path": "bio",
      "code": "BIO_CHANGED_TOO_MANY_TIMES",
      "message": "BIO_CHANGED_TOO_MANY_TIMES"
    }
  ]
}
Alan Tür Açıklama
path string Başarısız olan istek alanı, örneğin channel_id
code string Aşağıdaki tablodan kararlı bir doğrulama kodu
message string Şu an code değerini tekrarlar

errors dizisi olmadan. Diğer doğrulama hataları yalnız açıklayıcı bir message ile INVALID_FORM_BODY döndürür; bu mesaj alanı ve kısıtı metin olarak belirtir.

Doğrulama kodları

Kod Alan Açıklama
CHANNEL_DOES_NOT_EXIST channel_id Üye ses taşımasının hedef kanalı yok
CHANNEL_MUST_BE_VOICE channel_id Üye ses taşımasının hedef kanalı bir ses kanalı değil
USER_NOT_IN_CHANNEL recipients Arama çaldırma isteğinde adı geçen bir kullanıcı kanalın alıcısı değil
BIO_CHANGED_TOO_MANY_TIMES bio Biyografi çok sık değiştirildi (30 dakikada 25 değişiklik)
PRONOUNS_CHANGED_TOO_MANY_TIMES pronouns Zamirler çok sık değiştirildi
ACCENT_COLOR_CHANGED_TOO_MANY_TIMES accent_color Vurgu rengi çok sık değiştirildi
AVATAR_CHANGED_TOO_MANY_TIMES avatar Avatar çok sık değiştirildi
BANNER_CHANGED_TOO_MANY_TIMES banner Afiş (banner) çok sık değiştirildi
INVALID_MESSAGE_DATA message_data JSON mesaj gövdesi mesaj şemasına uymuyor. Bkz. Gömme sınırları
TOO_MANY_EMBEDS embeds Bir mesaj, mesaj düzenlemesi veya webhook çalıştırması 10'dan fazla gömme veriyor
EMBEDS_EXCEED_MAX_CHARACTERS embeds Verilen gömmeler toplamda 6.000 karakterden fazla içeriyor

Profil sınırları hem hesap profiline hem de sunucu başına üye profillerine uygulanır. Bkz. Hız sınırları.

Hız sınırı hataları

Hız sınırı reddi, code değeri RATE_LIMITED olan ve iki ek üye taşıyan 429 döndürür:

{
  "error": "429 Too Many Requests",
  "code": "RATE_LIMITED",
  "message": "Hız sınırlamasına takıldın. 1 saniye sonra tekrar dene.",
  "global": false,
  "retry_after": 0.428
}

retry_after, bir istek daha kabul edilmeden önceki kesirli saniye cinsinden gecikmedir; global ise reddin genel sınırdan kaynaklanıp kaynaklanmadığını belirtir. Başlıklar ve kovalar Hız sınırları sayfasında açıklanır.

OAuth2 hataları

OAuth2 işlemleri aynı hata gövdesini kullanır. message değerleri çoğunlukla invalid_token gibi kısa, OAuth2 tarzı bir belirteçtir; ancak istemciler yine de code üzerinden karar vermelidir.

Hataları işleme

  • code üzerinden karar verilir. HTTP durumuna yalnız JSON gövdesi olmayan yanıtlarda geri dönülür.
  • 401 alındığında kimlik bilgisi kullanılmayı bırakılır ve yenisi alınır.
  • 429 alındığında yeniden denemeden önce retry_after saniye beklenir.
  • 5xx alındığında üstel geri çekilmeyle yeniden denenir.
  • Diğer her 4xx durumunda istek, yeniden gönderilmeden önce değiştirilir.
const res = await fetch("https://tebhos.com/api/v1/channels/1489002177550843904", {
  headers: { Authorization: `Bot ${process.env.TEBHOS_BOT_TOKEN}` },
});

if (!res.ok) {
  const body = await res.json().catch(() => null);
  switch (body?.code) {
    case "RATE_LIMITED":
      await new Promise((r) => setTimeout(r, body.retry_after * 1000));
      break;
    case "NOT_FOUND":
      console.warn("Channel not found or not visible");
      break;
    default:
      throw new Error(`${res.status} ${body?.code ?? "UNKNOWN"}`);
  }
}
import os, time, requests

res = requests.get(
    "https://tebhos.com/api/v1/channels/1489002177550843904",
    headers={"Authorization": f"Bot {os.environ['TEBHOS_BOT_TOKEN']}"},
)

if not res.ok:
    try:
        body = res.json()
    except ValueError:
        body = {}
    code = body.get("code")
    if code == "RATE_LIMITED":
        time.sleep(body["retry_after"])
    elif code == "NOT_FOUND":
        print("Channel not found or not visible")
    else:
        raise RuntimeError(f"{res.status_code} {code}")