Logi webhooka Discord z serwera FiveM: poradnik PerformHttpRequest
Wyślij logi do Discord z FiveM za pomocą PerformHttpRequest i JSON embeds. Tylko po stronie serwera, URL w convar, kolejka dla limitów tempa, i co logować.
Chcesz wiedzieć, kto coś kupił, kto dał pieniądze, kto uruchomił polecenie administratora i kto się przyłączył, bez obserwacji konsoli cały dzień. Webhook Discord to robi: twój serwer wysyła wiadomość do kanału. Ten poradnik pokazuje stronę serwera Lua z PerformHttpRequest, jak budować embeds, jak trzymać URL bezpiecznym i jak uniknąć limitu tempa.
Utwórz webhook
W Discord, otwórz ustawienia kanału, potem Integracje, potem Webhoki, utwórz jeden i skopiuj jego URL. Wygląda jak https://discord.com/api/webhooks/<id>/<token>. Każdy z tym URL może pisać na twoim kanale, więc traktuj to jak hasło.
Trzymaj URL w convar
Włóż to do server.cfg:
set discord_webhook_logs "https://discord.com/api/webhooks/ID/TOKEN"Użyj set, nie setr lub sets. Replikowany convar jest wysyłany do każdego klienta, co przecieknęłoby URL. Przeczytaj to na serwerze:
local WEBHOOK = GetConvar('discord_webhook_logs', '')Jeśli convar jest pusty, pomiń wysyłanie zamiast wyrzucania błędu. Możesz trzymać jeden convar na typ logu (pieniądze, administrator, przyłączenia), aby wysłać je do różnych kanałów.
Wyślij wiadomość
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',
})
endPunkty do poznania:
colorto liczba dziesiętna, nie ciąg hex.3447003to niebieski i15158332to czerwony. Konwertuj hex ztonumber('FF0000', 16).timestampmusi być datą ISO 8601 w UTC.!w formacie czynios.dateużywa UTC.fieldsto lista{ name = '...', value = '...', inline = true }. Wartość pola nie może być pusta.- Pomyślne wołanie webhooka zwraca status 204, z pustą treścią.
- Discord ogranicza rozmiary. Tytuły są krótkie (256 znaków), opisy są długie, ale ograniczone (4096), i wiadomość zawiera ograniczoną liczbę pól i embeds. Otnij długi tekst przed wysłaniem.
Przykładowe wołanie, dla gracza, który wysłał pieniądze:
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 },
})Tylko po stronie serwera, nigdy z klienta
Ostrzeżenie: nie wołaj
PerformHttpRequestdla webhooka w skrypcie klienta i nie wysyłaj URL do klienta. Pliki klienta mogą być przeczytane przez każdego gracza, więc URL przecieka i każdy może zalać twój kanał.
Jeśli zdarzenie na kliencie powinno być zalogowane, wyślij zdarzenie do serwera, i pozwól serwerowi zdecydować co zalogować z danych, którym ufa. Klient, który może wyzwolić "zaloguj ten tekst" może też wyzwolić fałszywe logi. Dla bezpieczeństwa zdarzeń w ogóle, przeczytaj secure events in FiveM. Loguj to, co serwer zrobił, nie to, co klient mówi, że zrobił.
Limity tempa: używaj kolejki
Discord odrzuca wołania webhooka, które przychodzą zbyt szybko, z odpowiedzią 429. Seria logów, takie jak 50 graczy wyzwalających to samo zdarzenie, może go trafić. Wyślij wiadomości z kolejki ze stałym tempem:
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)Czekanie dwie sekundy między wiadomościami zostaje poniżej limitu. Jeśli potrzebujesz więcej, grupuj kilka embeds w jedną wiadomość: jedno żądanie może zawierać do 10 embeds na jego liście embeds. Dla używania Wait, zobacz Wait explained.
Co logować
Loguj zdarzenia, które chciałbyś mieć, gdy coś się psuje:
- Pieniądze: duże transfery, zakupy, wszystko co tworzy pieniądze. To jest gdzie nadużycie pokazuje się pierwsze.
- Akcje administratora: kto użył którego polecenia na kim, bany, ostrzeżenia, teleportacje. Zobacz ban and warn players.
- Przyłączenia i odejścia, z identyfikatorami gracza, co pomaga w sporach i banach.
- Spawning przedmiotów i używanie broni, jeśli pozwolisz.
Nie loguj wszystkiego. Kanał z wiadomością co sekundę to kanał, który nikt nie czyta. Wybierz kilka kanałów, włóż ważne tam, gdzie personel patrzy, i trzymaj resztę krótką. Trzymaj osobiste dane do czego potrzebujesz, i nie loguj prywatny czat.
Wskazówka: włóż funkcję logowania w mały zasób i wołaj ją z exportu ze swoich innych skryptów, więc URL webhooka i kolejka limitów tempa żyją w jednym miejscu. Zobacz exports in FiveM.
Lista kontrolna
| Symptom | Naprawa |
|---|---|
| Nic nie przybywa | Sprawdzić nazwę convar, że URL jest kompletny i że wołanie działa na serwerze |
| Status 400 | JSON jest nieprawidłowy: pusta wartość pola, zbyt długi tekst, lub ciąg kolorów hex |
| Status 429 | Wyślij przez kolejkę z przerwą między wiadomościami |
| Timestamp ignorowany | Użyj UTC ISO 8601: os.date('!%Y-%m-%dT%H:%M:%SZ') |
| URL przeciekł | Usuń webhook w Discord, utwórz nowy i trzymaj go w set convar |
| Zbyt wiele wiadomości | Loguj tylko pieniądze, akcje administratora i przyłączenia |
Szybkie odpowiedzi
Czy mogę wysłać webhook Discord z klienta?
Nie. Każdy może przeczytać kod klienta i ukraść URL webhooka, potem zalać twój kanał. Wyzwól log na serwerze i wyślij go stamtąd.
Ile wiadomości webhook mogę wysłać?
Discord limituje webhooki i mniej więcej 30 wiadomości na minutę na webhook to bezpieczny pułap. Poza tym otrzymujesz odpowiedź 429, więc ustawiaj wiadomości w kolejce i wyślij je ze stałym tempem.
Gdzie powinienem trzymać URL webhooka?
W convar serwera ustawionym z set w server.cfg, przeczytany z GetConvar. Nigdy nie włóż go w plik klienta lub w convar ustawiony z setr lub sets.
Skrypty bez tego problemu
Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →
Crypto MiningKup magazyn, składaj koparki część po części i kop monety na żywym rynku.Zobacz skrypt →
Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →