Script can now login given user credentials.
This commit is contained in:
parent
97f5eaa09d
commit
fe56a753e2
4 changed files with 151 additions and 17 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -5,3 +5,6 @@
|
||||||
**/*.pyc
|
**/*.pyc
|
||||||
**/__pycache__/*
|
**/__pycache__/*
|
||||||
**/.python-version
|
**/.python-version
|
||||||
|
|
||||||
|
# Ignore config, don't commit your credentials
|
||||||
|
**/config.toml
|
45
README.md
45
README.md
|
@ -1,3 +1,48 @@
|
||||||
# MyLARP Web API
|
# MyLARP Web API
|
||||||
|
|
||||||
A parser and REST API for using https://mylarp.dev/
|
A parser and REST API for using https://mylarp.dev/
|
||||||
|
|
||||||
|
This really doesn't do much just yet, just a proof of concept.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Rename the `sample_config.toml` to `config.toml`.
|
||||||
|
Then, edit it to include your credentials for login, and the proper url for mylarp.
|
||||||
|
|
||||||
|
### Create Virtual Environment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m venv ./.venv
|
||||||
|
source ./.venv/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install Dependencies
|
||||||
|
|
||||||
|
You can then install dependencies with Poetry, or using the `requirements.txt`
|
||||||
|
|
||||||
|
#### Poetry
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install poetry
|
||||||
|
poetry install --no-root
|
||||||
|
```
|
||||||
|
|
||||||
|
#### requirements.txt
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install -r ./requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
If you installed with Poetry:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
poetry run ./src/mylarp-api/mylarp-api.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Otherwise:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python ./src/mylarp-api/mylarp-api.py
|
||||||
|
```
|
||||||
|
|
8
sample_config.toml
Normal file
8
sample_config.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[auth]
|
||||||
|
email = "CHANGE TO YOUR EMAIL"
|
||||||
|
password = "CHANGE TO YOUR PASSWORD"
|
||||||
|
|
||||||
|
[paths]
|
||||||
|
root = "https://[subdomain].mylarp.dev/"
|
||||||
|
login = "scripts/User.login.asp"
|
||||||
|
dashboard = "dashboard.asp"
|
|
@ -1,13 +1,14 @@
|
||||||
#!/bin/env python
|
#!/bin/env python
|
||||||
|
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from logging import info, debug, error, basicConfig, DEBUG
|
from logging import info, debug, error, basicConfig, INFO, DEBUG
|
||||||
from requests import get
|
from pathlib import Path
|
||||||
|
from tomllib import load
|
||||||
|
from requests import Response, utils, get, post
|
||||||
|
from sys import exit
|
||||||
|
|
||||||
# import bs4
|
# import bs4
|
||||||
|
|
||||||
ROOT_URL = "https://cpularp.mylarp.dev/"
|
|
||||||
|
|
||||||
|
|
||||||
def build_arguent_parser() -> ArgumentParser:
|
def build_arguent_parser() -> ArgumentParser:
|
||||||
"""A function to build the argument parser.
|
"""A function to build the argument parser.
|
||||||
|
@ -21,43 +22,120 @@ def build_arguent_parser() -> ArgumentParser:
|
||||||
description="A python API for mylarp",
|
description="A python API for mylarp",
|
||||||
epilog="",
|
epilog="",
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-c",
|
||||||
|
"--config",
|
||||||
|
default="config.toml",
|
||||||
|
help='(Optional) Path to a custom config.toml file. Default: "config.toml"',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-u",
|
"-u",
|
||||||
"--uri",
|
"--uri",
|
||||||
|
default="/",
|
||||||
help="The uri of the mylarp page to parse.",
|
help="The uri of the mylarp page to parse.",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-v",
|
"-v",
|
||||||
"--verbose",
|
"--verbose",
|
||||||
help="Output debug information.",
|
help="(Optional) Output debug information.",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
)
|
)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
|
||||||
def parse_mylarp_page(uri: str):
|
def parse_config(config_file: str) -> dict:
|
||||||
|
"""A parser function for the config.toml
|
||||||
|
|
||||||
|
Args:
|
||||||
|
config_file (str): The path to the config file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: The resulting dictionary object.
|
||||||
|
"""
|
||||||
|
|
||||||
|
config_file_path = Path(config_file).absolute()
|
||||||
|
|
||||||
|
if not config_file_path.exists():
|
||||||
|
error(f"Specified config file path does not exist: {config_file_path}")
|
||||||
|
|
||||||
|
with open(config_file, "rb") as conf:
|
||||||
|
config = load(conf)
|
||||||
|
|
||||||
|
debug(config)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
def parse_mylarp_page(root: str, uri: str, cookies: dict) -> Response:
|
||||||
"""A function to attempt to parse a page in MyLARP.
|
"""A function to attempt to parse a page in MyLARP.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
uri (str): The uri to use.
|
root (str): Specified root url for mylarp.
|
||||||
|
uri (str): Specified uri for mylarp page.
|
||||||
|
cookies (dict): Login cookies from previous attempted login.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Response: The Response object from the attempted page request.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
info(f"Attempting to parse from {uri}")
|
get_url = f"{root}{uri}"
|
||||||
response = get(f"{ROOT_URL}{uri}")
|
info(f"Attempting to parse from {get_url}")
|
||||||
|
response = get(url=get_url, cookies=cookies)
|
||||||
debug(response.text)
|
debug(response.text)
|
||||||
if not response.ok:
|
if not response.ok:
|
||||||
error(f"Invalid API request, server returned {response.status_code}")
|
error(f"Invalid API request, server returned: {response.status_code}")
|
||||||
return
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
def attempt_login(paths: dict, auth: dict) -> Response:
|
||||||
|
"""Use the provided credentials to attempt a log in.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
paths (dict): Parsed config uri paths.
|
||||||
|
auth (dict): Parsed authentication config from config file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Response: The Response object from the attempted login request.
|
||||||
|
"""
|
||||||
|
|
||||||
|
email = utils.quote(auth["email"])
|
||||||
|
password = utils.quote(auth["password"])
|
||||||
|
|
||||||
|
info("Attempting log in...")
|
||||||
|
debug(
|
||||||
|
f"""
|
||||||
|
Using credentials:
|
||||||
|
- Email: {email}
|
||||||
|
- Password: {password}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
post_url = f"{paths["root"]}{paths["login"]}"
|
||||||
|
post_data = f"email={email}&pword={password}"
|
||||||
|
response = post(
|
||||||
|
url=post_url,
|
||||||
|
data=post_data,
|
||||||
|
)
|
||||||
|
debug(response.text)
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
parser = build_arguent_parser()
|
parser = build_arguent_parser()
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
if args.verbose:
|
if args.verbose:
|
||||||
basicConfig(level=DEBUG)
|
basicConfig(level=DEBUG)
|
||||||
parse_mylarp_page(args.uri)
|
else:
|
||||||
|
basicConfig(level=INFO)
|
||||||
|
config = parse_config(args.config)
|
||||||
|
login_response = attempt_login(config["paths"], config["auth"])
|
||||||
|
login_cookies = login_response.cookies.get_dict()
|
||||||
|
dashboard_response = parse_mylarp_page(
|
||||||
|
config["paths"]["root"],
|
||||||
|
config["paths"]["dashboard"],
|
||||||
|
login_cookies,
|
||||||
|
)
|
||||||
|
debug(dashboard_response.text)
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in a new issue