⚽ Bs.foot — matchs de football

Affichez dans votre bot les matchs d'hier, d'aujourd'hui, en direct et de demain — équipes, scores, minute de jeu, buts — sans chercher de source ni rien installer. Bs.foot donne les faits du match, pas de pronostic.

1. En une commande

Bs.foot est disponible dans toutes vos commandes, en JavaScript comme en Python. Aucune bibliothèque à installer, aucune clé à fournir.

JavaScript
Python
// Commande : /matchs
const r = await Bs.foot.jour("aujourdhui");

if (r.erreur) return Bot.sendMessage("⚽ Les matchs arrivent, réessayez dans un instant.");
if (!r.matchs.length) return Bot.sendMessage("Aucun grand match aujourd'hui.");

const lignes = r.matchs.map(m =>
  m.domicile.nom + " " + (m.score.domicile ?? "-") + " : " +
  (m.score.exterieur ?? "-") + " " + m.exterieur.nom
);
Bot.sendMessage("⚽ Matchs du jour\n\n" + lignes.join("\n"));
# Commande : /matchs
r = Bs.foot.jour("aujourdhui")

if r.get("erreur"):
    Bot.sendMessage("⚽ Les matchs arrivent, réessayez dans un instant.")
elif not r["matchs"]:
    Bot.sendMessage("Aucun grand match aujourd'hui.")
else:
    lignes = []
    for m in r["matchs"]:
        s = m["score"]
        lignes.append("%s %s : %s %s" % (
            m["domicile"]["nom"],
            "-" if s["domicile"] is None else s["domicile"],
            "-" if s["exterieur"] is None else s["exterieur"],
            m["exterieur"]["nom"]))
    Bot.sendMessage("⚽ Matchs du jour\n\n" + "\n".join(lignes))
⚠️ En JavaScript, n'oubliez pas await — sans lui, vous recevez une promesse au lieu des matchs.
Bs.foot ne plante jamais votre commande. Si les matchs ne sont pas disponibles, la liste revient vide et la raison est dans erreur. Testez toujours erreur et la longueur de matchs avant d'afficher.

2. Les jours disponibles

ÉcritureCe que vous recevez
Bs.foot.jour("avant_hier")les matchs d'avant-hier
Bs.foot.jour("hier")les matchs d'hier
Bs.foot.jour("aujourdhui")tous ceux d'aujourd'hui : joués, en cours, à venir
Bs.foot.direct()seulement ceux qui se jouent en ce moment
Bs.foot.jour("demain")les matchs de demain
Bs.foot.jour("apres_demain")les matchs d'après-demain

Raccourcis : Bs.foot.aujourdhui(), Bs.foot.hier(), Bs.foot.demain(). Aucune autre date n'est disponible.

Les grandes ligues d'abord. Une journée compte 200 à 1 500 matchs dans le monde. Sans option, Bs.foot ne renvoie que les grandes compétitions (Coupe du monde, CAN, Ligue des champions, Premier League, Liga, Serie A, Bundesliga, Ligue 1, championnats africains…), 20 matchs au plus.

3. Choisir une ligue, un pays, une équipe, une page

JavaScript
Python
const a = await Bs.foot.jour("hier", { ligue: 39 });          // une ligue, par son numéro
const b = await Bs.foot.jour("demain", { pays: "france" });    // un pays
const c = await Bs.foot.jour("aujourdhui", { equipe: "real" });// une équipe
const d = await Bs.foot.jour("aujourdhui", { etat: "live" });  // "live", "finished", "future"
const e = await Bs.foot.jour("hier", { limite: 10, page: 2 }); // la page suivante
const f = await Bs.foot.jour("hier", { tout: true });          // toutes les ligues
a = Bs.foot.jour("hier", ligue=39)              # une ligue, par son numéro
b = Bs.foot.jour("demain", pays="france")       # un pays
c = Bs.foot.jour("aujourdhui", equipe="real")   # une équipe
d = Bs.foot.jour("aujourdhui", etat="live")     # "live", "finished", "future"
e = Bs.foot.jour("hier", limite=10, page=2)     # la page suivante
f = Bs.foot.jour("hier", tout=True)             # toutes les ligues
OptionEffet
ligueune seule ligue, par son numéro (voir Bs.foot.ligues()) ou un morceau de son nom
paysles ligues d'un pays, nom en anglais ("spain", "ivory")
equipeles matchs d'une équipe, par un morceau de son nom
etat"live", "finished" ou "future"
limitenombre de matchs par page : 20 par défaut, 50 au maximum
pagenuméro de la page
touttoutes les ligues, même les petites

4. Ce que vous recevez

ChampContenu
matchsla liste des matchs de la page
totalnombre de matchs qui répondent à votre demande
total_journombre de matchs du jour, petites ligues comprises
page, pages, limiteoù vous en êtes dans les pages
ancienvrai si les données sont de secours, vieilles de quelques minutes
erreurla raison, seulement en cas de problème

Chaque match a cette forme :

{
  id: 1557420,                             // à passer à Bs.foot.match(id)
  coup_envoi: "2026-10-12T19:00:00+00:00", // heure UTC (GMT+0)
  etat: "finished",                        // "live" · "finished" · "future"
  statut: "FT",                            // code court (voir le tableau)
  statut_long: "Match Finished",
  minute: 90,                              // vide avant le coup d'envoi
  domicile:  { id: 1346, nom: "Coventry",  logo: "https://…png" },
  exterieur: { id: 34,   nom: "Newcastle", logo: "https://…png" },
  score: { domicile: 4, exterieur: 1,      // vide tant que le match n'a pas commencé
           tab_domicile: null, tab_exterieur: null },   // tirs au but
  ligue: { id: 39, nom: "Premier League", pays: "England",
           tour: "Regular Season - 6", logo: "https://…png" }
}
statutSens
NSpas encore commencé
1H · HT · 2Hpremière mi-temps · mi-temps · seconde mi-temps
ET · Pprolongation · tirs au but en cours
FT · AET · PENterminé · après prolongation · aux tirs au but
PST · CANCreporté · annulé
⚠️ coup_envoi est en heure UTC (GMT+0). Ajoutez le décalage de votre pays avant d'afficher une heure : Côte d'Ivoire et Sénégal +0, Bénin, Nigeria et Cameroun +1.

5. Le détail d'un match

Bs.foot.match(id) renvoie le match avec, en plus, son stade, ses buts, ses cartons, la possession et les anciennes confrontations entre les deux équipes. Il renvoie une valeur vide si le match est introuvable.

JavaScript
Python
const m = await Bs.foot.match(1557420);
if (!m) return Bot.sendMessage("Match introuvable.");

const buts = m.buts.map(b => b.minute + "' " + b.joueur + " (" + b.equipe + ")");
Bot.sendMessage(
  m.domicile.nom + " " + m.score.domicile + " - " + m.score.exterieur + " " + m.exterieur.nom +
  "\n🏟 " + m.stade.nom +
  "\n\n⚽ Buts\n" + (buts.join("\n") || "Aucun")
);
m = Bs.foot.match(1557420)
if not m:
    Bot.sendMessage("Match introuvable.")
else:
    buts = ["%s' %s (%s)" % (b["minute"], b["joueur"], b["equipe"]) for b in m["buts"]]
    Bot.sendMessage(
        "%s %s - %s %s\n🏟 %s\n\n⚽ Buts\n%s" % (
            m["domicile"]["nom"], m["score"]["domicile"], m["score"]["exterieur"],
            m["exterieur"]["nom"], m["stade"]["nom"], "\n".join(buts) or "Aucun"))
Champ en plusContenu
stadenom, ville
butsliste de minute, joueur, equipe, passeur, genre
cartonsliste de minute, joueur, equipe, genre
possessiondomicile, exterieur (en pourcentage)
confrontationsanciens matchs entre les deux équipes, même forme qu'un match

6. La liste des ligues

Bs.foot.ligues() renvoie plus de 500 ligues sous la forme id, nom, pays, logo, populaire, les grandes d'abord. Avec l'option populaires, vous ne recevez que les grandes : c'est la bonne liste pour un menu de boutons. L'option pays filtre un pays.

7. Exemple complet : matchs du jour avec « Suivant »

JavaScript
Python
// Commande : /matchs — « /matchs 2 » ouvre la page 2
const page = parseInt(params, 10) || 1;
const r = await Bs.foot.jour("aujourdhui", { limite: 10, page: page });
if (r.erreur) return Bot.sendMessage("⚽ Les matchs arrivent, réessayez dans un instant.");
if (!r.matchs.length) return Bot.sendMessage("Aucun grand match aujourd'hui.");

const lignes = r.matchs.map(m => {
  const heure = m.coup_envoi.slice(11, 16) + " GMT";
  if (m.etat === "future") return "🕒 " + heure + " — " + m.domicile.nom + " vs " + m.exterieur.nom;
  const debut = m.etat === "live" ? "🔴 " + m.minute + "' " : "✅ ";
  return debut + m.domicile.nom + " " + m.score.domicile + "-" + m.score.exterieur + " " + m.exterieur.nom;
});

const boutons = [];
if (page > 1) boutons.push({ text: "◀️ Précédent", command: "/matchs " + (page - 1) });
if (page < r.pages) boutons.push({ text: "Suivant ▶️", command: "/matchs " + (page + 1) });

Bot.sendRichMessage([
  { h2: "⚽ Matchs du jour" },
  { list: lignes },
  "Page " + page + " sur " + r.pages + " — " + r.total + " matchs",
  ...(boutons.length ? [{ buttons: boutons, align: "center" }] : []),
]);
# Commande : /matchs — « /matchs 2 » ouvre la page 2
page = int(params) if str(params or "").strip().isdigit() else 1
r = Bs.foot.jour("aujourdhui", limite=10, page=page)
if r.get("erreur"):
    Bot.sendMessage("⚽ Les matchs arrivent, réessayez dans un instant.")
elif not r["matchs"]:
    Bot.sendMessage("Aucun grand match aujourd'hui.")
else:
    lignes = []
    for m in r["matchs"]:
        heure = m["coup_envoi"][11:16] + " GMT"
        if m["etat"] == "future":
            lignes.append("🕒 %s — %s vs %s" % (heure, m["domicile"]["nom"], m["exterieur"]["nom"]))
        else:
            debut = ("🔴 %s' " % m["minute"]) if m["etat"] == "live" else "✅ "
            lignes.append("%s%s %s-%s %s" % (
                debut, m["domicile"]["nom"], m["score"]["domicile"],
                m["score"]["exterieur"], m["exterieur"]["nom"]))
    boutons = []
    if page > 1:
        boutons.append({"text": "◀️ Précédent", "command": "/matchs %d" % (page - 1)})
    if page < r["pages"]:
        boutons.append({"text": "Suivant ▶️", "command": "/matchs %d" % (page + 1)})
    blocs = [{"h2": "⚽ Matchs du jour"}, {"list": lignes},
             "Page %d sur %d — %d matchs" % (page, r["pages"], r["total"])]
    if boutons:
        blocs.append({"buttons": boutons, "align": "center"})
    Bot.sendRichMessage(blocs)

8. Ce qu'il faut savoir

Aucun pronostic, aucune cote. Bs.foot donne les matchs, les scores et les buts. Si votre bot propose des pronostics, ce sont les vôtres : écrivez votre propre calcul, par exemple à partir des confrontations, et présentez-le comme tel.