Ek yüklemeleri¶
İstemci normalde önce her dosyayı yükler, ardından mesajı oluştururken ona başvurur. Akış üç adımdan (büyük dosyalar için dört adımdan) oluşur:
- Dosyalar için bir yükleme planı isteyin.
- Her dosyanın baytlarını
PUTile kendi yükleme URL'sine veya her parçayı kendi parça URL'sine gönderin. - Çok parçalı bir yükleme için yüklemeyi tamamlayın.
- Döndürülen yükleme anahtarlarıyla mesajı oluşturun.
Küçük dosyalar bunun yerine multipart/form-data olarak doğrudan mesaj isteğinin içinde gönderilebilir; bkz. Çok parçalı gövde.
Ek yüklemeleri kullanıcı oturumlarını ve bot token'larını kabul eder. Çağıranın bir sunucu kanalında VIEW_CHANNEL, SEND_MESSAGES ve ATTACH_FILES izinlerine sahip olması, zaman aşımında olmaması ve özel bir kanalın alıcısı olması gerekir.
Boyut sınırları¶
Tek bir dosyanın en büyük boyutu, yükleyenin planına ve sunucunun takviye seviyesine bağlıdır. Geçerli sınır ikisinden büyük olanıdır.
| Kaynak | Dosya başına sınır |
|---|---|
| Ücretsiz hesap | 10 MiB (10485760 bayt) |
| TEBHOS Pro hesabı | 200 MiB (209715200 bayt) |
| Sunucu takviye seviyesi 1 | 50 MiB (52428800 bayt), o sunucunun kanallarında |
| Sunucu takviye seviyesi 2 veya üstü | 100 MiB (104857600 bayt), o sunucunun kanallarında |
Not
Örnek (instance) keşfinin limits bloğu daha büyük bir max_attachment_file_size bildirir. Ek yükleme yolları bu tablodaki hesap başına ve takviye başına sınırları uygular; bu nedenle istemcide dosyaları doğrularken bunları kullanın.
Özel bir kanalın takviye seviyesi yoktur; dolayısıyla orada yalnızca hesap sınırı geçerlidir. Sınırı aşan bir dosya, plan istendiğinde 400 BAD_REQUEST ile reddedilir. Bir mesaj en fazla 10 ek taşıyabilir.
Yükleme planı isteme¶
POST /channels/{channel_id}/attachments
Aynı anda 1 ile 10 dosya için yükleme URL'leri ister.
Hız sınırı: channel:attachment:upload, hesap ve kanal başına 10 saniyede 10.
| Alan | Tür | Açıklama |
|---|---|---|
attachments |
array[object] | Dosya başına bir tane olmak üzere 1-10 giriş |
attachments[].id |
integer veya string | İstemcinin seçtiği kimlik; girişleri eşleştirebilmeniz için geri döndürülür |
attachments[].filename |
string | Dosya adı; boş olmamalıdır |
attachments[].file_size |
integer | Bayt cinsinden tam boyut; 0'dan büyük olmalıdır |
attachments[].content_type? |
string | MIME türü. Varsayılan application/octet-stream |
Yanıt, istenen her dosya için bir giriş içeren {"attachments": [...]} biçimindedir:
| Alan | Tür | Açıklama |
|---|---|---|
id |
integer veya string | İstekteki, istemcinin seçtiği kimlik |
upload_mode |
string | En fazla 10 MiB (10485760 bayt) olan dosya için singlepart, daha büyük dosya için multipart |
filename |
string | İstekteki dosya adı |
upload_filename |
string | Yükleme anahtarı. Mesajı oluştururken buna başvurun |
upload_url |
string | Yalnızca singlepart: baytların PUT ile gönderileceği URL |
upload_id |
string | Yalnızca multipart: yüklemeyi tamamlamak için gereken çok parçalı yükleme kimliği |
part_size |
integer | Yalnızca multipart: sonuncusu hariç her parçanın boyutu |
parts |
array[object] | Yalnızca multipart: her parça için 1'den başlayarak numaralandırılmış {part_number, upload_url} |
file_size |
integer | Bildirilen boyut |
content_type |
string | Yüklemeyle birlikte gönderilecek içerik türü |
attachment_id |
string | upload_filename ile aynı değer |
storage_key |
string | Dosyanın depolama yolu |
url |
string | Dosyanın yüklemeden sonra sahip olacağı herkese açık URL |
curl -X POST https://tebhos.com/api/v1/channels/1489002177550843904/attachments \
-H "Authorization: Bearer $TEBHOS_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{"attachments": [{"id": 0, "filename": "photo.png", "file_size": 48213, "content_type": "image/png"}]}'
{
"attachments": [
{
"id": 0,
"upload_mode": "singlepart",
"filename": "photo.png",
"upload_filename": "3f6c2a8e-6d1b-4f0e-9a52-1c7f4b2d9e10",
"upload_url": "https://storage.example.com/attachments/1489002177550843904/1489002299998765056/photo.png?X-Amz-Signature=...",
"file_size": 48213,
"content_type": "image/png",
"attachment_id": "3f6c2a8e-6d1b-4f0e-9a52-1c7f4b2d9e10",
"storage_key": "attachments/1489002177550843904/1489002299998765056/photo.png",
"url": "https://cdn.tebhos.com/attachments/1489002177550843904/1489002299998765056/photo.png"
}
]
}
Parça boyutu¶
Çok parçalı bir plan yaklaşık 20 parçayı hedefler: parça boyutu, dosya boyutunun 20'ye bölünüp tam bir MiB'ye yukarı yuvarlanmasıyla bulunur ve hiçbir zaman 10 MiB'nin altında olmaz. n numaralı parça (n - 1) × part_size baytından bir sonraki parçaya kadar olan kısmı kapsar; son parça kalanı tutar.
Tek dosyalık varyant¶
POST /channels/{channel_id}/attachments/upload-url, {"filename": string, "content_type": string, "size": integer} gövdesiyle tek bir dosya için plan ister. attachment_id, upload_url, storage_key, url, expires_in (saniye) ve max_size döndürür. Aynı kovayı ve sınırları paylaşır.
Baytları aktarma¶
upload_url adresine, gövdesi dosyanın baytları olan bir PUT isteği gönderin. Authorization başlığı göndermeyin ve URL'nin yolunu veya sorgu dizesini değiştirmeyin.
Tek bir yükleme URL'si 5 dakika (300 saniye), bir parça URL'si 1 saat geçerlidir. Süresi dolmuş bir URL yenilenemez; yeni bir plan isteyin.
Çok parçalı bir dosya için her parçanın baytlarını PUT ile kendi parça URL'sine gönderin; bunu istediğiniz sırada ve dilerseniz paralel yapabilirsiniz.
Yükleme URL'sinin nereyi gösterdiği örneğe (instance) bağlıdır: önceden imzalanmış yüklemelerde (örnek özelliklerinde presigned_attachment_uploads true) imzalı bir nesne depolama URL'sidir; aksi halde API'nin kendisi altındaki bir yoldur. İstemci akışı her iki durumda da aynıdır.
URL'nin tamamı kimlik bilgisidir
Bir yükleme URL'si tek bir nesnenin yazılmasını yetkilendirir. Sorgu dizesi dahil URL'nin tamamını süresi dolana kadar gizli kabul edin; günlüklerden, yönlendiren (referrer) başlıklarından ve yönlendirmelerden uzak tutun.
Çok parçalı yüklemeyi tamamlama¶
POST /channels/{channel_id}/attachments/complete
Bir veya daha fazla çok parçalı yüklemenin yüklenmiş parçalarını dosyalarında birleştirir. Tüm parçalar gönderildikten sonra ve mesaj oluşturulmadan önce çağırın.
Hız sınırı: channel:attachment:upload (yükleme planlarıyla paylaşılır), hesap ve kanal başına 10 saniyede 10.
| Alan | Tür | Açıklama |
|---|---|---|
uploads |
array[object] | 1-10 giriş |
uploads[].upload_filename |
string | Plandaki yükleme anahtarı |
uploads[].upload_id |
string | Plandaki upload_id |
Sunucu her giriş için yüklemenin çağıran tarafından bu kanalda çok parçalı olarak planlandığını denetler, depolamadaki parçaları listeler ve birleştirir. Birleştirilen dosya ardından meta veri onayı ile aynı işlemden geçer: boyutu çağıranın sınırına göre, SHA-256 özeti engellenen dosyalar listesine göre denetlenir; görüntü boyutları ve bir yer tutucu hesaplanır. Ayrı bir onay çağrısı gerekmez.
Yanıt, tamamlanan her yükleme için bir giriş içeren {"uploads": [{"upload_filename": string}]} biçimindedir.
| Durum | Koşul |
|---|---|
400 INVALID_FORM_BODY (errors[].code UPLOADED_ATTACHMENT_NOT_FOUND, yol uploads.{i}.upload_filename) |
Yükleme anahtarı bilinmiyor, zaten kullanılmış, başka bir hesaba veya kanala ait ya da singlepart olarak planlanmış |
400 INVALID_FORM_BODY (errors[].code NO_UPLOADED_PARTS_TO_FINALIZE) |
Hiçbir parça yüklenmemiş; yükleme iptal edilir |
400 BAD_REQUEST |
Yüklenen parçalar çağıranın boyut sınırını aşıyor; yükleme iptal edilir |
403 CONTENT_BLOCKED |
Dosya engellenen dosyalar listesinde; silinir |
503 SERVICE_UNAVAILABLE |
Nesne depolamasına ulaşılamadı; birleştirme başarısız olursa yükleme iptal edilir |
curl -X POST https://tebhos.com/api/v1/channels/1489002177550843904/attachments/complete \
-H "Authorization: Bot $TEBHOS_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uploads": [{"upload_filename": "3f6c2a8e-6d1b-4f0e-9a52-1c7f4b2d9e10", "upload_id": "2~abc..."}]}'
İsteğe bağlı meta veri onayı¶
POST /channels/{channel_id}/attachments/{attachment_id}/confirm
Yüklemeden sonra istemci, bekleyen ek üzerine meta veri kaydedebilir. Her alan isteğe bağlıdır. Bu adım zorunlu değildir; aynı meta veriler mesaj oluşturulurken de gönderilebilir.
| Alan | Tür | Açıklama |
|---|---|---|
width? |
integer | Piksel cinsinden görüntü veya video genişliği |
height? |
integer | Piksel cinsinden görüntü veya video yüksekliği |
duration_ms? |
integer | Milisaniye cinsinden ses veya video süresi |
placeholder? |
string | Küçük, bulanık bir yer tutucu |
title? |
string | En fazla 256 karakterlik bir başlık; varsayılanı uzantısız dosya adıdır |
waveform? |
string | Sesli mesajın dalga biçimi |
Yüklemeyi sahiplenme¶
Yüklenen her dosyaya Mesaj oluşturma içinde, upload_filename değerini taşıyan nesnelerden oluşan bir attachments dizisiyle başvurun:
{
"content": "Here is the photo",
"attachments": [
{
"upload_filename": "3f6c2a8e-6d1b-4f0e-9a52-1c7f4b2d9e10",
"width": 1280,
"height": 720,
"flags": 0
}
]
}
| Alan | Tür | Açıklama |
|---|---|---|
upload_filename |
string | Plandaki yükleme anahtarı |
width? |
integer | Piksel cinsinden görüntü veya video genişliği |
height? |
integer | Piksel cinsinden görüntü veya video yüksekliği |
description? |
string | Alternatif metin |
title? |
string | Bir başlık |
duration? |
integer | Saniye cinsinden ses veya video süresi |
waveform? |
string | Sesli mesajın dalga biçimi |
flags? |
integer | Ek bayrakları. 8 (1 << 3) eki spoiler olarak işaretler |
Burada gönderilen meta veriler yalnızca onay adımında ayarlanmamış alanları doldurur. Alternatif olarak attachment_ids (upload_filename değerlerinden oluşan bir dizi) ve spoiler_attachment_ids gönderin.
Bir yükleme anahtarı tek kullanımlıktır ve onu isteyen hesaba aittir. Bilinmeyen, zaten kullanılmış veya başka bir hesaba ait bir anahtar hata verilmeden atlanır; bu nedenle her dosyanın eklendiğini doğrulamak için döndürülen mesajın attachments alanını denetleyin. Yalnızca yükleme yapmak mesaj oluşturmaz ve hiçbir Gateway olayı göndermez.
Saklama süresi¶
Saklanan bir ek, boyutuna bağlı bir süre boyunca tutulur: 5 MiB'ye kadar olan dosyalar yaklaşık üç yıl tutulur ve süre boyutla birlikte azalarak 500 MiB'lik dosyalar için 14 güne iner. Süresi dolan ekler otomatik olarak kaldırılır.
Profil ve sunucu görüntüleri¶
Avatarlar, afişler, sunucu simgeleri, emojiler ve çıkartmalar kendi yükleme URL'si yollarını kullanır; bunlar geçerli kullanıcı, sunucular, sunucu emojileri ve sunucu çıkartmaları sayfalarında açıklanır.
Yayın önizlemeleri¶
Yayın önizlemesi, bir ekran paylaşımına eklenmiş bir JPEG görüntüsüdür. Ek akışını değil Yayınlar API'sini kullanır. Önizleme satır içi olarak veya POST /streams/{stream_key}/preview/upload-url ile alınan bir yükleme URL'si üzerinden gönderilebilir; görüntü en fazla 1000000 bayt olmalıdır ve yükleme URL'si bir gün geçerlidir.
Hatalar¶
API istekleri standart hata yanıtını döndürür. Nesne depolamasına yapılan başarısız bir PUT, depolama sağlayıcısının kendi hata biçimini döndürür.