FiveM sunucusundan Discord webhook günlükleri: PerformHttpRequest rehberi
PerformHttpRequest ve JSON embeds ile Discord'a FiveM'den günlükleri gönderin. Yalnızca sunucu tarafı, convar'da URL, hız limitleri için kuyruk ve neyi günlüğe kaydetmeli.
Kim ne satın aldığını, kim para verdiğini, kim admin komutu çalıştırdığını ve kim katıldığını, tüm gün konsolu izlemeden bilmek istiyorsunuz. Discord webhook bunu yapar: sunucunuz kanala bir ileti gönderir. Bu rehber PerformHttpRequest ile sunucu tarafı Lua'yı, embed'leri nasıl yapacağını, URL'yi güvende tutmayı ve hız limitinden kaçınmayı gösterir.
Webhook oluşturun
Discord'da, kanal ayarlarını açın, sonra Entegrasyonlar, sonra Webhook'ler, birini oluşturun ve URL'sini kopyalayın. https://discord.com/api/webhooks/<id>/<token> gibi görünür. Bu URL'ye sahip herkes kanalınızda gönderebilir, bu nedenle şifre gibi davranın.
URL'yi bir convar'da tutun
server.cfg'ye koyun:
set discord_webhook_logs "https://discord.com/api/webhooks/ID/TOKEN"setr veya sets değil set kullanın. Çoğaltılan convar her istemciye gönderilir, URL sızdıracak. Sunucuda okuyun:
local WEBHOOK = GetConvar('discord_webhook_logs', '')Convar boşsa, hatayı vermek yerine göndermeyi atlayın. Farklı kanallara göndermek için günlük türü başına bir convar tutabilirsiniz (para, admin, katılımlar).
İleti gönderin
local function sendLog(title, description, color, fields)
if WEBHOOK == '' then return end
local embed = {
title = title,
description = description,
color = color or 3447003,
fields = fields,
timestamp = os.date('!%Y-%m-%dT%H:%M:%SZ'),
}
PerformHttpRequest(WEBHOOK, function(status, body, headers)
if status ~= 204 and status ~= 200 then
print(('webhook failed: %s'):format(status))
end
end, 'POST', json.encode({ username = 'Server logs', embeds = { embed } }), {
['Content-Type'] = 'application/json',
})
endBilmek için noktalar:
colorondalık sayıdır, hex dizisi değil.3447003mavi ve15158332kırmızıdır. Hex'itonumber('FF0000', 16)ile dönüştürün.timestampUTC'de ISO 8601 tarihi olmalıdır. Biçimdeki!os.dateUTC kullanmasını sağlar.fields{ name = '...', value = '...', inline = true }listesidir. Alan değeri boş olamaz.- Başarılı webhook çağrısı 204 durumuyla boş gövde döndürür.
- Discord boyutları sınırlar. Başlıklar kısadır (256 karakter), açıklamalar uzundur ancak sınırlıdır (4096) ve ileti sınırlı sayıda alanları ve embed'leri tutar. Göndermeden önce uzun metni kesin.
Örnek çağrı, para gönderen oyuncu için:
sendLog('Money transfer', 'A player sent money', 3066993, {
{ name = 'From', value = ('%s (id %d)'):format(GetPlayerName(src), src), inline = true },
{ name = 'To', value = ('%s (id %d)'):format(GetPlayerName(target), target), inline = true },
{ name = 'Amount', value = ('$%d'):format(amount), inline = false },
})Yalnızca sunucu tarafı, asla istemciden
Dikkat: istemci betiğinde webhook için
PerformHttpRequestçağırmayın ve URL'yi istemciye göndermeyin. İstemci dosyaları her oyuncu tarafından okunabilir, bu nedenle URL sızar ve herkes kanalınızı taşkınlaştırabilir.
İstemcideki olay günlüğe kaydedilmişse, sunucuya olay gönderin ve sunucunun güvendiği verilerden günlüğe kaydedilecekleri belirlemesine izin verin. İstemci "bunu günlüğe kaydet" tetikleyebilirse, sahte günlükleri de tetikleyebilir. Genel olarak etkinlik güvenliği için, FiveM'de güvenli etkinlikler bölümünü okuyun. İstemcinin söylediğini değil, sunucunun yaptığını günlüğe kaydedin.
Hız sınırları: kuyruk kullanın
Discord webhook çağrılarını reddet çok hızlı varışla 429 yanıtı ile. Mesaj patlaması; 50 oyuncu aynı olayı tetiklemesi; bunu vurabiliyor. İletileri sabit tempoda kuyruktan gönderin:
local queue = {}
local function enqueue(payload)
queue[#queue + 1] = payload
end
CreateThread(function()
while true do
local item = table.remove(queue, 1)
if item then
PerformHttpRequest(WEBHOOK, function(status, _, headers)
if status == 429 then
-- put it back and wait a bit longer
table.insert(queue, 1, item)
Wait(5000)
end
end, 'POST', json.encode(item), { ['Content-Type'] = 'application/json' })
end
Wait(2000)
end
end)İletiler arasında iki saniye beklemek sınırın altında kalır. Daha fazlasına ihtiyacınız varsa, birkaç embed'i bir iletide gruplayın: bir istek embeds listesinde 10 adede kadar embed taşıyabilir. Wait kullanımı için, Wait açıklandı bölümüne bakın.
Neyi günlüğe kaydetmeli
Bir şey yanlış gittiğinde isteyeceğiniz olayları günlüğe kaydedin:
- Para: büyük transferler, satın almalar, para oluşturan her şey. Bu kötüye kullanımın ilk gösterildiği yerdir.
- Admin eylemleri: kim hangi admin komutunu kime, yasaklamalar, uyarılar, teleportlar kullandı. Bkz. oyuncuları yasakla ve uyar.
- Katılımlar ve ayrılışlar, oyuncunun kimliklerini, anlaşmazlıklar ve yasaklamalarla yardımcı olur.
- Öğe oluşturma ve silah kullanımı, izin veriyorsanız.
Her şeyi günlüğe kaydetmeyin. Saniyede bir ileti ile kanał, kimsenin okumadığı kanaldır. Birkaç kanal seçin, personelin baktığı yere önemli olanları koyun ve geri kalanını kısa tutun. Kişisel verileri neye ihtiyacınız olduğunu tutun ve özel sohbeti günlüğe kaydetmeyin.
İpucu: günlüğe kaydetme işlevinizi küçük bir kaynağa koyun ve diğer betiklerinizden bir dışa aktarmayla çağırın, böylece webhook URL'si ve hız sınırı kuyruğu tek bir yerde yaşar. FiveM'de dışa aktarmalar bölümüne bakın.
Kontrol Listesi
| Semptom | Çözüm |
|---|---|
| Hiçbir şey gelmez | Convar adını, URL'nin tamamlandığını ve çağrının sunucuda çalıştığını kontrol edin |
| 400 durumu | JSON geçersiz: boş alan değeri, çok uzun metin veya hex renk dizisi |
| 429 durumu | İletiler arasında duraksamayla kuyruk aracılığıyla gönderin |
| Timestamp yok sayıldı | UTC ISO 8601 kullanın: os.date('!%Y-%m-%dT%H:%M:%SZ') |
| URL sızdı | Discord'da webhook'i silin, yeni bir tane oluşturun ve bir set convar'da tutun |
| Çok fazla ileti | Yalnızca para, admin eylemleri ve katılımları günlüğe kaydedin |
Kısa yanıtlar
İstemciden Discord webhook gönderebildim mi?
Hayır. Herkes istemci kodunu okuyabilir ve webhook URL'sini çalabilir, sonra kanalınızı spam yapabilir. Sunucuda günlüğü tetikleyin ve oradan gönderin.
Kaç webhook iletisi gönderebildim?
Discord webhook'leri hız sınırlar ve dakika başına webhook başına kabaca 30 ileti güvenli tavanıdır. Bunun ötesinde 429 yanıt alırsınız, bu nedenle iletilerinizi kuyruk yapın ve sabit tempoyla gönderin.
Webhook URL'sini nerede saklamalıyım?
server.cfg'de set ile ayarlanmış sunucu convar'ında, GetConvar ile okuyun. Asla istemci dosyasına veya setr veya sets ile ayarlanmış convar'a koymayın.
Bu sorunu yaşatmayan scriptler
Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →
Crypto MiningBir depo alın, rigleri parça parça kurun ve sürekli hareket eden bir piyasada coin kazın.Scripti gör →
Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →