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.
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_aftersaniye 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}")