☰
🌙
Introduction
Installation
Mode Manuel
Mode Automatique
Récupérer
Propriétés
Sécurité
Exemples
Récapitulatif

🌍 LocalInfo-Get — Détection de Localisation

Détectez le pays et l'heure locale de vos utilisateurs — manuellement ou automatiquement via un lien sécurisé

Introduction

LocalInfo-Get permet de détecter le pays et l'heure locale d'un utilisateur de votre bot Telegram. Deux modes sont disponibles :

📋 Mode Manuel

Vous demandez directement à l'utilisateur son pays et/ou fuseau horaire, puis vous stockez ces informations avec Props.set(). Simple et sans lien externe.

🔗 Mode Automatique

Génère un lien unique et temporaire. Quand l'utilisateur clique, sa localisation est détectée automatiquement côté navigateur, puis envoyée de manière sécurisée à votre bot.

🌐 Alias anglais & formats

Les données sont disponibles en français (pays, heure, date) et en anglais (country, time, date). Formats multiples : 12h/24h, EU/US/ISO.

ℹ Quel mode choisir ?
• Mode Manuel — Vous gardez le contrôle total. Idéal si vous voulez gérer une liste de pays personnalisée ou si la détection automatique n'est pas nécessaire.
• Mode Automatique — Tout est géré automatiquement. Idéal pour une détection précise du fuseau horaire sans interaction de l'utilisateur.

Installation

Installez LocalInfo-Get depuis l'onglet Bibliothèques de votre bot dans l'application BotStrike.

📦 Étapes :
1. Ouvrez votre bot dans l'application BotStrike
2. Allez dans l'onglet Bibliothèques
3. Trouvez LocalInfo-Get et cliquez Installer
4. Utilisez l'objet Bs dans vos commandes
⚠️ Important : La bibliothèque doit être installée avant utilisation. Sans installation, tout appel à Bs lèvera une erreur.

📋 Mode Manuel

Dans le mode manuel, vous demandez à l'utilisateur de choisir son pays ou de fournir ses informations, puis vous les stockez avec Props.set().

ℹ Avantages du mode manuel :
• Aucun lien externe nécessaire
• Contrôle total sur les données collectées
• Liste de pays personnalisable
• Pas de dépendance aux APIs tierces

Étape 1 : Demander le pays à l'utilisateur

JavaScript
Python
// Commande /choisirPays — présente un menu de pays
Bot.sendMessage({
  text: "🌍 Veuillez choisir votre pays :",
  replyMarkup: {
    inlineKeyboard: [
      [{ text: "🇫🇷 France", callback_data: "pays_France" },
       { text: "🇩🇪 Allemagne", callback_data: "pays_Germany" }],
      [{ text: "🇪🇸 Espagne", callback_data: "pays_Spain" },
       { text: "🇷🇺 Russie", callback_data: "pays_Russia" }],
      [{ text: "🇺🇸 États-Unis", callback_data: "pays_United States" },
       { text: "🇬🇧 Royaume-Uni", callback_data: "pays_United Kingdom" }]
    ]
  }
});
# Commande /choisirPays — présente un menu de pays
Bot.sendMessage({
    "text": "🌍 Veuillez choisir votre pays :",
    "replyMarkup": {
        "inlineKeyboard": [
            [{"text": "🇫🇷 France", "callback_data": "pays_France"},
             {"text": "🇩🇪 Allemagne", "callback_data": "pays_Germany"}],
            [{"text": "🇪🇸 Espagne", "callback_data": "pays_Spain"},
             {"text": "🇷🇺 Russie", "callback_data": "pays_Russia"}],
            [{"text": "🇺🇸 États-Unis", "callback_data": "pays_United States"},
             {"text": "🇬🇧 Royaume-Uni", "callback_data": "pays_United Kingdom"}]
        ]
    }
})

Étape 2 : Stocker le choix avec Props.set()

JavaScript
Python
// Callback — quand l'utilisateur clique sur un pays
// Le callback_data est "pays_France", "pays_Germany", etc.
const country = message.replace("pays_", "");

// Stocker le pays de l'utilisateur
Props.set("user_country_" + user.id, country);

Bot.sendMessage("✅ Votre pays a été enregistré : " + country);
# Callback — quand l'utilisateur clique sur un pays
country = message.replace("pays_", "")

# Stocker le pays de l'utilisateur
Props.set("user_country_" + str(user["id"]), country)

Bot.sendMessage("✅ Votre pays a été enregistré : " + country)

Étape 3 : Utiliser les données stockées

JavaScript
Python
// Commande /monpays — afficher le pays enregistré
const country = Props.get("user_country_" + user.id);

if (country) {
  Bot.sendMessage("📍 Votre pays enregistré : " + country);
} else {
  Bot.sendMessage("❌ Pays non enregistré. Envoyez /choisirPays");
}
# Commande /monpays — afficher le pays enregistré
country = Props.get("user_country_" + str(user["id"]))

if country:
    Bot.sendMessage("📍 Votre pays enregistré : " + country)
else:
    Bot.sendMessage("❌ Pays non enregistré. Envoyez /choisirPays")
⚠️ Mode Manuel vs Automatique : En mode manuel, vous gérez tout vous-même avec Props.set() / Props.get(). Les méthodes Bs.localInfo() et Bs.localInfoUrl() ne sont utilisées qu'en mode automatique.

🔗 Mode Automatique — Générer un lien

Le mode automatique détecte le pays et l'heure via un lien unique. Utilisez Bs.localInfoUrl(userId, returnCommand) pour créer le lien.

Paramètres

ParamètreTypeDescription
userIdnumber/stringL'identifiant Telegram de l'utilisateur
returnCommandstringLa commande à déclencher après détection (ex: "/infoRecu")

Retour

Retourne l'URL du lien de détection (string), ou null si le rate limit est atteint.

JavaScript
Python
// Commande /detecter — envoie le lien de détection
const url = Bs.localInfoUrl(user.id, "/infoRecu");

if (url) {
  Bot.sendMessage({
    text: "🌍 Cliquez sur ce lien pour détecter votre localisation :",
    replyMarkup: {
      inlineKeyboard: [[
        { text: "🔍 Détecter ma localisation", url: url }
      ]]
    }
  });
} else {
  Bot.sendMessage("⏳ Trop de demandes. Réessayez dans une minute.");
}
# Commande /detecter — envoie le lien de détection
url = Bs.localInfoUrl(user["id"], "/infoRecu")

if url:
    Bot.sendMessage({
        "text": "🌍 Cliquez sur ce lien pour détecter votre localisation :",
        "replyMarkup": {
            "inlineKeyboard": [[
                {"text": "🔍 Détecter ma localisation", "url": url}
            ]]
        }
    })
else:
    Bot.sendMessage("⏳ Trop de demandes. Réessayez dans une minute.")
ℹ Comment ça marche ?
1. Votre bot envoie un lien unique à l'utilisateur
2. L'utilisateur clique → une page sécurisée détecte son fuseau horaire et pays
3. Les données sont sauvegardées et la commande de retour est déclenchée
4. Votre bot peut ensuite accéder aux infos avec Bs.localInfo()
⚠️ Rate limit : Maximum 4 liens par minute par utilisateur. Au-delà, localInfoUrl() retourne null.

Récupérer les informations

Après la détection automatique, utilisez Bs.localInfo(userId) pour accéder aux données.

Paramètres

ParamètreTypeDescription
userIdnumber/stringL'identifiant Telegram de l'utilisateur
optsobject (optionnel)Options : { timeUpdate: true } pour recalculer l'heure

Retour

Retourne un objet avec les propriétés suivantes, ou null si non détecté :

Supprimer le message de détection

Utilisez Bs.deleteDetectMessage(user.id) pour supprimer automatiquement le message contenant le bouton « Détecter ma localisation ». Appelée au début de votre commande de retour.

MéthodeDescription
Bs.deleteDetectMessage(user.id)JS — Supprime le message de détection
Bs.delete_detect_message(user["id"])Python — Alias snake_case
ℹ Note : user.id correspond à l'identifiant Telegram de l'utilisateur. Ce n'est pas une variable prédéfinie du API — utilisez directement user.id (JS) ou user["id"] (Python).
JavaScript
Python
// Commande /infoRecu — appelée automatiquement après détection

// Supprimer le message "Détecter ma localisation" (le bouton)
Bs.deleteDetectMessage(user.id);

const info = Bs.localInfo(user.id);

if (info) {
  // Propriétés en français
  Bot.sendMessage(
    "🌍 *Votre localisation*\n\n" +
    "📍 Pays: " + info.pays + "\n" +
    "🕐 Heure: " + info.heure + "\n" +
    "📅 Date: " + info.date
  );

  // OU propriétés en anglais (alias)
  Bot.sendMessage(
    "🌍 *Your location*\n\n" +
    "📍 Country: " + info.country + "\n" +
    "🕐 Time: " + info.time + "\n" +
    "📅 Date: " + info.date
  );
} else {
  Bot.sendMessage("❌ Localisation non encore détectée.");
}

// Avec timeUpdate pour l'heure en temps réel :
const infoLive = Bs.localInfo(user.id, { timeUpdate: true });
if (infoLive) {
  Bot.sendMessage(
    "🕐 Heure 24h: " + infoLive.time24 + "\n" +
    "🕐 Heure 12h: " + infoLive.time12 + "\n" +
    "📅 Date EU: " + infoLive.dateEU + "\n" +
    "📅 Date US: " + infoLive.dateUS + "\n" +
    "📅 Date ISO: " + infoLive.dateISO + "\n" +
    "🌐 Timezone: " + infoLive.timezone
  );
}
# Commande /infoRecu — appelée automatiquement après détection

# Supprimer le message "Détecter ma localisation" (le bouton)
Bs.delete_detect_message(user["id"])

info = Bs.localInfo(user["id"])

if info:
    # Propriétés en français
    Bot.sendMessage(
        "🌍 *Votre localisation*\n\n"
        "📍 Pays: " + info["pays"] + "\n"
        "🕐 Heure: " + info["heure"] + "\n"
        "📅 Date: " + info["date"]
    )

    # OU propriétés en anglais (alias)
    Bot.sendMessage(
        "🌍 *Your location*\n\n"
        "📍 Country: " + info["country"] + "\n"
        "🕐 Time: " + info["time"] + "\n"
        "📅 Date: " + info["date"]
    )
else:
    Bot.sendMessage("❌ Localisation non encore détectée.")

# Avec timeUpdate pour l'heure en temps réel :
info_live = Bs.localInfo(user["id"], {"timeUpdate": True})
if info_live:
    Bot.sendMessage(
        "🕐 Heure 24h: " + info_live["time24"] + "\n"
        "🕐 Heure 12h: " + info_live["time12"] + "\n"
        "📅 Date EU: " + info_live["dateEU"] + "\n"
        "📅 Date US: " + info_live["dateUS"] + "\n"
        "📅 Date ISO: " + info_live["dateISO"] + "\n"
        "🌐 Timezone: " + info_live["timezone"]
    )
ℹ timeUpdate: true
Sans cette option, l'heure retournée est celle du moment de la détection. Avec timeUpdate: true, l'heure est recalculée à partir du fuseau horaire stocké — vous obtenez l'heure actuelle de l'utilisateur.

Propriétés & Alias

Bs.localInfo() retourne un objet riche avec des propriétés en français, en anglais et sous différents formats :

Propriétés principales

Propriété FRAlias ENExempleDescription
payscountry"France"Nom du pays détecté
heuretime"14:30:25"Heure locale (format 24h)
datedate"13/04/2026"Date locale (DD/MM/YYYY)

Formats d'heure

PropriétéExempleDescription
time24"14:30:25"Format 24 heures
time12"2:30:25 PM"Format 12 heures avec AM/PM

Formats de date

PropriétéExempleDescription
dateEU"13/04/2026"Format européen (DD/MM/YYYY)
dateUS"04/13/2026"Format américain (MM/DD/YYYY)
dateISO"2026-04-13"Format ISO 8601 (YYYY-MM-DD)

Autres

PropriétéExempleDescription
timezone"Europe/Paris"Fuseau horaire IANA
JavaScript
Python
const info = Bs.localInfo(user.id, { timeUpdate: true });

// Français
info.pays     // "France"
info.heure    // "14:30:25"
info.date     // "13/04/2026"

// Anglais (alias identiques)
info.country  // "France"
info.time     // "14:30:25"

// Formats d'heure
info.time24   // "14:30:25"
info.time12   // "2:30:25 PM"

// Formats de date
info.dateEU   // "13/04/2026"
info.dateUS   // "04/13/2026"
info.dateISO  // "2026-04-13"

// Timezone
info.timezone // "Europe/Paris"
info = Bs.localInfo(user["id"], {"timeUpdate": True})

# Français
info["pays"]     # "France"
info["heure"]    # "14:30:25"
info["date"]     # "13/04/2026"

# Anglais (alias identiques)
info["country"]  # "France"
info["time"]     # "14:30:25"

# Formats d'heure
info["time24"]   # "14:30:25"
info["time12"]   # "2:30:25 PM"

# Formats de date
info["dateEU"]   # "13/04/2026"
info["dateUS"]   # "04/13/2026"
info["dateISO"]  # "2026-04-13"

# Timezone
info["timezone"] # "Europe/Paris"
✅ Conseil : Utilisez info.country / info["country"] si votre bot est en anglais, et info.pays / info["pays"] si votre bot est en français. Les deux contiennent exactement la même valeur.

Sécurité

LocalInfo-Get a été conçu avec la sécurité comme priorité.

🔐 Mécanismes de sécurité

MécanismeDescription
Lien à usage uniqueChaque lien ne peut être utilisé qu'une seule fois. Après utilisation, il est invalidé.
ExpirationLes liens expirent après 30 jours. Les tokens expirés sont automatiquement nettoyés.
Rate limiting4 liens par minute par utilisateur, 5 requêtes/minute sur l'endpoint de sauvegarde.
Token SHA-256Chaque token est un hash SHA-256 tronqué. Impossible à deviner.
Détection côté clientLes APIs de géolocalisation sont appelées depuis le navigateur de l'utilisateur. Le serveur ne voit jamais son IP.
Données minimalesSeuls le pays et le fuseau horaire sont collectés. Pas d'IP, pas de position GPS.
🚫 Ce qui n'est PAS collecté :
• Adresse IP de l'utilisateur
• Position GPS / coordonnées exactes
• Informations de l'appareil
• Données personnelles
⚠️ APIs de cascade : La détection utilise un système de cascade avec 4 APIs (ipapi.co, ipwho.is, freeipapi.com, ipbase.com). Si la première échoue, la suivante est essayée. Si toutes échouent, l'utilisateur est informé.

Exemples complets

Exemple 1 : Messages personnalisés par pays

JavaScript
Python
// Commande /bonjour — saluer selon le pays
const info = Bs.localInfo(user.id, { timeUpdate: true });

if (!info) {
  // Pas encore détecté → envoyer le lien
  const url = Bs.localInfoUrl(user.id, "/bonjour");
  if (url) {
    Bot.sendMessage({
      text: "👋 Pour vous saluer dans votre langue, j'ai besoin de connaître votre pays :",
      replyMarkup: {
        inlineKeyboard: [[ { text: "🌍 Détecter", url: url } ]]
      }
    });
  }
  return;
}

// Supprimer le message de détection si présent
Bs.deleteDetectMessage(user.id);

const greetings = {
  "France": "Bonjour",
  "Germany": "Guten Tag",
  "Spain": "Hola",
  "Russia": "Привет",
  "Japan": "こんにちは",
};
const greeting = greetings[info.country] || "Hello";
Bot.sendMessage(greeting + " ! 🌍\n\nIl est " + info.time12 + " chez vous (" + info.country + ").");
# Commande /bonjour — saluer selon le pays
info = Bs.localInfo(user["id"], {"timeUpdate": True})

if not info:
    url = Bs.localInfoUrl(user["id"], "/bonjour")
    if url:
        Bot.sendMessage({
            "text": "👋 Pour vous saluer dans votre langue, j'ai besoin de connaître votre pays :",
            "replyMarkup": {
                "inlineKeyboard": [[{"text": "🌍 Détecter", "url": url}]]
            }
        })
    return

# Supprimer le message de détection si présent
Bs.delete_detect_message(user["id"])

greetings = {
    "France": "Bonjour",
    "Germany": "Guten Tag",
    "Spain": "Hola",
    "Russia": "Привет",
    "Japan": "こんにちは",
}
greeting = greetings.get(info["country"], "Hello")
Bot.sendMessage(greeting + " ! 🌍\n\nIl est " + info["time12"] + " chez vous (" + info["country"] + ").")

Exemple 2 : Affichage multi-format

JavaScript
Python
// Commande /monheure — affiche l'heure dans tous les formats
const info = Bs.localInfo(user.id, { timeUpdate: true });

if (info) {
  Bot.sendMessage(
    "🌍 *" + info.country + "*\n\n" +
    "🕐 24h: " + info.time24 + "\n" +
    "🕐 12h: " + info.time12 + "\n\n" +
    "📅 EU: " + info.dateEU + "\n" +
    "📅 US: " + info.dateUS + "\n" +
    "📅 ISO: " + info.dateISO + "\n\n" +
    "🌐 Timezone: " + info.timezone
  );
} else {
  Bot.sendMessage("❌ Localisation non détectée. Envoyez /detecter d'abord.");
}
# Commande /monheure — affiche l'heure dans tous les formats
info = Bs.localInfo(user["id"], {"timeUpdate": True})

if info:
    Bot.sendMessage(
        "🌍 *" + info["country"] + "*\n\n"
        "🕐 24h: " + info["time24"] + "\n"
        "🕐 12h: " + info["time12"] + "\n\n"
        "📅 EU: " + info["dateEU"] + "\n"
        "📅 US: " + info["dateUS"] + "\n"
        "📅 ISO: " + info["dateISO"] + "\n\n"
        "🌐 Timezone: " + info["timezone"]
    )
else:
    Bot.sendMessage("❌ Localisation non détectée. Envoyez /detecter d'abord.")

Récapitulatif

Méthodes

MéthodeDescription
Bs.localInfoUrl(user.id, returnCommand)Génère un lien unique de détection. Retourne l'URL ou null si rate limit atteint.
Bs.localInfo(user.id)Retourne les infos de localisation ou null si non détecté.
Bs.localInfo(user.id, { timeUpdate: true })Idem mais recalcule l'heure en temps réel depuis le fuseau horaire.
Bs.deleteDetectMessage(user.id)Supprime automatiquement le message contenant le bouton de détection.

Propriétés retournées

PropriétéExemple
pays / country"France"
heure / time"14:30:25"
date"13/04/2026"
time24"14:30:25"
time12"2:30:25 PM"
dateEU"13/04/2026"
dateUS"04/13/2026"
dateISO"2026-04-13"
timezone"Europe/Paris"
✅ Python : Les méthodes en camelCase ont un alias en snake_case. localInfoUrl → local_info_url, localInfo → local_info, deleteDetectMessage → delete_detect_message.
⚠️ Limites :
• 4 liens par minute par utilisateur
• 5 requêtes/minute sur l'endpoint de sauvegarde
• Liens valides 30 jours maximum
• Usage unique par lien