"WebSocket" connecter au navigateur [Jscript]

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

"WebSocket" connecter au navigateur [Jscript]

Message par celtic88 »

hi les pures :D , j'espère que vous allez bien.

le code permet de crée un connexion TCP entre le navigateur et purebasic en utilisant javascript, pour envoyer et recevoir des données instantanée depuis et pour contrôler les pages web 8) !!!!...

j'ai utiliser l'objet "WebSocket" pour communiquer entre vous trouver tous les détails sur la méthode employé ici :

https://developer.mozilla.org/fr/docs/W ... et_servers

le code pb

Code : Tout sélectionner

EnableExplicit

;by celtic88 2018
;à propos de WebSockets
;https://developer.mozilla.org/fr/docs/WebSockets/Writing_WebSocket_servers

UseSHA1Fingerprint()

Structure Byte_Array
  Byte.A[0]
EndStructure

Procedure.s WebSocket_DecryptKey(ClientKey.s)
  ;décrypter le "WebSocket-Key"
  Protected Sf.s = StringFingerprint(ClientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", #PB_Cipher_SHA1)
  Protected *Buffer = AllocateMemory(1024)       
  Protected j = 0, i
  For i=1 To Len(Sf) Step 2
    PokeA(*Buffer+j, Val("$" + Mid(Sf, i ,2)))
    j + 1
  Next
  Protected b64.s = Space(1024)
  Base64Encoder(*Buffer,j,@b64, 1024)
  ProcedureReturn PeekS(@b64,-1,#PB_Ascii)
EndProcedure

Procedure.s WebSocket_JsonCreateCommand(type.s,content.s)
  ;utiliser JSON pour communiquer avec le client
  Protected jid = CreateJSON(#PB_Any)
  Protected Person = SetJSONObject(JSONValue(jid))
  SetJSONString(AddJSONMember(Person, "type"), type)
  SetJSONString(AddJSONMember(Person, "content"), content)
  Protected rjsn.s = ComposeJSON(jid)
  FreeJSON(jid)
  ProcedureReturn rjsn
EndProcedure

Procedure.s WebSocket_JsonGetCommand(jSs.s,type.s)
  ;obtenire la command envoiye par le client
  Protected jid = ParseJSON(#PB_Any,jSs)
  If jid
    Protected rjsn.s = GetJSONString(GetJSONMember(JSONValue(jid), type))
    FreeJSON(jid)
    ProcedureReturn rjsn
  EndIf
EndProcedure

Procedure Helper_SwapData(*pData.Byte_Array, Size) ; convert big endian to little endian and v.. 
  Protected *tmem.Byte_Array = AllocateMemory(Size)
  Protected i
  For i = 0 To Size -1
    *tmem\Byte[i] = *pData\Byte[Size - i - 1]
  Next
  CopyMemory(*tmem, *pData, Size)
  FreeMemory(*tmem)
EndProcedure

Procedure.s WebSocket_GetMessage(ClientID,*Buffer.Byte_Array,Len)
  ;Déchiffrer le message envoyé par le client
  
  Protected opcode.b = *Buffer\Byte[0] & $f
  Protected fin.b    = *Buffer\Byte[0] >> 4 & $f
  ;   Debug RSet(Bin(PeekA(*Buffer),#PB_Byte), 8, "0")
  ;   Debug opcode
  ;   Debug fin
  
  Protected frameCount = 2
  Protected length.q = *Buffer\Byte[1] & 127
  If length = 126
    length = PeekU(@*Buffer\Byte[2])
    Helper_SwapData(@length, 2)
    frameCount + 2
  ElseIf  length = 127
    length = PeekQ(@*Buffer\Byte[2])
    Helper_SwapData(@length, 8)
    frameCount + 8
  EndIf
  
  Protected Key = PeekL(@*Buffer\Byte[frameCount])
  frameCount + 4
  
  Protected *palldata = AllocateMemory(frameCount+(length*2)+20)
  CopyMemory(*Buffer, *palldata, Len)
  If length > Len-frameCount
    Repeat
      Protected rvc = ReceiveNetworkData(ClientID, *palldata + Len, length)
      If rvc = -1:Goto __SKIIP:EndIf
      Len + rvc
    Until length = Len-frameCount
  EndIf
  
  Protected *DBuffer = *palldata + length + frameCount
  
  Protected j = 0, i
  For i = frameCount To length + frameCount -1
    PokeA(*DBuffer + j, PeekA(*palldata + i) ! PeekA(@Key + (j%4)))
    j + 1
  Next
  
  ;ShowMemoryViewer(*DBuffer, j)
  Protected pstring.s = PeekS(*DBuffer, j ,#PB_Ascii)
  
  __SKIIP:
  FreeMemory(*palldata)
  
  ProcedureReturn pstring
EndProcedure

Procedure WebSocket_SendMessage(ClientID, Message.s)
  ;envoyer message à client
  Protected send.q  = 129
  SendNetworkData(ClientID, @send, 1)
  Protected StringLen.q  = StringByteLength(Message, #PB_Ascii)
  send  = StringLen
  Protected datasieze
  If send > 65535
    send = 127
    datasieze = 8
  ElseIf send > 125
    send = 126
    datasieze = 2
  EndIf
  SendNetworkData(ClientID, @send, 1)
  If datasieze
    Helper_SwapData(@StringLen, datasieze)
    SendNetworkData(ClientID, @StringLen, datasieze)
  EndIf
  SendNetworkString(ClientID, Message, #PB_Ascii)
EndProcedure

Procedure.s HttpRequest_QueryHeaders(Request.s, FileID.s)
  FileID = StringField(Request, 2, FileID)
  FileID = StringField(FileID, 1, #CRLF$)
  ProcedureReturn FileID
EndProcedure

DisableExplicit

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 8100
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)
  
  Repeat
    
    SEvent = NetworkServerEvent()
    
    If SEvent
      
      ClientID = EventClient()
      
      Select SEvent
          
        Case #PB_NetworkEvent_Connect
          Debug  "A new client has connected !"
          
        Case #PB_NetworkEvent_Data
          FillMemory(*Buffer, 1000)
          Len = ReceiveNetworkData(ClientID, *Buffer, 1000)
          reQ.s = PeekS(*Buffer, -1, #PB_UTF8)
          
          If HttpRequest_QueryHeaders(reQ, "GET") ; vérifier si la demande est pour la connexion...
                                                  ; envoyer la demande acceptée...
            SreQ.s = "HTTP/1.1 101 Switching Protocols"  + #CRLF$ + 
                     "Upgrade: websocket"                + #CRLF$ + 
                     "Connection: Upgrade"               + #CRLF$ + 
                     "Sec-WebSocket-Accept: "            + 
                     WebSocket_DecryptKey(HttpRequest_QueryHeaders(reQ, "Sec-WebSocket-Key: ")) + 
                     #CRLF$ + #CRLF$
            
            SendNetworkString(ClientID, SreQ, #PB_Ascii)
          Else
            ;message a été envoyé par le client
            msg.s = WebSocket_GetMessage(ClientID,*Buffer,Len)
            ;obtenir les informations de la commande
            Debug "command Type : " + WebSocket_JsonGetCommand(msg,"type")
            Debug "command content : " + WebSocket_JsonGetCommand(msg,"content")
            ;envoyer "Slt Les pures" :commande type texte
            WebSocket_SendMessage(ClientID, WebSocket_JsonCreateCommand("text","Slt les Pures"))
            
          EndIf
        Case #PB_NetworkEvent_Disconnect
          Debug "Client "+Str(ClientID)+" has closed the connection..."
          
      EndSelect
    Else
      Delay(10)
    EndIf
    
  Until Quit = 1 
  
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf


End   


code html

Code : Tout sélectionner

<!DOCTYPE html>
<html>

<head>
<meta charset=utf-8>
<title>Purebasic WebSocket</title>
<script>
var exampleSocket;
  
function connect(){ 
    // créer l'objet WebSocket et connecter à "localhost = 127.0.0.1" sur le port 8100
    exampleSocket = new WebSocket("ws://localhost:8100"); 
    
    exampleSocket.onopen = function (event) { 
	// la connexion est établie avec le serveur
	console.log("/!\\ Connexion serveur"); 
	// envoyer un message
    exampleSocket.send('{ "type": "start", "content":"By celtic88"}'); 
	} 
  
    exampleSocket.onerror = function (event) { console.log(event); } 
    
    exampleSocket.onmessage = function (event) { 
	// Des données ont été reçues !
	// extraire la commande envoyée par le serveur
	  var message = JSON.parse(event.data);
  	    switch(message.type) {
			case "text":
				console.log(message.content);
				document.getElementById("message").innerHTML = message.content;
				break;
			case "close":
			    // fermer la fenêtre
				console.log(message.content);
                window.open('', '_self', '');
                window.close();
				break;			
		    case "click":
			    // Cliquez sur un élément
				console.log(message.content);
				document.getElementById(message.content).click
				break;		    
		    case "open_url":
                //
				break;
	    }
	} 
    
    exampleSocket.onclose = function (event) {
	// déconnection ! reconnecter aux serveur ?
    connect() ;
	document.getElementById("message").innerHTML = "en attente de la connexion...";
    console.log("/!\\ Déconnexion serveur"); 
	} 
    
}
  function helloServer()
  {
    // envoyer le message écrit dans txtgadget "myText"
     exampleSocket.send('{ "type": "tchat", "content":"'+document.getElementById("myText").value+'"}'); 
  }
  
connect();
</script>
</head>

<body>

<h1>WebSocket Exemple</h1>

<p>sélectionner "Console" dans le debugger menu. </p>

<input type="text" id="myText" value="message...">

<input type="button" onclick="helloServer()" value="envoyer le message au serveur">

<fieldset><legend>Message serveur</legend> 
  <div id="message" ></div>
</fieldset>

</body>
</html> 

amusez vous bien :) , a +
.....i Love Pb :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: "WebSocket" connecter au navigateur [Jscript]

Message par nico »

Le code ne compile pas, quelle version de Purebasic faut t'il utiliser ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: "WebSocket" connecter au navigateur [Jscript]

Message par falsam »

nico a écrit :Le code ne compile pas, quelle version de Purebasic faut t'il utiliser ?
5.46 LTS

Le nombre de paramètres de la fonction Base64Encoder() n'est pas le même avec la version 5.60 et supérieure.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: "WebSocket" connecter au navigateur [Jscript]

Message par falsam »

J'ai testé tout ça sur mon serveur local. Joli travail Celtic. Merci pour ce partage. :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: "WebSocket" connecter au navigateur [Jscript]

Message par celtic88 »

falsam a écrit :J'ai....
merci @FALSAM,
Dernière modification par celtic88 le dim. 06/mai/2018 19:25, modifié 1 fois.
.....i Love Pb :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: "WebSocket" connecter au navigateur [Jscript]

Message par Kwai chang caine »

Waooouuuh !!! ça marche niquel !!! :D
C'est de la balle ton truc, tu veux dire que tu pourrais injecter du JS à la mode MozRepl ? 8O
https://addons.mozilla.org/en-US/firefox/addon/mozrepl/
Trop top, j'utilise cette extension depuis pas mal de temps pour piloter FF, Merci Celtic 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: "WebSocket" connecter au navigateur [Jscript]

Message par celtic88 »

slt @Kwai chang caine
tu veux dire que tu pourrais injecter du JS
ops Je n'ai rien dit.. :D 8)
.....i Love Pb :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: "WebSocket" connecter au navigateur [Jscript]

Message par Kwai chang caine »

Coooolllll !!! :D 8)

Mais comme dab "J'ai pas arrivé" :mrgreen:
Si je veux injecter un changement de page à FF
J'ai éssayé :

Code : Tout sélectionner

WebSocket_SendMessage(ClientID, WebSocket_JsonCreateCommand("window","location.href = 'http://www.google.com'"))
ou

Code : Tout sélectionner

WebSocket_SendMessage(ClientID, "window.location.href = 'http://www.google.com'"))
sans succès :oops:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: "WebSocket" connecter au navigateur [Jscript]

Message par celtic88 »

:D
ajouter ces lignes dans HTML

Code : Tout sélectionner

		    case "KCC_RUNJS":
                //Execute Javascript
				eval(message.content);
		    
				break;
et bimm

Code : Tout sélectionner

WebSocket_SendMessage(ClientID, WebSocket_JsonCreateCommand("KCC_RUNJS","alert('hello KCC')"))
.....i Love Pb :)
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: "WebSocket" connecter au navigateur [Jscript]

Message par celtic88 »

le problème c'est que dans certains sites en n peut pas accéder a ces éléments pour les manipuler "bloquer par la protection" en peut le bypasser mais c'est très lourd et puis il y a des programmes qui font ça ...

TROP FACILE POUR ÊTRE VRAI, j abandonne le projet. :cry:

:D
.....i Love Pb :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: "WebSocket" connecter au navigateur [Jscript]

Message par Kwai chang caine »

Merci beaucoup CELTIC 8)
Ca marche top !!!! :D
TROP FACILE POUR ÊTRE VRAI, j abandonne le projet.
Dommage pour le travail que tu as déjà fait :|
En tout cas grâce à toi c'est un super début 8)

C'est un sujet passionnant, comme je te l'ai dit il y a pas mal de REPL qui existent, j'utilise MOZREPL perso pour piloter FF.
Mais avoir un code qui fonctionne avec notre PB d'amour, alors là c'est un super cadeau, encore merci :wink:
Décidément tu fais toujours des codes hyper intéressants en plus d'être du très haut de gamme 8)
Tu es à mes yeux d'une grande valeur pour ce forum ..
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: "WebSocket" connecter au navigateur [Jscript]

Message par celtic88 »

merci kcc
j'essaie d'être utile :)

et un conseil:
apprend toi le java (scrip) parce que c le langage informatique le plus demandé dans le monde et le mieux payé.

prend soin de toi 8) +
.....i Love Pb :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: "WebSocket" connecter au navigateur [Jscript]

Message par Kwai chang caine »

Merci à toi 8)
Celtic a écrit :j'essaie d'être utile
Et bien pour moi tu l'es beaucoup. 8)
Tu me fait rêver et à cette époque c'est pas facile :

- Voir ces codes d'une complexité digne des grands maitres de la programmation, alors que tu apprends tout seul....je suis à genoux.
Comment j'aimerais avoir un morceau de ton cerveau :mrgreen:

- Puis aussi par ce comportement que tu as, comme certains des membres de ces forums de fouiller partout, tripoter à tout, faire des essais dans ton laboratoire, tel un savant fou :lol:

Image

Puis venir nous donner sans rien en échange le résultat de tes recherches 8)

Bon c'est sûr que tes codes volent tellement haut, que lorsque tu arrêtes (ce qui est souvent je dois le reconnaitre :wink: ), je n'ai pas les moyens intellectuels de les modifier, les utiliser, et encore moins les améliorer ou faire évoluer :| mais ils ont le mérite d’exister et nous démontrer une fois de plus, comme si il en était besoin la puissance de PB 8O 8)

A bientôt pour ta prochaine idée de "fou" MASTER 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre