Outil pour extraire les logs de replays et jouer des parties via l'API CodinGame.
- .NET 10 SDK
- Un compte CodinGame
- Package NuGet : CommandLineParser
Les deux variables suivantes doivent être définies avant de lancer l'outil :
| Variable | Description | Utilisé par |
|---|---|---|
CODINGAME_COOKIE |
Cookie d'authentification CodinGame | Extract + Play |
CODINGAME_SESSION |
testSessionHandle de la session de test |
Extract + Play |
# Pour la session PowerShell courante
$env:CODINGAME_COOKIE="rememberMe=VOTRE_VALEUR"
$env:CODINGAME_SESSION="votre_test_session_handle"# Persistant (toutes les sessions)
[System.Environment]::SetEnvironmentVariable("CODINGAME_COOKIE", "rememberMe=VOTRE_VALEUR", "User")
[System.Environment]::SetEnvironmentVariable("CODINGAME_SESSION", "votre_test_session_handle", "User")- DevTools (F12) → onglet Network
- Cliquer sur n'importe quelle requête vers
codingame.com - Dans Headers, copier la valeur du header
Cookie
Le cookie ressemble à :
intercom-id-xxx=...; rememberMe=...; cgSession=...; AWSALB=...; AWSALBCORS=...
Vous pouvez utiliser le cookie complet ou juste rememberMe=VOTRE_VALEUR.
- Ouvrir le challenge sur CodinGame (ex:
https://www.codingame.com/ide/challenge/...) - Lancer un batch de parties (test session)
- Ouvrir les DevTools (F12) → onglet Network
- Chercher l'appel à
findLastBattlesByTestSessionHandle - Copier le premier paramètre du body (c'est le
testSessionHandle)
L'outil utilise CommandLineParser avec 2 verbes :
dotnet run --project CodinGameExtractor -- extract [options]
dotnet run --project CodinGameExtractor -- play <codeFile> [options]
dotnet run --project CodinGameExtractor -- --help
Extrait les logs de toutes les parties d'une test session existante (arena battles).
# Lancement simple
dotnet run --project CodinGameExtractor -- extract
# Avec options
dotnet run --project CodinGameExtractor -- extract -o ./mes_logs -c 10 --user 1234567| Option | Court | Défaut | Description |
|---|---|---|---|
--user <id> |
-u |
0 (auto-détecté) |
Votre userId CodinGame |
--output <dir> |
-o |
./codingame_logs |
Dossier de sortie |
--concurrency <n> |
-c |
5 |
Nombre de requêtes parallèles max |
Le programme tente de détecter votre userId dans l'ordre suivant :
- Via l'API ranking (si disponible)
- Via l'API session (
CodinGamer/getMyProperties) avec le cookie - Extraction depuis le cookie
rememberMe
codingame_logs/
summary.md
win/
0001-0100/
WIN_0042_Boriza_seed=373368691909388100_gameId=876334184.txt
0101-0200/
WIN_0150_SomeBot_seed=...txt
loss/
0001-0100/
LOSS_0023_TopPlayer_seed=...txt
timeout/
0001-0100/
TIMEOUT_0015_FastBot_seed=...txt
Lance X parties contre le boss ou un joueur spécifique via l'API CodinGame, en utilisant votre code source local.
# Jouer 10 parties contre le boss (langage auto-détecté via l'extension)
dotnet run --project CodinGameExtractor -- play mon_bot.cs -n 10
# Jouer 5 parties contre un joueur spécifique
dotnet run --project CodinGameExtractor -- play mon_bot.cs -n 5 --player 1234567
# Avec un seed manuel
dotnet run --project CodinGameExtractor -- play mon_bot.cs -n 1 --seed 42
# Code Python (langage auto-détecté → Python3)
dotnet run --project CodinGameExtractor -- play mon_bot.py -n 20 --boss
# Forcer un langage spécifique
dotnet run --project CodinGameExtractor -- play mon_bot.cs --lang Java| Argument / Option | Court | Défaut | Description |
|---|---|---|---|
<codeFile> |
(obligatoire) | Chemin vers le fichier source de votre bot | |
--games <n> |
-n |
10 |
Nombre de parties à jouer |
--boss |
(défaut) | Jouer contre le boss | |
--player <id> |
— | Jouer contre un joueur spécifique (userId) | |
--seed <seed> |
-s |
(auto) | Seed manuel (sinon généré automatiquement) |
--output <dir> |
-o |
./codingame_play_logs |
Dossier de sortie |
--lang <id> |
-l |
(auto-détecté) | Identifiant du langage de programmation |
Le langage est automatiquement déterminé via l'extension du fichier de code :
| Extension | Langage |
|---|---|
.cs |
C# |
.java |
Java |
.py |
Python3 |
.js |
Javascript |
.ts |
Typescript |
.cpp, .cc, .cxx |
C++ |
.c |
C |
.rs |
Rust |
.go |
Go |
.rb |
Ruby |
.kt, .kts |
Kotlin |
.scala |
Scala |
.swift |
Swift |
.php |
PHP |
.hs |
Haskell |
.d |
D |
.dart |
Dart |
.lua |
Lua |
.bash, .sh |
Bash |
.fs |
F# |
.vb |
VB.NET |
.groovy |
Groovy |
.pas |
Pascal |
.m |
Objective-C |
.pl |
Perl |
L'option --lang permet de forcer un langage si l'auto-détection ne convient pas.
Les résultats sont organisés par win/loss dans le dossier de sortie, avec un summary.md récapitulatif.
Format : {RESULT}_{RANK}_{PSEUDO}_seed={SEED}_gameId={ID}.txt
- RESULT :
WIN,LOSSouTIMEOUT(vrai timeout referee) - RANK : rank adverse sur 4 chiffres
- PSEUDO : pseudo de l'adversaire
GAME_ID: 876622856
REPLAY: https://www.codingame.com/replay/876622856
SEED: 956876924376484500
SCORES: 9, 11
SCORE_DIFF: -2
TURNS: 200
RANKS: 1, 0
AGENT_0: QzL (score=21,04, rank=132, valid=True)
AGENT_1: Boriza (score=27,31, rank=12, valid=True)
FALLBACK_TIMEOUTS: 3
SCORE_DIFF: différence de score (positif = avantage, négatif = défaite)TURNS: nombre de tours jouésFALLBACK_TIMEOUTS: nombre de fois où votre bot a détecté un manque de temps et donné une réponse rapide (affiché uniquement si > 0)
Fichier Markdown généré à la racine avec :
- Statistiques globales : games, wins, losses, winrate, timeouts, fallback TOs
- Winrate par tranche de rank : tableau W/L/TO/winrate par bucket (0001-0100, 0101-0200, etc.)
- Tableau des losses : rank, adversaire, score diff, tours, fallbacks, lien replay
- Tableau des wins : idem
- TIMEOUT (dossier
loss/timeout/) : vrai timeout détecté par le referee CodinGame (has not provided) - FALLBACK_TIMEOUTS : votre bot a détecté un manque de temps et a donné une réponse rapide pour éviter un vrai timeout (ex:
Bot 2: TIMEOUT Defend -> Left 1msdans stderr)
- Le contenu du dossier est nettoyé à chaque exécution
- Les fichiers sont triés par rank adverse
- Chaque fichier contient : en-tête, puis le détail de chaque turn (stderr, stdout, summary)