🔌 Chapitre 4 · L’API TeamKit : ton serveur où tu veux

Dans ton bot Discord et tes scripts

Mis à jour le 09/10/2026 ·

Si ta communauté a son propre bot Discord, il peut afficher l'état de ton serveur ou le classement des votes avec l'API. Ce chapitre donne une commande pour un bot en JavaScript (discord.js) et un petit script Python, à adapter.

Tu n'as pas de bot ? Pas besoin d'en écrire un : TeamKit · Sync affiche déjà l'état de ton serveur, ses alertes et une carte de vote sur ton Discord, sans une ligne de code (Mon espace → Sync).


1. Une commande /serveur pour un bot discord.js #

Pour un bot en discord.js 14 et Node.js 18 ou plus récent (fetch est déjà dedans).

const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');

const SLUG = 'tk-eco-172';   // ← le slug de ton serveur
const ETATS = { en_ligne: '✅ En ligne', demarre: '⏳ Démarre', arrete: '⛔ Arrêté' };
let memo = { quand: 0, serveur: null };   // la réponse est gardée 60 secondes

async function lireServeur() {
  if (memo.serveur && Date.now() - memo.quand < 60000) return memo.serveur;
  const r = await fetch(`https://www.teamkit.fr/api/v1/serveurs/${SLUG}`);
  if (!r.ok) throw new Error(`API TeamKit : ${r.status}`);
  memo = { quand: Date.now(), serveur: await r.json() };
  return memo.serveur;
}

module.exports = {
  data: new SlashCommandBuilder().setName('serveur').setDescription('L’état de notre serveur, en direct'),
  async execute(interaction) {
    try {
      const s = await lireServeur();
      const carte = new EmbedBuilder()
        .setTitle(s.nom)
        .setURL(s.liens.page)
        .setDescription(`${ETATS[s.etat] || s.etat} · **${s.joueurs} / ${s.places}** joueurs`)
        .addFields(
          { name: 'Adresse', value: s.adresse || 'sur la page TeamKit', inline: true },
          { name: 'Votes cette semaine', value: String(s.votes.semaine), inline: true },
        )
        .setImage(`${s.liens.banniere}?v=${Math.floor(Date.now() / 300000)}`)
        .setFooter({ text: 'Données : teamkit.fr' });
      await interaction.reply({ embeds: [carte] });
    } catch (e) {
      await interaction.reply({ content: 'Le serveur est momentanément injoignable, réessaie dans une minute.', ephemeral: true });
    }
  },
};

Deux détails :

  • la réponse est gardée 60 secondes : si dix personnes tapent /serveur en même temps, l'API n'est appelée qu'une fois ;
  • le ?v= au bout de la bannière change toutes les 5 minutes : Discord garde les images en mémoire, ce petit ajout l'oblige à reprendre la bannière à jour.

✅ À retenir Garde toujours la réponse un moment dans ton bot. C'est plus rapide pour tes membres, et tu restes loin de la limite des 60 appels par minute.


2. Le classement de la semaine en Python #

Pour un script lancé à la main ou par une tâche planifiée. Il n'utilise que la bibliothèque de Python (rien à installer).

import json
import urllib.request

ADRESSE = "https://www.teamkit.fr/api/v1/classements/serveurs?periode=semaine&limite=10"

requete = urllib.request.Request(ADRESSE, headers={"User-Agent": "mon-script/1.0"})
with urllib.request.urlopen(requete, timeout=10) as reponse:
    classement = json.load(reponse)

print("Les serveurs TeamKit les plus votés cette semaine :")
for s in classement["serveurs"]:
    print(f'{s["rang"]:>2}. {s["nom"]} ({s["jeu"]}) : {s["votes"]} vote(s)')

Pour envoyer ce texte sur ton Discord sans bot, un webhook de salon suffit : Paramètres du salon → Intégrations → Webhooks → Nouveau webhook → Copier l'URL. Puis :

WEBHOOK = "https://discord.com/api/webhooks/..."   # ← ton webhook, à garder pour toi

lignes = [f'{s["rang"]}. {s["nom"]} : {s["votes"]} vote(s)' for s in classement["serveurs"]]
# allowed_mentions vide : un nom de serveur qui contiendrait « @everyone » ne fera sonner personne
corps = json.dumps({
    "content": "🏆 **Classement TeamKit de la semaine**\n" + "\n".join(lignes),
    "allowed_mentions": {"parse": []},
}).encode("utf-8")
envoi = urllib.request.Request(WEBHOOK, data=corps, headers={"Content-Type": "application/json", "User-Agent": "mon-script/1.0"})
urllib.request.urlopen(envoi, timeout=10)

✅ À retenir L'adresse d'un webhook Discord est un secret : quiconque la connaît peut écrire dans ton salon. Ne la mets jamais dans une page web ni dans un dépôt public.


3. Les bonnes pratiques #

À faire À éviter
garder chaque réponse au moins 30 à 60 secondes appeler l'API à chaque message ou chaque seconde
afficher un message clair si l'API ne répond pas laisser le bot planter sur une erreur
citer TeamKit avec un lien présenter les chiffres comme venant d'ailleurs
mettre https://www. devant teamkit.fr oublier le www (redirection que certains programmes ne suivent pas)

✔️ Checklist #

❓ Si ça ne marche pas #

  • fetch is not defined : ta version de Node.js est trop ancienne. Passe à Node.js 18 ou plus.
  • HTTP Error 429 : ton script appelle trop souvent. Espace les appels.
  • Le bot dit « injoignable » alors que le site marche : affiche l'erreur dans ta console (console.error(e) dans le catch) pour voir le code renvoyé.

Une étape qui coince ? Ouvre un ticket sur le site ou demande sur le Discord TeamKit. Le bot Guide connaît ces pages.