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:

cfg
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:

lua
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

lua
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',
    })
end

Bilmek için noktalar:

  • color ondalık sayıdır, hex dizisi değil. 3447003 mavi ve 15158332 kırmızıdır. Hex'i tonumber('FF0000', 16) ile dönüştürün.
  • timestamp UTC'de ISO 8601 tarihi olmalıdır. Biçimdeki ! os.date UTC 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:

lua
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:

lua
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 →

Okumaya devam edin