Page 1 sur 1

"WebSocket" connecter au navigateur [Jscript]

Publié : sam. 05/mai/2018 18:22
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 +

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : sam. 05/mai/2018 20:34
par nico
Le code ne compile pas, quelle version de Purebasic faut t'il utiliser ?

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : sam. 05/mai/2018 22:50
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.

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : sam. 05/mai/2018 22:59
par falsam
J'ai testé tout ça sur mon serveur local. Joli travail Celtic. Merci pour ce partage. :wink:

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : dim. 06/mai/2018 8:21
par celtic88
falsam a écrit :J'ai....
merci @FALSAM,

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : dim. 06/mai/2018 15:15
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)

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : dim. 06/mai/2018 19:29
par celtic88
slt @Kwai chang caine
tu veux dire que tu pourrais injecter du JS
ops Je n'ai rien dit.. :D 8)

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : lun. 07/mai/2018 18:59
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:

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : lun. 07/mai/2018 21:56
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')"))

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : lun. 07/mai/2018 22:28
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

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : mar. 08/mai/2018 9:17
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 ..

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : mar. 08/mai/2018 17:41
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) +

Re: "WebSocket" connecter au navigateur [Jscript]

Publié : jeu. 10/mai/2018 8:03
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)