⚽ 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.
// 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))
await —
sans lui, vous recevez une promesse au lieu des matchs.
erreur. Testez toujours erreur et
la longueur de matchs avant d'afficher.
2. Les jours disponibles
| Écriture | Ce 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.
3. Choisir une ligue, un pays, une équipe, une page
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
| Option | Effet |
|---|---|
ligue | une seule ligue, par son numéro (voir Bs.foot.ligues()) ou un morceau de son nom |
pays | les ligues d'un pays, nom en anglais ("spain", "ivory") |
equipe | les matchs d'une équipe, par un morceau de son nom |
etat | "live", "finished" ou "future" |
limite | nombre de matchs par page : 20 par défaut, 50 au maximum |
page | numéro de la page |
tout | toutes les ligues, même les petites |
4. Ce que vous recevez
| Champ | Contenu |
|---|---|
matchs | la liste des matchs de la page |
total | nombre de matchs qui répondent à votre demande |
total_jour | nombre de matchs du jour, petites ligues comprises |
page, pages, limite | où vous en êtes dans les pages |
ancien | vrai si les données sont de secours, vieilles de quelques minutes |
erreur | la 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" }
}
statut | Sens |
|---|---|
NS | pas encore commencé |
1H · HT · 2H | première mi-temps · mi-temps · seconde mi-temps |
ET · P | prolongation · tirs au but en cours |
FT · AET · PEN | terminé · après prolongation · aux tirs au but |
PST · CANC | reporté · 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.
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 plus | Contenu |
|---|---|
stade | nom, ville |
buts | liste de minute, joueur, equipe, passeur, genre |
cartons | liste de minute, joueur, equipe, genre |
possession | domicile, exterieur (en pourcentage) |
confrontations | anciens 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 »
// 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
confrontations, et présentez-le comme tel.
- Fraîcheur : le direct est mis à jour chaque minute, les matchs du jour toutes les cinq minutes. Inutile d'appeler Bs.foot en boucle.
- Longueur des messages : Telegram limite un message à 4 096 caractères. Affichez 10 à 20 matchs par message et proposez un bouton « Suivant ».
- Diffusion quotidienne : appelez Bs.foot une fois, dans la commande programmée, puis envoyez le même texte à tous.
- Disponibilité : Bs.foot est ouvert à tous les comptes.