HelloZeroNet / Documentation

ZeroNet Documentation
https://zeronet.readthedocs.org/
GNU General Public License v2.0
74 stars 107 forks source link

Documentation of Websocket API #116

Open anoadragon453 opened 5 years ago

anoadragon453 commented 5 years ago

Not entirely sure if this is a large or small amount of work, but if I'm not mistaken, it should be possible to control ZeroNet's python daemon by speaking Websocket to it from places outside of the browser? Such as a C++ websockets library?

If so, some documentations of commands accepted by the Websockets server would be appreciated. I imagine they're very similar to those in the ZeroFrame API, but some guidance on the formatting for the actual Websocket request would most definitely be appreciated!

HelloZeroNet commented 5 years ago

Yes, it's totally possible. The commands are the same as ZeroFrame API. Here is an example, standalone client:

https://github.com/HelloZeroNet/ZeroNet/issues/1137#issuecomment-337019878

anoadragon453 commented 5 years ago

Very cool, thanks! I'll make a note about it in the docs somewhere.

This means we can make libraries for third-party programs to store data on ZeroNet, and then have that data be readable in a nice UI in the browser!

anoadragon453 commented 5 years ago

Is it possible to retrieve a cert and change user to that cert entirely over the WebSocket API?

Edit: Would it possibly have to be a clearnet request for ZeroID?

Yes, it is!

anoadragon453 commented 5 years ago

Note: Document that IP's are accepted in v>XXX.

anoadragon453 commented 5 years ago

Note: Document how Multiuser uses cookies in the WebSocket handshake.

Example of a python2 script that can talk to the Multiuser plugin:

import urllib2
import re
import json
import time

import websocket

req = urllib2.Request("http://127.0.0.1:43110/1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D/", headers={"Accept" : "text/html"})
wrapper_body = urllib2.urlopen(req).read()
wrapper_key = re.search('wrapper_key = "(.*?)"', wrapper_body).group(1)
wrapper_nonce = re.search('wrapper_nonce = "(.*?)"', wrapper_body).group(1)

# 

ws = websocket.create_connection("ws://127.0.0.1:43110/Websocket?wrapper_key=%s" % wrapper_key,
        cookie="master_address=1JtHVmhWqmvK6KLbVcQ8RT2oEhW9TLAmRv")
ws.send(json.dumps({"cmd":"userLoginForm","params":{},"id":-2}))
res = ws.recv()
print res
filips123 commented 5 years ago

@anoadragon453 I created ZeroFrame WebSocket API for JavaScript. I'm currently also creating clients for other languages. See https://github.com/HelloZeroNet/ZeroNet/issues/1289#issuecomment-507374004 for details.