Récupérer le solde d’un compte Binance en PowerShell

Binance API P2

Enfin la suite !

Après bientôt 2 mois d’attente (c’est long 😢) je me décide enfin à vous partager la suite de l’aventure Binance Api avec comme promis la dernière fois, la récupération du solde des cryptos sur votre compte Binance dans le terminal !

Pour ceux qui n’ont pas suivi, allez voir la partie 1 ⬇⬇⬇

Création de la clé/secret sur Binance

La nouveauté par rapport à la partie 1 c’est que cette fois nous voulons récupérer des données de notre compte perso et il faut donc que l’on génère un clé API sur le site.

Pour ce faire il vous suffit de suivre le WIKI officiel : https://www.binance.com/fr/support/faq/360002502072

ATTENTION, comme indiqué, n’oubliez pas de directement copier le secret car il ne sera visible qu’une fois pour des raisons de sécurité !

Si vous perdez votre clé secrète il faudra tout simplement supprimer votre clé API et en créer une nouvelle.

Le code maintenant

Si on reprend la doc ainsi que le travail de l’ami Yann 😁

On remarque qu’avant d’envoyer notre requête il y a quelques étapes/prérequis à respecter

Il nous faut donc, un Timestamp unix valide, un header contenant notre clé API et une signature faite à partir de notre clé secrète en chiffrement HMACSHA256.

On va donc, comme Yann, découper tout cela en fonctions

Obtenir un TimeStamp depuis Binance :

function Get-UnixTimeStamp {
    param(
    )
    $URL = "https://api.binance.com/api/v3/time"
    $TimeStamp = Invoke-RestMethod -Uri $URL -Method get 
    return $TimeStamp.serverTime
}

La création du header (indiquez votre $APIKey)

function Get-BinanceAPIHeader {
<#
.SYNOPSIS
Préparer le header pour la requête

.DESCRIPTION
Le header contient la clé API

.EXAMPLE
Get-BinanceAPIHeader	
#>

    param(    
    )
  
    $APIKey = "Votre clé API"

    $Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $Headers.Add("X-MBX-APIKEY", $APIKey)

    return $Headers
}

La création de la signature (indiquez votre $APISecret)

function Get-BinanceAPISignature {
<#
.SYNOPSIS
Préparer la signature de la requéte

.DESCRIPTION
Une clé API ainsi qu'une signature sont obligatoire

.PARAMETER QueryString
Le queryString doit contenir le timestamp et le recvWindow

.PARAMETER EndPoint
Le endpoint account pour le compte

.EXAMPLE
$URI = Get-BinanceAPISignature -QueryString $QueryString -EndPoint "/api/v3/account"
#>

    param(
        [Parameter(Mandatory = $true)]$QueryString,
        [Parameter(Mandatory = $true)]$EndPoint
    )
  
    $APISecret = "Votre clé secréte"

    $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $hmacsha.key = [Text.Encoding]::ASCII.GetBytes($APISecret)
    $signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($QueryString))
    $signature = [System.BitConverter]::ToString($signature).Replace('-', '').ToLower()

    $URI = "https://api.binance.com$($EndPoint)?$QueryString&signature=$signature"
	
    return $URI
}

Maintenant que l’on peut remplir les prérequis, on peut construire la requête en elle même

Avec la gestion des erreurs pour avoir une indication en cas de problème

function Request-API {
<#
.SYNOPSIS
Créer la requête vers l'API

.PARAMETER Method
Choisir la méthode POST ou GET par exemple

.PARAMETER URI
Retourner à partir de la fonction Get-BinanceAPISignature

.PARAMETER Headers
Retourner à partir de la fonction Get-BinanceAPIHeader

.EXAMPLE
$ObjResults = Request-API -Method Get -URI $URI -Headers $Headers
#>

    [cmdletbinding()]
    param(
        [Parameter(Mandatory = $true)][ValidateSet("POST", "GET", "DELETE")]$Method,
        [Parameter(Mandatory = $true)]$URI,
        [Parameter(Mandatory = $true)]$Headers
    )

    try {
        $ArrayJsonResult = Invoke-RestMethod $URI -Method $Method -Headers $Headers
    }
    catch {
        $LastError = $Error[0].ErrorDetails.Message | ConvertFrom-Json

        switch ($LastError.code) {
            ("-1021") { write-host "TimeStamp Is outside of the recvWindow" }
            ("-1105") { write-host "TimeStamp issue" }
            ("-1003") { write-host "Too much request, IP Banned"; break }
            ("-2010") { write-host "Stop price would trigger immediately or Account has too many open stop loss and/or take profit orders on the symbol." }
            ("-1013") { write-host "The amount is not enough for this currency or not following the step size rule for the symbol." } 
            ("-1111") { write-host "Too many decimal check the precision required with Get-ExchangeInfo" }  
        }
    }
	
    return $ArrayJsonResult
}

Pour finir on peut coller toutes les fonctions précédentes dans un fichier ps1 et les utiliser tout simplement en mettant à la suite :

#Vérification que les fonctions sont bien disponibles, facultatif
try {
    Get-Command -Name Get-UnixTimeStamp -ErrorAction Stop | out-null
    Get-Command -name Get-BinanceAPISignature -ErrorAction Stop | Out-Null
    Get-Command -Name Get-BinanceAPIHeader -ErrorAction Stop | Out-Null
    Get-Command -Name Request-API -ErrorAction Stop | Out-Null
}
catch {
    Write-Host "Load Get-UnixTimeStamp, Get-BinanceAPISignature, Get-BinanceAPIHeader, Request-API  first prior to laod the current script" -b red
    Break
}

#Récupération de TimeStamp
$TimeStamp = Get-UnixTimeStamp
#Création du QueryString
$QueryString = "timestamp=$TimeStamp&recvWindow=5000"
#Création de la signature
$URI = Get-BinanceAPISignature -QueryString $QueryString -EndPoint "/api/v3/account"
#Création du header
$Headers = Get-BinanceAPIHeader
#Envoi de la requête
$ObjResults = $null
$ObjResults = Request-API -Method GET -URI $URI -Headers $Headers

#Extration des infos du compte à partir de l'objet retourné par l'API
#Infos générale du compte
$AccountInfo = $ObjResults | Select-Object makerCommission, takerCommission, buyerCommission, sellerCommission, canTrade, canWithdraw, canDeposit, updateTime, accountType, permissions | Format-List

#Solde des cryptos sur le compte en enlevant les valeurs à 0
$AccountBalance = $ObjResults.balances | Where-Object free -gt "0.00000000" | Format-Table

#Affichage des résultats
$AccountInfo
$AccountBalance

Et le résultat 🎉

Vous pouvez admirer votre wallet Biance dans le terminal !!! avec les soldes disponibles ainsi que bloqués en épargne par exemple

Et la suite ?

Pour la dernière partie, on va allez encore plus loin en faisant très attention ^^

Pourquoi ? car nous allons passer des ordres directement depuis le terminal !

OUI, on va pouvoir acheter et vendre des cryptos en PowerShell 👍😎

Zalman VE500

Voila un outil indispensable que tout technicien doit avoir avec lui, c’est ce boitier qui contient un HDD/SSD et avec le quel on va pouvoir tout simplement booter sur l’image disque que l’on souhaite (ISO, IMG). d’autres options sont aussi présentes comme la sélection du mode HDD, VCD ou les deux ainsi que le cryptage du disque et le verrouillage en écriture.

On en parle sur le blog !

Vous aimerez aussi...

1 réponse

  1. 13 juin 2021

    […] Récupérer le solde d’un compte Binance en PowerShell […]

Laisser un commentaire

%d blogueurs aiment cette page :