Bu bir çeviridir. Bağlayıcı olan Almanca sürümdür. Bu metin ondan ayrılırsa Almanca metin geçerlidir. Dili sayfanın altından değiştirebilirsin.
İçindekiler
Genel bakış
v2, tellmelo’nun kendi programların için olan API’sidir. Her istek bir anahtar taşır, her yanıt JSON’dur ve her liste aynı biçimde sayfalanır. Bir anahtarın arkasında olan her şey, uygulamadaki bir tıklamayla aynı kurallardan geçer: hız sınırları, askıya almalar, geri alınmış haklar ve bu sunucunun ayarları burada da aynen işler.
Her yol, bu sunucunun kendi adresinde /api/v2 ile başlar, bu sayfadaki örneklerde kullanılan adres.
İstekler ve yanıtlar UTF-8 kodlu JSON’dur. Alan adları, kodlar ve değerler İngilizcedir ve öyle kalır.
Bir anahtar senin hesabın olarak davranır, asla ötesinde değil: uygulamada göremediğin bir şeyi hiçbir anahtar da okuyamaz.
https://tellmelo.com/api/v2
Hızlı başlangıç
“Ayarlar → Uygulama ve veriler → API” altında bir anahtar oluştur ve kopyala. Yalnızca bir kez gösterilir.
Onunla kökü sorgula. Yanıt hangi sürümün çalıştığını, anahtarın neler yapabildiğini ve bu dakika kaç isteği kaldığını söyler.
Oradan sonra her yol aynı çalışır: anahtar başlıkta, geri JSON gelir, listelerde de items ve next.
Devamı için: kendi profilin için /me, herkese açık olanlar için /posts, uygulamanın sana gösterdikleri için /feed.
Senin anahtarın
Hesap başına tam olarak bir anahtar vardır, kullanıcı kimliğine bağlıdır. tm_key_ ile başlar, böylece bir tarayıcı onu ait olmadığı yerde tanır. Yalnızca bir kez, oluşturulduğu anda gösterilir; sonrasında burada yalnızca parmak izi durur ve kimse onu sana geri okuyamaz, ne biz ne sen. Kaybeden yenisini oluşturur; eskisi o andan sonra geçmez.
Onu “Ayarlar → Uygulama ve veriler → API” altında oluşturursun. İsteğin başlığında gider, Authorization: Bearer tm_key_… ya da X-Tellmelo-Key olarak. Adres satırında değil, çünkü oradaki her şey erişim kayıtlarına, tarayıcı geçmişine ve her bağlantının referer bilgisine düşer.
Adres satırında değil. Oradaki her şey aradaki her sunucunun erişim kaydına, tarayıcı geçmişine ve her bağlantının referer bilgisine düşer. Anahtarın orada yeri yoktur.
Aynı anahtar görselleri de yükler. Bir yanıttaki her url bu sunucunun /api/media adresini gösterir; anahtarı oraya da başlıkta gönder, görsel geri gelir, hesabının görebildiği ölçüde.
Bir anahtar iki yetki taşır ve aşağıdaki tablolardaki her yol hangisine ihtiyaç duyduğunu söyler. Beş değil iki: Kendine tek cümleyle açıklayamadığın bir yetki, okumadan işaretlediğin yetkidir. Dürüst çizgi bakmakla değiştirmek arasından geçer.
read: bakmak. Açık gönderiler, profiller, topluluklar ve etiketler, bir de kendi hesabın senin gördüğün hâliyle: akış, bildirimler, sohbetler, mesajlar.
write: değiştirmek. Senin adına olan her şey: yayımlamak, yanıtlamak, oy vermek, mesaj göndermek, takip etmek, katılmak, engellemek, bildirimleri okundu olarak işaretlemek.
Hiçbir anahtarın yapamayacağı
Hiçbir anahtar hesap verilerine uzanmaz: parola yok, e-posta adresi yok, hesap türü yok, yer yok, rol yok, silme yok. Oturumlar da yok, bildirim cihazları da yok, anahtarların kendisi de yok: anahtar çıkarabilen biri artık kapatılamazdı. Yönetim de yok, topluluk yönetimi de yok, çünkü bir topluluğu dağıtmak ya da devretmek başkalarının gönderileri üzerine bir karardır. Parolanın koruduğunu hiçbir anahtar yapamaz: Başkasının makinesindeki bir betikte duran bir sır, girişin yapabildiğini yapabilmemelidir. Bir hesabı ele geçirmek hâlâ girişe mal olur.
İstekler ve yanıtlar
Her yerde JSON. Hatalar dahil her yanıt UTF-8 kodlu application/json’dur. Yalnızca görseller görsel olarak gelir.
Gönderdiklerin. Bir POST, alanlarını gövdede bir JSON nesnesi olarak taşır. Adresteki parametreler gövdenin adını anmadığı alanları tamamlar; ikisi aynı alanı anarsa gövde geçerlidir.
Zamanlar, 1 Ocak 1970’ten bu yana geçen milisaniyelerin tam sayı halidir, UTC, veritabanı onları böyle tutar. Yanlış okunacak bir saat dilimi yoktur.
Kimlikler metindir. Onları parçalara ayırma ve biçimlerine güvenme; yalnızca bütün olarak karşılaştır.
Her alan her zaman vardır. Olmayan şey null’dır, asla eksik değildir; bir sayı her zaman sayıdır, bir liste her zaman listedir, gerekirse boş.
Metinler düz metindir, yazıldığı gibi. #etiketler, @adlar ve bağlantılar olduğu gibi kalır; sunucunun kendi emojileri de :name: olarak; görselleri /emojis altında listelenir.
Görseller bu sunucuya göre göreli adreslerdir, /api/media?id=…. Onları başlıkta aynı anahtarla yükle; anahtar olmadan yanıt 401 olur.
Sayfalar
Her liste limit ve cursor alır, items ve next ile yanıt verir. Son yanıttaki next değerini cursor olarak geri göndererek devam edersin; next boşsa son gelmiştir. Dolu bir sayfa yine de sonuncusu olabilir, yalnızca boş sayfada duran bir kez fazla sorar. İmleç şeffaf değildir: bir listedeki yer, bir zaman noktası değil. Onu parçalara ayırma ve kendin bir tane kurma; içindekiler, hiçbir yol değişmeden değişebilir.
Bir sayfa limit olmadan 20, en fazla 50 kayıt taşır. Birkaç liste hiç sayfalanmaz: bu, yollarında yazar ve next değerleri her zaman null’dır.
Yalnızca yeni olan
Her yanıt bir ETag taşır. Durmadan soran bir program sonuncusunu If-None-Match olarak geri göndermelidir: o zamandan beri bir şey değişmediyse yanıt 304 olur ve gövde taşımaz. Bu, her dakika hattan geçen bir listeyle, ancak içinde bir şey olduğunda geçen bir liste arasındaki farktır, senin makinen için de bunun için de.
İki istisna var, ikisi de bilerek: /feedETag taşımaz, çünkü sırası zamanla değişir ve her yanıt farklıdır; bir yazma işlemi de asla 304 ile yanıt vermez. İki aynı gönderi iki gönderidir.
Sınırlar
Bir anahtar dakikada 120 istek yapabilir, “Kurum” aboneliğiyle 600, yönetim ona başka bir sayı vermediyse. Sınır anahtar başınadır, hesap başına ya da adres başına değil. Üstünde yanıt 429 olur ve hiçbir şey olmamıştır: istek reddedildi, yürütülmedi. Bir dakika bekle ve yeniden gönder; düzenli olarak sınıra çarpan bir program hemen yeniden sormak yerine yavaşlamalıdır.
Anahtarın kendi sınırının yanında yazma işlemleri uygulamadakiyle aynı sınırlara sayılır: birkaç dakikada kaç gönderi, yanıt ya da ilişki. Bunlar da rate_limited koduyla 429 döndürür.
Başlıklar
Adlar, her istemci kütüphanesinin zaten tanıdığı adlardır. Anahtar dışında hiçbiri zorunlu değildir.
Gönderdiklerin
Başlık
Anlamı
Authorization
Anahtarı taşır: Bearer tm_key_…. Olağan yol.
X-Tellmelo-Key
Authorization yerine anahtar, o başlığı başka bir şey için kullanan araçlar için.
Content-Type
Gövdesi olan bir istek için application/json.
If-None-Match
Son yanıtın ETag değeri. O zamandan beri hiçbir şey değişmediyse yanıt gövdesiz 304 olur.
Geri gelenler
Başlık
Anlamı
ETag
Bu yanıtın zayıf olarak işaretlenmiş (W/) parmak izi. Onu If-None-Match olarak geri gönder.
X-RateLimit-Limit
Bu anahtarın dakikada kaç istek yapabileceği.
X-RateLimit-Remaining
İçinde bulunulan dakikada bunlardan kaçının kaldığı.
X-RateLimit-Reset
Bir sonraki dakikanın ne zaman başladığı, 1970’ten beri saniye olarak, UTC.
X-Tellmelo-Scope
Bu anahtarın neler yapabildiği: read ya da read write.
Retry-After
429 ile birlikte: yeniden sormadan önce kaç saniye beklemen gerektiği.
WWW-Authenticate
Eksik anahtar yüzünden gelen 401 ile birlikte: Bearer, anahtarın nasıl beklendiği.
Cache-Control
no-store: aradaki hiçbir vekil sunucu bir yanıtı saklayamaz, çünkü yanıt soran anahtara bağlıdır. Kendi programın yine de ETag ile kontrol edebilir.
Bir şey olmazsa
Hatalar iki alanlı JSON olarak gelir: error içinde programının karşılaştırabileceği sabit bir İngilizce kod, message içinde karşısındaki insan için bir cümle ve ona ait durum kodu. Kod aynı kalır; cümle değişebilir, üstelik her dilde değişebilir: cümleyi karşılaştıran bir program kimsenin duyurmadığı bir gün bozulur.
{ "error": "rate_limited",
"message": "Too many requests. Try again in a minute.",
"limit": 120 }
Bazı hatalar bir alan daha getirir: eksik anahtar yüzünden gelen 401 ile docs, 429 ile limit.
Durum
Kod
Anlamı
400
bad_request
İstek okunamıyor, zorunlu bir alan eksik ya da bir değer izin verilenlerden biri değil. Hangisi olduğunu message söyler.
401
key_missing
Başlıkta anahtar yok.
401
key_invalid
Anahtar geçerli değil: yanlış yazılmış, yenisiyle değiştirilmiş ya da hesabı askıya alınmış. Hangisi olduğu bilerek söylenmez.
401
unauthorized
Anahtarın kendisi dışında bir nedenle oturum açılmamış sayılıp reddedildi. Nadirdir ve anahtarın arkasındaki hesaba bakmak için bir nedendir.
403
scope_missing
Anahtarda bu yolun gerektirdiği yetki yok: çoğunlukla yalnızca okuyabilen bir anahtarda write.
403
account_data_locked
Bu, hiçbir anahtarın ulaşamadığı hesap verilerine dokunuyor: şifre, e-posta adresi, silme ve benzerleri.
403
forbidden
Hesabın bunu yapamaz: uygulamadakiyle aynı ret, örneğin geri alınmış bir yetki ya da bir engelleme.
404
unknown_path
Böyle bir yol yok ya da bu yöntemle yok.
404
not_found
Yol var ama gösterdiği şey yok, ya da onu görmene izin yok. İkisi birbirinden ayrılmaz.
409
conflict
Zaten var olan bir şeyle çakışıyor, örneğin alınmış bir ad.
413
too_large
Çok büyük: bu sunucunun kabul ettiğinin ötesinde bir metin ya da istek.
422
unprocessable
Okunabilir ama bu biçimde mümkün değil.
429
rate_limited
Çok fazla istek. Hiçbir şey yapılmadı; bekle ve yeniden gönder.
500
internal_error
Sorun bizim tarafımızda, senin tarafında değil. Sunucuda eksiksiz kaydedildi.
Sürümler
Sürüm yolun içinde. Orada v2 yazdığı sürece bu yollar ve alanları olduğu gibi kalır; eklenen şey yanına gelir.
Eklemeler ikinci sayıyı yükseltir: 2.1 ile /emojis ve bir sohbeti okundu olarak işaretleme geldi. 2.4 içerik uyarıları artık olmadığı için contentWarning alanını kaldırdı. 2.5 görsel açıklamaları artık olmadığı için görsellerdeki alt alanını kaldırdı. 2.6, ekibin yeni işleri için team bildirim türünü ekler. Her yol hangi sürümden beri var olduğunu, kök ise hangi sürümün çalıştığını söyler.
Uç noktalar
Önce bütün yollar bir bakışta, sonra her biri ayrıntılı: ne aldığı, örnek bir istek ve ne döndürdüğü.
Bir gönderinin metne ya da ankete ihtiyacı vardır. Uzunluğunu, bir anketteki seçenek sayısını ve ne kadar sürede kaç gönderi yapılabileceğini bu sunucu belirler; bunların ötesinde yanıt, hangisi olduğunu söyleyen bir message ile 400 ya da 429 olur.
Görseller API üzerinden henüz eklenemiyor, yalnızca uygulamada.
Parametreler
Ad
Tür
Anlamı
textgövdede
stringisteğe bağlı
Metnin kendisi: gönderinin, yanıtın ya da mesajın.
communitygövdede
stringisteğe bağlı
Gönderinin gideceği topluluğun id değeri. Verilmezse her topluluğun dışında.
quotesgövdede
stringisteğe bağlı
Bu gönderinin alıntıladığı gönderinin id değeri.
pollgövdede
string[]isteğe bağlı
Bir anketin yanıt seçenekleri, metin listesi olarak. Kaç tanesine izin verildiğini sunucu belirler.
Örnek istek
curl -X POST \
-H "Authorization: Bearer tm_key_…" \
-H "Content-Type: application/json" \
-d '{"text":"The bees are back in the garden 🐝 #garden"}' \
"https://tellmelo.com/api/v2/posts"
Bir gönderinin altındaki sohbet: parentId ile ağaca dönüşen bir liste olarak okunur, gönderiye ya da bir yanıta yanıt verilerek yazılır.
GET/api/v2/posts/{id}/replies
Bir gönderiye gelen yanıtlar, senin gördüğün hâliyle: engellenmiş bir hesabın yazdığı dışarıda kalır.
Yetki read
sayfalanabilir
ETag ile
v2.0 sürümünden beri
Liste düzdür ve yazılma sırasındadır; parentId onu bir ağaca dönüştürür. Bir sayfa bütün dizileri taşır, yani bir yanıt asla yanıt verdiği mesaj olmadan gelmez. Engellediğin ya da seni engelleyen bir hesabın yazdıkları dışarıda kalır. İki anahtar farklı listeler görebilir.
Parametreler
Ad
Tür
Anlamı
idyolda
stringzorunlu
Bir gönderinin id değeri.
limitadreste
integeristeğe bağlı
Bir sayfada kaç kayıt olduğu: varsayılan 20, en çok 50.
cursoradreste
stringisteğe bağlı
Nereden devam edileceği: önceki yanıtın next değeri. Olmadan en baştan.
Yavaş moddaki bir gönderinin altında herkes 10 dakikada bir yanıt verebilir; bir yanıt daha 429 alır, bekleme süresi mesajdadır. Mod, yazara ve yazarın takip ettiği hesaplara uygulanmaz.
Parametreler
Ad
Tür
Anlamı
idyolda
stringzorunlu
Bir gönderinin id değeri.
textgövdede
stringzorunlu
Metnin kendisi: gönderinin, yanıtın ya da mesajın.
parentIdgövdede
stringisteğe bağlı
Bu yanıtın yanıtladığı yanıtın id değeri. Verilmezse doğrudan gönderiye.
Örnek istek
curl -X POST \
-H "Authorization: Bearer tm_key_…" \
-H "Content-Type: application/json" \
-d '{"text":"Same here, the lavender is full of them."}' \
"https://tellmelo.com/api/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/replies"
Gönderilerde, adlarda, kısa adlarda ve etiketlerde arama.
Yetki read
ETag ile
v2.0 sürümünden beri
Yalnızca herkese açık olanda arar: topluluk dışındaki gönderiler, profiller ve etiketler. limit tür başına sayılır: 20, 20 gönderi, 20 profil ve 20 etikete kadar getirebilir.
Parametreler
Ad
Tür
Anlamı
qadreste
stringzorunlu
Aranan sözcükler.
typeadreste
stringisteğe bağlı
Hangi tür sonuç. Verilmezse her tür.allpostsprofilestags
limitadreste
integeristeğe bağlı
Bir sayfada kaç kayıt olduğu: varsayılan 20, en çok 50.
Sunucunun kendi emojileri, görsellerinin adresiyle birlikte.
Yetki read
ETag ile
v2.1 sürümünden beri
Metinlerde bu sunucunun bir emojisi :name: olarak durur. Onu bu listedeki görselle değiştir; listede olmayan bir ad metin olarak kalır: silinmiştir ya da hiç var olmamıştır.
Burada ETag yok: sıra zamanla değişir, bu yüzden her yanıt farklıdır. Başlamış bir liste yine de sonuna kadar aynı kalır: next onun başladığı anı taşır.
Parametreler
Ad
Tür
Anlamı
tabadreste
stringisteğe bağlı
Hangi akış: for-you, following, latest ya da bookmarks. Varsayılan latest.for-youfollowinglatestbookmarks
tagadreste
stringisteğe bağlı
Yalnızca bu etiketi taşıyan gönderiler. Verilmezse süzgeç yok.
limitadreste
integeristeğe bağlı
Bir sayfada kaç kayıt olduğu: varsayılan 20, en çok 50.
cursoradreste
stringisteğe bağlı
Nereden devam edileceği: önceki yanıtın next değeri. Olmadan en baştan.
Hesabın etrafında olup bitenler, sayfa sayfa okunabilir, böylece bir program kaçırdıklarını yakalayabilir.
GET/api/v2/notifications
Kendi bildirimlerin, en yenisi önce, sayfalanabilir, böylece bir program kaçırdığını sonradan alabilir.
Yetki read
sayfalanabilir
ETag ile
v2.0 sürümünden beri
Okumak hiçbir şeyi okundu olarak işaretlemez; bunu POST /notifications/read yapar. Aynı gönderiyle ilgili aynı türden birkaç olay tek satırda toplanır ve more kaç tane olduğunu söyler.
Parametreler
Ad
Tür
Anlamı
limitadreste
integeristeğe bağlı
Bir sayfada kaç kayıt olduğu: varsayılan 20, en çok 50.
cursoradreste
stringisteğe bağlı
Nereden devam edileceği: önceki yanıtın next değeri. Olmadan en baştan.
Okumak hiçbir şeyi okundu olarak işaretlemez: arka planda veri çeken bir program kimseye bir şey göstermemiştir. Bunu POST /conversations/{with}/read yapar.
Parametreler
Ad
Tür
Anlamı
withyolda
stringzorunlu
Konuştuğun hesabın id değeri. Bir sohbetin kendine ait bir id değeri yoktur: o, karşı hesaptır, posta kutusunun with dediği değerin aynısı.
limitadreste
integeristeğe bağlı
Bir sayfada kaç kayıt olduğu: varsayılan 20, en çok 50.
cursoradreste
stringisteğe bağlı
Nereden devam edileceği: önceki yanıtın next değeri. Olmadan en baştan.
Uygulamadakiyle aynı kurallar geçerlidir: seni engelleyen birine yazılamaz ve karşı tarafın ayarları dikkate alınır. Yanıt o zaman nedenini söyler.
Görseller API üzerinden henüz eklenemiyor, yalnızca uygulamada.
Parametreler
Ad
Tür
Anlamı
withyolda
stringzorunlu
Konuştuğun hesabın id değeri. Bir sohbetin kendine ait bir id değeri yoktur: o, karşı hesaptır, posta kutusunun with dediği değerin aynısı.
textgövdede
stringzorunlu
Metnin kendisi: gönderinin, yanıtın ya da mesajın.
replyTogövdede
stringisteğe bağlı
Bu mesajın yanıt verdiği, bu konuşmadaki önceki bir mesajın id değeri. 2.2’den beri.
Örnek istek
curl -X POST \
-H "Authorization: Bearer tm_key_…" \
-H "Content-Type: application/json" \
-d '{"text":"See you on Saturday at the market!"}' \
"https://tellmelo.com/api/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/messages"
Beğenmek, kaydetmek, yeniden paylaşmak, takip etmek, katılmak ve engellemek: hepsi için tek yol, active ile kurulur ve geri alınır.
POST/api/v2/relations
Beğenmek, kaydetmek, paylaşmak, takip etmek, katılmak, engellemek, sessize almak, kind değerine göre.
Yetki write
v2.0 sürümünden beri
target, like, save ve repost için bir gönderi, join için bir topluluk, follow, block ve mute için bir hesaptır, her zaman id ile. active: false ilişkiyi geri alır. Bir engellemenin üzerinden kimse takip edemez, hiçbir yönde. Sessize almayı yalnızca sessize alan görür.
Parametreler
Ad
Tür
Anlamı
kindgövdede
stringzorunlu
Hangi ilişki: like, save, repost, follow, join, block ya da mute (2.2 sürümünden beri).likesaverepostfollowjoinblockmute
targetgövdede
stringzorunlu
İlişkinin gösterdiği şey, id değeriyle: kind değerine göre bir gönderi, bir profil ya da bir topluluk.
activegövdede
booleanisteğe bağlı
İlişkinin geçerli olup olmayacağı: true kurar, false geri alır.
Bir bildirim. Bir satır aynı türden birkaç olayı toplayabilir.
Alan
Tür
Anlamı
id
string
Bildirimin kimliği.
kind
string
Ne olduğu.
reply — Biri sana yanıt verdi.
like — Biri gönderini beğendi.
repost — Biri gönderini yeniden paylaştı.
follow — Biri seni takip ediyor.
mention — Biri senden bahsetti.
group_mention — Biri yönettiğin bir gruptan bahsetti; text onun adıdır.
message — Biri sana mesaj yazdı.
scheduled — Zamanlanmış bir gönderin yayımlandı.
reminder — Kaydedilen bir gönderi için hatırlatma zamanı geldi.
report — Gönderdiğin bir şikâyetin ne olduğu.
moderation — Hesabınla ilgili bir karar: bir uyarı, bir kısıtlama, bir itiraz.
team — Yalnızca sahipler, yöneticiler ve moderatörler için ekibe yeni iş: bildirimler, itirazlar, gönderilen bağlantılar, talepler, doğrulama başvuruları ve iptaller.
text
stringya da null
Yalnızca şikâyetlerde ve moderasyonda: ona eşlik eden metin. Aksi halde null: bir bildirimin cümlesini senin programın kurar.
Bu mesajın yanıtladığı mesajın id değeri (hiçbirini yanıtlamıyorsa null). 2.2 sürümünden beri.
createdAt
integer
Ne zaman gönderildiği.
Örnek
{
"id": "7c6b5a49-3827-4165-9f0e-d1c2b3a49586",
"text": "See you on Saturday at the market!",
"from": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
"to": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
"read": true,
"media": [],
"replyTo": null,
"createdAt": 1758624060000
}
Created
Bir şey oluşturan yazma işleminin yanıtı.
Alan
Tür
Anlamı
id
string
Oluşturulan şeyin kimliği.
scheduledFor
integerya da null
Yayın zamanlandıysa ne zaman görüneceği (aksi halde null).
deleteAt
integerya da null
Ayarlandıysa kendini ne zaman sileceği (aksi halde null).
Geri verecek bir şeyi olmayan yazma işleminin yanıtı.
Alan
Tür
Anlamı
ok
boolean
Her zaman true.
Örnek
{
"ok": true
}
Makinenin okuyabildiği tanım
Bu sayfanın kurulduğu tablonun aynısı /api/v2/openapi.json adresinde durur: yollar, parametreler, yetkiler ve geri dönen biçimler. Bir istemci üreteci onu okuyabilir ve API’den uzaklaşamaz, çünkü sayfa, yönlendirici ve tanım tek bir listeden gelir.
https://tellmelo.com/api/v2/openapi.json
v1’e ne oldu
v1 kaldırıldı. /api/v1/ altındaki eski yollar 410 yanıtı verir ve gövdede nereye gidileceğini söyler. Yönlendirme yok, çünkü v2 başka bir biçimde yanıt verir ve onu izleyen bir program okuyamayacağı bir 200 alırdı. O sırada henüz herkese açık hesap yoktu, dolayısıyla üzerinde programı olan kimse de yoktu; sonra kaldırmak, hiç kaldırmamak demek olurdu.
Beklediğimiz
Her yerdekiyle aynı ilkeler: taciz yok, spam yok, hakkın olmayan başkasının içeriği yok. Program hiçbir şeyi mazur göstermez: anahtarının yazdığından sen sorumlusun.