From 8b814546fe0836518eafeb5b096ba51d489b452b Mon Sep 17 00:00:00 2001 From: Victor Westerlund Date: Mon, 30 Nov 2020 04:09:28 +0100 Subject: [PATCH] 0.2.0 Package release --- build/lib/labylib/Cape.py | 171 ++++++++++++++++-- build/lib/labylib/Hat.py | 126 +++++++++++++ dist/labylib-0.1.0.tar.gz | Bin 3939 -> 0 bytes ...any.whl => labylib-0.2.0-py3-none-any.whl} | Bin 16638 -> 18290 bytes dist/labylib-0.2.0.tar.gz | Bin 0 -> 4774 bytes labylib.egg-info/PKG-INFO | 107 ++++++----- labylib.egg-info/SOURCES.txt | 1 + setup.py | 4 +- 8 files changed, 347 insertions(+), 62 deletions(-) create mode 100644 build/lib/labylib/Hat.py delete mode 100644 dist/labylib-0.1.0.tar.gz rename dist/{labylib-0.1.0-py3-none-any.whl => labylib-0.2.0-py3-none-any.whl} (62%) create mode 100644 dist/labylib-0.2.0.tar.gz diff --git a/build/lib/labylib/Cape.py b/build/lib/labylib/Cape.py index fcac83d..a96f5ec 100644 --- a/build/lib/labylib/Cape.py +++ b/build/lib/labylib/Cape.py @@ -2,15 +2,11 @@ import requests import hashlib import time -class RequestError(Exception): pass - class Texture: endpoint = "https://www.labymod.net/page/php/cape.php" - def __init__(self,cookie,img): - self.validate(cookie,img) - + def __init__(self,cookie): self.body = b"" # Initialize request body self.cookies = dict(PHPSESSID = cookie) self.boundary = self.boundary() @@ -33,13 +29,9 @@ class Texture: } self.appendBinaryFormData(b"cosmetic",b"cape") - self.appendBinaryFormData(b"file",self.bOpen(img)) # ----------------------------------- - def validate(self,cookie,file): - return True - # Generate boundary header from MD5-hash of current time def boundary(self): seed = str(time.time()) @@ -83,7 +75,9 @@ class Texture: # ----------------------------------- - def update(self): + def update(self,img): + self.appendBinaryFormData(b"file",self.bOpen(img)) + self.closeBinaryFormData() # Add final boundary header request = requests.post(Texture.endpoint, @@ -93,6 +87,157 @@ class Texture: ) # Raise exception if request fails - # Use [3:5] to clean up junk chars from reponse body - if(str(request.text)[3:5] != "OK"): - raise RequestError(str(request.text)) \ No newline at end of file + request.raise_for_status() + +class Template: + + endpoint = "https://www.labymod.net/page/php/setCapeTpl.php" + templates = { + "labymod": "10_LABYMOD.png", + "minecon2011": "30_MINECON2011.png", + "minecon2012": "30_MINECON2012.png", + "minecon2013": "30_MINECON2013.png", + "minecon2015": "30_MINECON2015.png", + "minecon2016": "30_MINECON2016.png", + "minecon2019": "30_MINECON2019.png", + "prismarine": "30_PRISMARINE.png", + "christmas2010": "40_CHRISTMAS2010.png", + "cobalt": "40_COBALT.png", + "julianclark": "40_JULIANCLARK.png", + "mapmaker": "40_MAPMAKER.png", + "mojira": "40_MOJIRA.png", + "mrmessiah": "40_MRMESSIAH.png", + "newyear": "40_NEWYEAR.png", + "scrolls": "40_SCROLLS.png", + "translator": "40_TRANSLATOR.png", + "turtle": "40_TURTLE.png", + "winner": "40_WINNER.png" + } + + def __init__(self,cookie): + self.cookies = dict(PHPSESSID = cookie) + + self.headers = { + "accept": "*/*", + "accept-encoding": "gzip, deflate, br", + "accept-language": "en-US,en;q=0.9,sv;q=0.8", + "cache-control": "no-cache", + "dnt": "1", + "user-agent": "Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0", + "origin": "https://www.labymod.net", + "pragma": "no-cache", + "referer": "https://www.labymod.net/dashboard", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "x-requested-with": "XMLHttpRequest", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" + } + + self.body = "" + + # Payload + self.addEncodedFormData("cosmetic","cape") + + # ----------------------------------- + + # Add URLEncoded form data (x-www-form-urlencoded) + def addEncodedFormData(self,key,value): + body = "&" + + # Remove '&' delimiter for first item + if(self.body == ""): + body = "" + + body += f"{key}={value}" + + self.body += body + + # ----------------------------------- + + def update(self,value): + value = value.lower() + + if(value not in Template.templates): + raise ValueError(f"'{value}' is not a valid template.") + + texture = Template.templates[value] + + self.addEncodedFormData("cape",texture) + + request = requests.post(Template.endpoint, + headers = self.headers, + cookies = self.cookies, + data = self.body + ) + + # Raise exception if request fails + request.raise_for_status() + +class Visibility: + + endpoint = "https://www.labymod.net/api/change" + + def __init__(self,cookie): + self.cookies = dict(PHPSESSID = cookie) + + self.headers = { + "accept": "*/*", + "accept-encoding": "gzip, deflate, br", + "accept-language": "en-US,en;q=0.9,sv;q=0.8", + "cache-control": "no-cache", + "dnt": "1", + "user-agent": "Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0", + "origin": "https://www.labymod.net", + "pragma": "no-cache", + "referer": "https://www.labymod.net/dashboard", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "x-requested-with": "XMLHttpRequest", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" + } + + self.body = "" + + # Payload + self.addEncodedFormData("type","switch") + self.addEncodedFormData("item",459595) + self.addEncodedFormData("site","control") + + # ----------------------------------- + + # Add URLEncoded form data (x-www-form-urlencoded) + def addEncodedFormData(self,key,value): + body = "&" + + # Remove '&' delimiter for first item + if(self.body == ""): + body = "" + + body += f"{key}={value}" + + self.body += body + + # ----------------------------------- + + def update(self,value): + # Interpret strings + if(type(value) != int): + if(value == "show"): + value = 1 + elif(value == "hide"): + value = 0 + else: + raise ValueError(f"'{value}' is not a valid visibility state.") + + self.addEncodedFormData("value",value) + + request = requests.post(Visibility.endpoint, + headers = self.headers, + cookies = self.cookies, + data = self.body + ) + + # Raise exception if request fails + request.raise_for_status() \ No newline at end of file diff --git a/build/lib/labylib/Hat.py b/build/lib/labylib/Hat.py new file mode 100644 index 0000000..13df56d --- /dev/null +++ b/build/lib/labylib/Hat.py @@ -0,0 +1,126 @@ +import requests + +class Texture: + + endpoint = "https://www.labymod.net/api/change" + + def __init__(self,cookie): + self.cookies = dict(PHPSESSID = cookie) + + self.headers = { + "accept": "*/*", + "accept-encoding": "gzip, deflate, br", + "accept-language": "en-US,en;q=0.9,sv;q=0.8", + "cache-control": "no-cache", + "dnt": "1", + "user-agent": "Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0", + "origin": "https://www.labymod.net", + "pragma": "no-cache", + "referer": "https://www.labymod.net/dashboard", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "x-requested-with": "XMLHttpRequest", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" + } + + self.body = "" + + # Payload + self.addEncodedFormData("type","country") + self.addEncodedFormData("item",459594) + self.addEncodedFormData("site","control") + + # ----------------------------------- + + # Add URLEncoded form data (x-www-form-urlencoded) + def addEncodedFormData(self,key,value): + body = "&" + + # Remove '&' delimiter for first item + if(self.body == ""): + body = "" + + body += f"{key}={value}" + + self.body += body + + # ----------------------------------- + + def update(self,value): + self.addEncodedFormData("value",value) + + request = requests.post(Texture.endpoint, + headers = self.headers, + cookies = self.cookies, + data = self.body + ) + + # Raise exception if request fails + request.raise_for_status() + +class Visibility: + + endpoint = "https://www.labymod.net/api/change" + + def __init__(self,cookie): + self.cookies = dict(PHPSESSID = cookie) + + self.headers = { + "accept": "*/*", + "accept-encoding": "gzip, deflate, br", + "accept-language": "en-US,en;q=0.9,sv;q=0.8", + "cache-control": "no-cache", + "dnt": "1", + "user-agent": "Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0", + "origin": "https://www.labymod.net", + "pragma": "no-cache", + "referer": "https://www.labymod.net/dashboard", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "x-requested-with": "XMLHttpRequest", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" + } + + self.body = "" + + # Payload + self.addEncodedFormData("type","switch") + self.addEncodedFormData("item",459594) + self.addEncodedFormData("site","control") + + # ----------------------------------- + + # Add URLEncoded form data (x-www-form-urlencoded) + def addEncodedFormData(self,key,value): + body = "&" + + # Remove '&' delimiter for first item + if(self.body == ""): + body = "" + + body += f"{key}={value}" + + self.body += body + + # ----------------------------------- + + def update(self,value): + # Interpret strings + if(type(value) != int): + if(value == "show"): + value = 1 + else: + value = 0 + + self.addEncodedFormData("value",value) + + request = requests.post(Visibility.endpoint, + headers = self.headers, + cookies = self.cookies, + data = self.body + ) + + # Raise exception if request fails + request.raise_for_status() \ No newline at end of file diff --git a/dist/labylib-0.1.0.tar.gz b/dist/labylib-0.1.0.tar.gz deleted file mode 100644 index 904d2d5f443be052879dc91dc2aec57ef58bb3f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3939 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 delta 3924 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 t8?pR9ZE~uNSyY~p}6&wHn diff --git a/dist/labylib-0.2.0.tar.gz b/dist/labylib-0.2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9ac490cb4ddfb79e33140d1b416bd65ac3bc9c1e GIT binary patch literal 4774 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.** - - [A list of all modules and classes can be found here](https://github.com/VictorWesterlund/labylib/wiki/Module-reference-sheet) - ```python - from labylib import Cape + 1. Import a labylib Module from the [list of available modules](https://github.com/VictorWesterlund/labylib/wiki/labylib-Modules). + ```python3 + from labylib import ``` - **2. Initialize a module class.** - - All labylib classes take a `PHPSESSID` as their first argument. - - _Example with `Cape` where a file-path is expected as a second argument:_ - ```python - texture = Cape.Texture("","") # labylib = Cape.Texture("772nnas663jkc8ahbb2","/home/VicW/coolCape-2.png") + 2. Each Module comes with a set of classes available to each cosmetic. Pick a class for your Module. (`Visibility`,`Texture` etc.) + 3. Initialize the class by passing it a `PHPSESSID`
+ [**Here's what it is and where to find it**](https://github.com/VictorWesterlund/labylib/wiki/Find-your-PHPSESSID) + ```python3 + # Example + cape_vis = Cape.Visibility(PHPSESSID) + ``` + 4. Call `update()` with a value expected by the class. Just like Modules, the value expected depends on the class. + ```python3 + # Example + cape_vis.update("show") ``` - **3. Submit a cosmetic update** - ```python - texture.update() - ``` - Python's [Built-in-exceptions](https://docs.python.org/3/library/exceptions.html#exception-hierarchy) are rasied as needed for missing texture files (`FileNotFoundError`) etc. If a request was sucuessfully sent to the Labymod endpoint, but it returned something falsey (not `OK`). A custom-defined `RequestError` exception will be raised; containing the response received from the endpoint. - ```python - try: - texture.update() - except RequestError as error: - print("Caugh RequestError exception:" + error) - # "Caugh RequestError exception: Session expired." + # Advanced Usage + ## Request headers, cookies and body + Each class instance can be modified before `update()` is called to make changes to the request headers, cookies etc. You can even add additional encoded form data to the request body if necessary. + + labylib uses [`Requests`](https://requests.readthedocs.io/en/master/) under the hood and request parameters like headers and cookies can be modified in accordance with `Request`'s conventions. + ```python3 + # This will send add a "foo=bar" cookie and header with the request + cape_vis.cookies["foo"] = "bar" + cape_vis.headers["foo"] = "bar" + + cape_vis.update("show") ``` - ## Advanced usage - ### HTTP POST Headers - Request headers and cookies can be accessed and modified pre-submission by applying standard list modifications on the followin objects: `self.headers` and `self.cookies` - ```python - texture = Cape.Texture("","") + ### To append form data to the request body of an instance: - texture.headers["Origin"] = "https://example.com/" - texture.cookies["Foo"] = "Bar" - - labylib.update() + **For `x-www-form-urlencoded` requests:** Append form data with the `addEncodedFormData(key,value)` method: + ```python3 + # This will add "foo=bar" to the URL encoded payload + cape_vis.addEncodedFormData("foo","bar") + cape_vis.update("show") ``` - ### HTTP POST Body - Binary form-data can be appended by calling `self.appendBinaryFormData(name,payload)`. - ```python - texture = Cape.Texture("","") - texture.appendBinaryFormData(b"foo",b"bar") - texture.appendBinaryFormData(b"file","/home/VicW/home/VicW/coolCape-2.png") # Note that 'payload' is a String in this case (as opposed to Binary) + **For `multipart/form-data` requests:** Append binary form data with the `addBinaryFormData(key,payload)` method: + ```python3 + # This will create a new payload boundary containing "foo=bar" + cape_texture.addBinaryFormData(b"foor",b"bar") + cape_texture.update("show") ``` - Special form-data types ('names'): - |name|Description - |--|--| - |`'file'`| Submit cosmetic texture file as BLOB by passing `payload` a binary-encoded PNG.
_`self.bOpen()` can be used to 'open()' a file as binary string._ + You can also append `image/png` files by passing "file" as the `key` argument. You can either pass binary data directly as a BLOB to `payload` or use `bOpen()` to load an image from disk: + ```python3 + # This will create a new payload boundary with a "Content-Type: image/png" header and BLOB body + cape_texture.addBinaryFormData(b"file",cape_vis.bOpen("~/someImage.png")) + cape_texture.update("~/myAwesomeTexture.png") + ``` + + ## Contribute + + If you find any bugs with- or would like to suggest features to labylib, please submit them under [Issues](https://github.com/VictorWesterlund/labylib/issues) + + Pull requests to labylib are highly encouraged! + + ## License + + [GNU General Public License v3.0](https://github.com/VictorWesterlund/labylib/blob/master/LICENSE) Platform: UNKNOWN Classifier: Programming Language :: Python :: 3 diff --git a/labylib.egg-info/SOURCES.txt b/labylib.egg-info/SOURCES.txt index 5f90f3a..127b85e 100644 --- a/labylib.egg-info/SOURCES.txt +++ b/labylib.egg-info/SOURCES.txt @@ -1,6 +1,7 @@ README.md setup.py labylib/Cape.py +labylib/Hat.py labylib/__init__.py labylib.egg-info/PKG-INFO labylib.egg-info/SOURCES.txt diff --git a/setup.py b/setup.py index 27e7eac..513789b 100644 --- a/setup.py +++ b/setup.py @@ -5,10 +5,10 @@ with open("README.md","r") as fh: setuptools.setup( name="labylib", - version="0.1.0", + version="0.2.0", author="VicW", author_email="victor.vesterlund@gmail.com", - description="Python API to modify LabyMod cosmetics", + description="API to modify LabyMod cosmetics", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/VictorWesterlund/labylib",