Module ro_py.utilities.requests

Expand source code
from ro_py.utilities.errors import ApiError, c_errors
from json.decoder import JSONDecodeError
import requests
import httpx


class AsyncSession(httpx.AsyncClient):
    """
    This serves no purpose other than to get around an annoying HTTPX warning.
    """
    def __init__(self):
        super().__init__()

    def __del__(self):
        pass


def status_code_error(status_code):
    """
    Converts a status code to the proper exception.
    """
    if str(status_code) in c_errors:
        return c_errors[str(status_code)]
    else:
        return ApiError


class Requests:
    """
    This wrapper functions similarly to requests_async.Session, but made specifically for Roblox.
    """
    def __init__(self):
        self.session = AsyncSession()
        """Session to use for requests."""

        """
        Thank you @nsg for letting me know about this!
        This allows us to access some extra content.
        ▼▼▼
        """
        self.session.headers["User-Agent"] = "Roblox/WinInet"
        self.session.headers["Referer"] = "www.roblox.com"  # Possibly useful for some things

    async def request(self, method, *args, **kwargs):
        quickreturn = kwargs.pop("quickreturn", False)
        doxcsrf = kwargs.pop("doxcsrf", True)
        this_request = await self.session.request(method, *args, **kwargs)

        method = method.lower()

        if doxcsrf and ((method == "post") or (method == "put") or (method == "patch") or (method == "delete")):
            if "X-CSRF-TOKEN" in this_request.headers:
                self.session.headers['X-CSRF-TOKEN'] = this_request.headers["X-CSRF-TOKEN"]
                if this_request.status_code == 403:  # Request failed, send it again
                    this_request = await self.session.request(method, *args, **kwargs)

        if kwargs.pop("stream", False):
            # Skip request checking and just get on with it.
            return this_request

        try:
            this_request_json = this_request.json()
        except JSONDecodeError:
            return this_request

        if isinstance(this_request_json, dict):
            try:
                get_request_error = this_request_json["errors"]
            except KeyError:
                return this_request
        else:
            return this_request

        if quickreturn:
            return this_request

        request_exception = status_code_error(this_request.status_code)
        raise request_exception(f"[{this_request.status_code}] {get_request_error[0]['message']}")

    async def get(self, *args, **kwargs):
        """
        Essentially identical to requests_async.Session.get.
        """

        return await self.request("GET", *args, **kwargs)

    async def post(self, *args, **kwargs):
        """
        Essentially identical to requests_async.Session.post.
        """

        return await self.request("post", *args, **kwargs)

    async def patch(self, *args, **kwargs):
        """
        Essentially identical to requests_async.Session.patch.
        """

        return await self.request("patch", *args, **kwargs)

    async def delete(self, *args, **kwargs):
        """
        Essentially identical to requests_async.Session.delete.
        """

        return await self.request("delete", *args, **kwargs)

    def back_post(self, *args, **kwargs):
        kwargs["cookies"] = kwargs.pop("cookies", self.session.cookies)
        kwargs["headers"] = kwargs.pop("headers", self.session.headers)

        post_request = requests.post(*args, **kwargs)

        if "X-CSRF-TOKEN" in post_request.headers:
            self.session.headers['X-CSRF-TOKEN'] = post_request.headers["X-CSRF-TOKEN"]
            post_request = requests.post(*args, **kwargs)

        self.session.cookies = post_request.cookies
        return post_request

Functions

def status_code_error(status_code)

Converts a status code to the proper exception.

Expand source code
def status_code_error(status_code):
    """
    Converts a status code to the proper exception.
    """
    if str(status_code) in c_errors:
        return c_errors[str(status_code)]
    else:
        return ApiError

Classes

class AsyncSession

This serves no purpose other than to get around an annoying HTTPX warning.

Expand source code
class AsyncSession(httpx.AsyncClient):
    """
    This serves no purpose other than to get around an annoying HTTPX warning.
    """
    def __init__(self):
        super().__init__()

    def __del__(self):
        pass

Ancestors

  • httpx.AsyncClient
  • httpx._client.BaseClient
class Requests

This wrapper functions similarly to requests_async.Session, but made specifically for Roblox.

Expand source code
class Requests:
    """
    This wrapper functions similarly to requests_async.Session, but made specifically for Roblox.
    """
    def __init__(self):
        self.session = AsyncSession()
        """Session to use for requests."""

        """
        Thank you @nsg for letting me know about this!
        This allows us to access some extra content.
        ▼▼▼
        """
        self.session.headers["User-Agent"] = "Roblox/WinInet"
        self.session.headers["Referer"] = "www.roblox.com"  # Possibly useful for some things

    async def request(self, method, *args, **kwargs):
        quickreturn = kwargs.pop("quickreturn", False)
        doxcsrf = kwargs.pop("doxcsrf", True)
        this_request = await self.session.request(method, *args, **kwargs)

        method = method.lower()

        if doxcsrf and ((method == "post") or (method == "put") or (method == "patch") or (method == "delete")):
            if "X-CSRF-TOKEN" in this_request.headers:
                self.session.headers['X-CSRF-TOKEN'] = this_request.headers["X-CSRF-TOKEN"]
                if this_request.status_code == 403:  # Request failed, send it again
                    this_request = await self.session.request(method, *args, **kwargs)

        if kwargs.pop("stream", False):
            # Skip request checking and just get on with it.
            return this_request

        try:
            this_request_json = this_request.json()
        except JSONDecodeError:
            return this_request

        if isinstance(this_request_json, dict):
            try:
                get_request_error = this_request_json["errors"]
            except KeyError:
                return this_request
        else:
            return this_request

        if quickreturn:
            return this_request

        request_exception = status_code_error(this_request.status_code)
        raise request_exception(f"[{this_request.status_code}] {get_request_error[0]['message']}")

    async def get(self, *args, **kwargs):
        """
        Essentially identical to requests_async.Session.get.
        """

        return await self.request("GET", *args, **kwargs)

    async def post(self, *args, **kwargs):
        """
        Essentially identical to requests_async.Session.post.
        """

        return await self.request("post", *args, **kwargs)

    async def patch(self, *args, **kwargs):
        """
        Essentially identical to requests_async.Session.patch.
        """

        return await self.request("patch", *args, **kwargs)

    async def delete(self, *args, **kwargs):
        """
        Essentially identical to requests_async.Session.delete.
        """

        return await self.request("delete", *args, **kwargs)

    def back_post(self, *args, **kwargs):
        kwargs["cookies"] = kwargs.pop("cookies", self.session.cookies)
        kwargs["headers"] = kwargs.pop("headers", self.session.headers)

        post_request = requests.post(*args, **kwargs)

        if "X-CSRF-TOKEN" in post_request.headers:
            self.session.headers['X-CSRF-TOKEN'] = post_request.headers["X-CSRF-TOKEN"]
            post_request = requests.post(*args, **kwargs)

        self.session.cookies = post_request.cookies
        return post_request

Instance variables

var session

Session to use for requests.

Methods

def back_post(self, *args, **kwargs)
Expand source code
def back_post(self, *args, **kwargs):
    kwargs["cookies"] = kwargs.pop("cookies", self.session.cookies)
    kwargs["headers"] = kwargs.pop("headers", self.session.headers)

    post_request = requests.post(*args, **kwargs)

    if "X-CSRF-TOKEN" in post_request.headers:
        self.session.headers['X-CSRF-TOKEN'] = post_request.headers["X-CSRF-TOKEN"]
        post_request = requests.post(*args, **kwargs)

    self.session.cookies = post_request.cookies
    return post_request
async def delete(self, *args, **kwargs)

Essentially identical to requests_async.Session.delete.

Expand source code
async def delete(self, *args, **kwargs):
    """
    Essentially identical to requests_async.Session.delete.
    """

    return await self.request("delete", *args, **kwargs)
async def get(self, *args, **kwargs)

Essentially identical to requests_async.Session.get.

Expand source code
async def get(self, *args, **kwargs):
    """
    Essentially identical to requests_async.Session.get.
    """

    return await self.request("GET", *args, **kwargs)
async def patch(self, *args, **kwargs)

Essentially identical to requests_async.Session.patch.

Expand source code
async def patch(self, *args, **kwargs):
    """
    Essentially identical to requests_async.Session.patch.
    """

    return await self.request("patch", *args, **kwargs)
async def post(self, *args, **kwargs)

Essentially identical to requests_async.Session.post.

Expand source code
async def post(self, *args, **kwargs):
    """
    Essentially identical to requests_async.Session.post.
    """

    return await self.request("post", *args, **kwargs)
async def request(self, method, *args, **kwargs)
Expand source code
async def request(self, method, *args, **kwargs):
    quickreturn = kwargs.pop("quickreturn", False)
    doxcsrf = kwargs.pop("doxcsrf", True)
    this_request = await self.session.request(method, *args, **kwargs)

    method = method.lower()

    if doxcsrf and ((method == "post") or (method == "put") or (method == "patch") or (method == "delete")):
        if "X-CSRF-TOKEN" in this_request.headers:
            self.session.headers['X-CSRF-TOKEN'] = this_request.headers["X-CSRF-TOKEN"]
            if this_request.status_code == 403:  # Request failed, send it again
                this_request = await self.session.request(method, *args, **kwargs)

    if kwargs.pop("stream", False):
        # Skip request checking and just get on with it.
        return this_request

    try:
        this_request_json = this_request.json()
    except JSONDecodeError:
        return this_request

    if isinstance(this_request_json, dict):
        try:
            get_request_error = this_request_json["errors"]
        except KeyError:
            return this_request
    else:
        return this_request

    if quickreturn:
        return this_request

    request_exception = status_code_error(this_request.status_code)
    raise request_exception(f"[{this_request.status_code}] {get_request_error[0]['message']}")