[Google Sheets] Cotation temps réel des cryptos (Binance / websocket)

Bonjour,

  • pour les cryptomaniaques d'une part
  • pour une démonstration de l'utilisation des websockets,

je vous soumets un projet-démonstration

Avant toute chose,

  • Binance propose une API pour recueillir des informations publiques sur les cryptomonnaies : ce sujet est donc tout à fait légal et ne constitue pas du web scrapping au hacking du terme. Encore que la définition du terme est soft : "Le hacking est initialement la bidouille et l'expérimentation, dont les motivations sont la passion, le jeu, le plaisir, l'échange et le partage".
  • Le websocket est une méthode d'accès en pseudo-continu à des informations, c'est en ce sens une évolution du HTTP et de l'AJAX

Pour ce faire, dans le projet, nous allons trouver 4 parties :

1- la mise en place d'un menu spécifique pour lancer la lecture via websocket (wss)

function onOpen(e) {
  SpreadsheetApp.getUi()
    .createMenu('* BINANCE *')
    .addItem('Manage ...', 'showSidebar')
    .addToUi();
}
function showSidebar(){
  var ui = SpreadsheetApp.getUi();
  var html = HtmlService
    .createTemplateFromFile("binance")
    .evaluate()
    .setTitle("web socket");
  ui.showSidebar(html);
} 

2- la transmission des paramètres qui sont ici des "pairs" (colonne B), avec création d'une fonction qui retournera les paramètres à transmettre à l'API Binance

const feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('derCotation');

function param(){
  var valeurs = feuille.getRange('B3:B'+feuille.getLastRow()).getValues().join().split(",")
  var myparams = {"method": "SUBSCRIBE", "params": valeurs, "id": 1}
  return JSON.stringify(myparams) 
}

3- la communication via une page html avec l'API de Binance : la page appellera la fonction précédente par

<? var myparam = param(); ?>

et retournera le résultat

google.script.run.recupererJSON( evt.data );
<!DOCTYPE html>
  <meta charset="utf-8" />
<head>
  <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
  <style>
    body{margin:12px;}
  </style>
  <script language="javascript" type="text/javascript">

  var wsUri = ("wss://stream.binance.com:9443/ws");
  <? var myparam = param(); ?>
  var nbr=0

  function init()  {
    websocket = new WebSocket(wsUri);
    websocket.onopen = function(evt) { onOpen(evt) };
    websocket.onclose = function(evt) { onClose(evt) };
    websocket.onmessage = function(evt) { onMessage(evt) };
    websocket.onerror = function(evt) { onError(evt) };
    nbr=0;
  }

  function onOpen(evt)  {
    writeLog("Connected to:<br>" + wsUri);
    doSend(<?= myparam ?>);
  }

  function onClose(evt)  {
    writeLog("Disconnected from:<br>" + wsUri);
  }

  function onMessage(evt)  {
    nbr++;
    google.script.run.recupererJSON( evt.data );
    document.getElementById('nbr').innerHTML=('<span style="color: blue;">Response #<b>' + nbr + '</b> transmitted to sheet</span>');
  }

  function onError(evt)  {
    writeLog('<span style="color: red;">ERROR:</span> ' + evt.data);
  }

  function doSend(message)  {
    writeLog("Sent: " + message);
    websocket.send(message);
  }

  function writeLog(message)  {
    var pre = document.createElement("p");
    pre.style.wordWrap = "break-word";
    pre.innerHTML = message;
    document.getElementById("log").appendChild(pre);
  }

  </script>
</head>
<body>
    <div id="nbr"> </div><br>
    <div id="lastButtonBlock" class="block">
    <button onclick="init()" class ="action button actionButton" > Connect </button>
    <button onclick="websocket.close()" class ="action button actionButton" > Disconnect </button>
    <button onclick="google.script.host.close()" class ="create deleteButton actionButton" > Close </button>
    </div><br>
    <div id="log"></div><br>
</body>
</html>

4- la restitution en temps réel des informations dans la feuille

function recupererJSON(jsonstring){
  try{
    var data = JSON.parse(jsonstring);
    var pairs = feuille.getRange('A3:A').getValues().join().split(",");
    var ligne = pairs.indexOf(data.k.s);
    if (ligne != -1){
      var result=[]
      result.push([ data.k.o , data.k.c , data.k.h , data.k.l ])
      feuille.getRange('C' + (ligne+3) + ':F' + (ligne+3)).setValues(result)
      // pour le fun
      feuille.getRange('a' + 2).setValue(data.k.s)
      feuille.getRange('C' + 2 + ':F' + 2).setValues(result)
    }
  }
  catch(e){
  }
}
binance
Rechercher des sujets similaires à "google sheets cotation temps reel cryptos binance websocket"