Screenshots hochladen
Screenshots von Spielern mit screenshot-basic serverseitig zu den Medien in TeamPanel hochladen und per License taggen.
Screenshots hochladen (FiveM)
Dein FiveM-Server kann Screenshots von Spielern direkt zu den Medien deines Teams hochladen – z. B. bei Reports, Anti-Cheat-Treffern oder Support-Fällen. Über den Tag license:… findest du später alle Screenshots eines Spielers.
Voraussetzungen
- screenshot-basic auf dem Server installiert und gestartet
- Deine Team-ID (Medien → Tab API & Integrationen)
- Ein API-Schlüssel – am besten ein eigener mit dem Scope
media:upload, verknüpft mit einem Mitglied, das Medien hochladen darf
API-Schlüssel in der server.cfg hinterlegen
set teampanel_api_key "TP_dein_schluessel"Nie setr verwenden
setr repliziert die Variable an alle Clients – jeder Spieler könnte den Schlüssel auslesen.
Verwende immer set, damit der Schlüssel auf dem Server bleibt.
Upload-Funktion einbauen (Server-Skript)
Der Server lässt den Client einen Screenshot aufnehmen (requestClientScreenshot) und lädt ihn selbst per JSON-Upload hoch. So gelangt der Schlüssel nie zum Spieler.
-- server.lua
-- server.cfg: set teampanel_api_key "TP_…"
local TEAM_ID = '<teamId>'
local function uploadScreenshot(playerId)
exports['screenshot-basic']:requestClientScreenshot(playerId, { encoding = 'jpg', quality = 0.85 }, function(err, dataUrl)
if err then return print('Screenshot failed: ' .. tostring(err)) end
local tags = { 'type:screenshot' }
local license = GetPlayerIdentifierByType(playerId, 'license') -- z. B. "license:abc123…"
if license then table.insert(tags, license) end
PerformHttpRequest(('https://api.team-panel.com/v1/cdn/media/%s/upload'):format(TEAM_ID), function(status, body)
if status ~= 201 then return print(('Upload failed (%s): %s'):format(status, body)) end
print(json.decode(body).publicUrl)
end, 'POST', json.encode({
file = dataUrl,
fileName = ('screenshot-%s-%s.jpg'):format(playerId, os.time()),
folder = 'screenshots',
tags = tags,
}), {
['Content-Type'] = 'application/json',
['Authorization'] = 'Bearer ' .. GetConvar('teampanel_api_key', ''),
})
end)
end
-- Beispiel: /screenshot <playerId> (nur mit ACE-Recht nutzbar)
RegisterCommand('screenshot', function(_, args)
local target = tonumber(args[1])
if target and GetPlayerName(target) then uploadScreenshot(target) end
end, true)Ergebnis prüfen
Nach dem Upload liegt der Screenshot unter Medien im Ordner screenshots (wird beim ersten Upload automatisch angelegt). Filtere nach license:…, um alle Screenshots eines Spielers zu sehen.
Tipps
- Aufräumen: Setze am Ordner
screenshotseine Ordner-Regel, z. B. automatisch nach 30 Tagen löschen – so bleibt dein Speicher im Plan-Limit. - Privat speichern: Beweisbilder mit
public = falsehochladen oder den Ordner auf Standard-Sichtbarkeit privat stellen. Dann gibt es keinen öffentlichen CDN-Link. - Weitere Tags: z. B.
type:report,discord:<id>odersteam:<hex>– maximal 20 pro Datei, siehe Tags. - Benachrichtigen: Mit dem Automatisierungs-Event Medien hochgeladen postest du neue Screenshots z. B. in einen Discord-Kanal.
Kein Client-Upload mit Schlüssel
requestScreenshotUpload ist ein Client-Export: Der Schlüssel würde vom Spiel-Client gesendet
und wäre für Spieler sichtbar. Nutze für Uploads mit Team-API-Schlüssel immer den serverseitigen
Weg oben.
Handy-Skripte, andere Games & Tools
Die Medien-API funktioniert mit jedem HTTP-Client – z. B. für Kamera-Apps in Handy-Skripten (serverseitig weiterleiten), Minecraft- oder Hytale-Plugins, Discord-Bots oder Launcher. Beispiele mit curl und Node.js sowie alle Parameter findest du unter Medien-API.
Geplant: Uploads mit TeamPanelFX
Coming soon: TeamPanelFX bekommt eingebaute Exports für Uploads – ohne eigenen HTTP-Code. Die Schnittstelle ist noch nicht final und kann sich ändern, z. B.:
exports.teampanelfx:uploadScreenshot(playerId, { folder = 'screenshots', tags = { 'type:report' } })