commit ad9cf7635db994302d182576a971207643e4ae1a Author: √(noham)² <100566912+NohamR@users.noreply.github.com> Date: Fri Aug 16 17:25:47 2024 +0200 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f45034 --- /dev/null +++ b/.gitignore @@ -0,0 +1,129 @@ +# Editors +.vscode/ +.idea/ + +# Vagrant +.vagrant/ + +# Mac/OSX +.DS_Store + +# Windows +Thumbs.db + +# Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +dist_chrome/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# node +node_modules/ \ No newline at end of file diff --git a/file.txt b/file.txt new file mode 100644 index 0000000..aeef426 --- /dev/null +++ b/file.txt @@ -0,0 +1 @@ +a file \ No newline at end of file diff --git a/folder/file1.txt b/folder/file1.txt new file mode 100644 index 0000000..e69de29 diff --git a/folder/file2.txt b/folder/file2.txt new file mode 100644 index 0000000..e69de29 diff --git a/gopload.py b/gopload.py new file mode 100644 index 0000000..712cb0d --- /dev/null +++ b/gopload.py @@ -0,0 +1,177 @@ +import requests +import random +import time +import argparse +import os +from dotenv import load_dotenv + +def get_file_paths(folderPath): + filePaths = [] + for root, directories, files in os.walk(folderPath): + for file in files: + if '.DS_Store' not in file: + file_path = os.path.join(root, file) + filePaths.append(file_path) + return filePaths + + +def getservers(logger): + servers = [] + response = requests.get('https://api.gofile.io/servers').json() + if response['status'] == "ok": + for server in response['data']['servers']: + servers.append(server['name']) + logger.debug(f"{response}") + return servers + else: + logger.error(f"{response}") + return None + + +def createfolder(parentFolderId, folderName, logger): + headers = {'Content-Type': 'application/json','Authorization': f'Bearer {TOKEN}',} + if folderName: + data = {"parentFolderId": parentFolderId,"folderName": folderName} + else: + data = {"parentFolderId": parentFolderId} + response = requests.post('https://api.gofile.io/contents/createFolder', headers=headers, json=data).json() + if response['status'] == "ok": + name = response['data']['name'] + code = response['data']['code'] + folderId = response['data']['folderId'] + logger.debug(f"""Folder {name} created with code {code} and folderId {folderId}""") + return folderId + else: + logger.error(f"{response}") + return None + + +def uploadfile(serverName, folderId, filePath, logger): + headers = {'Authorization': f'Bearer {TOKEN}'} + files = {'file': open(filePath, 'rb')} + data = {'folderId': folderId} + response = requests.post(f'https://{serverName}.gofile.io/contents/uploadfile', headers=headers, files=files, data=data).json() + if response['status'] == "ok": + name = response['data']['fileName'] + code = response['data']['code'] + downloadPage = response['data']['downloadPage'] + parentFolderId = response['data']['parentFolder'] + logger.debug(f"""File {name} uploaded to {downloadPage} with code {code}""") + return downloadPage, parentFolderId + else: + logger.error(f"{response}") + return None + +def actionFolder(folderId, attributeValue): + headers = {'Content-Type': 'application/json','Authorization': f'Bearer {TOKEN}'} + data = {"attribute":"public", "attributeValue":attributeValue} + response = requests.put(f'https://api.gofile.io/contents/{folderId}/update', headers=headers, json=data).json() + if response['status'] == "ok": + return True + else: + return response + + +def main(filePath, folderPath, folderName, parentFolderId, private, logger): + files = [] + logger.info("Starting upload") + logger.debug("File: %s", filePath) + if folderPath: + files = get_file_paths(folderPath) + if not files: + logger.error("No files found in folder") + exit(1) + else: + if os.path.exists(filePath): + files = [filePath] + else: + logger.error("File not found") + exit(1) + + servers = getservers(logger) + if servers: + serverName = random.choice(servers) + logger.debug("Selected server: ", serverName) + + if folderName and parentFolderId: + logger.info(f"Creating folder: {folderName} for: {parentFolderId}") + folderId = createfolder(parentFolderId, folderName, logger) + logger.debug(f"FolderId: {folderId}") + parentFolderId = folderId + elif folderName: + logger.info(f"Creating folder: {folderName} for PRIVATE_PARENT_ID: {PRIVATE_PARENT_ID}") + folderId = createfolder(PRIVATE_PARENT_ID, folderName, logger) + logger.debug(f"FolderId: {folderId}") + parentFolderId = folderId + elif parentFolderId and not folderName: + parentFolderId = parentFolderId + logger.debug(f"FolderId: {parentFolderId}") + else: + parentFolderId = None + logger.debug(f"FolderId: {parentFolderId}") + + for file in files: + if parentFolderId: + logger.info(f"Uploading file: {file} to: {parentFolderId} on: {serverName}") + else: + logger.info(f"Uploading file: {file} on: {serverName}") + downloadPage, parentFolderId = uploadfile(serverName, parentFolderId, file, logger) + logger.info(f"Download page: {downloadPage}") + + if not private: + action = actionFolder(parentFolderId, 'true') + if action: + logger.info("Folder made public") + else: + logger.error(f"{action}") + else: + action = actionFolder(parentFolderId, 'false') + if action: + logger.info("Folder made private") + else: + logger.error(f"{action}") + else: + time.spleed(10) + exit(1) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Upload a file to GoFile.') + parser.add_argument('--file', '-i', type=str, help='Path to the file to be uploaded') + parser.add_argument('--folder', '-f', type=str, help='Path to the folder to be uploaded') + parser.add_argument('--name', '-n', type=str, help='Name of the folder on the server') + parser.add_argument('--parent', '-p', type=str, help='Folder id to upload the file to') + parser.add_argument('--private', '-pr', action='store_true', help='Upload to private folder default=False') + parser.add_argument('--log-level', type=str, choices=['DEBUG', 'ERROR', 'INFO', 'OFF', 'WARN'], default='INFO', help='Set log level [default: INFO]') + args = parser.parse_args() + + import logging + log_format = '%(asctime)s %(levelname)s: %(message)s' + logging.basicConfig(level=getattr(logging, args.log_level.upper()), format=log_format, datefmt='%H:%M:%S') + logger = logging.getLogger(__name__) + + load_dotenv() + TOKEN = os.getenv("TOKEN") + PRIVATE_PARENT_ID = os.getenv("PRIVATE_PARENT_ID") + if not TOKEN: + logger.error("Error: TOKEN not found, create a .env file with TOKEN") + exit(1) + if not PRIVATE_PARENT_ID: + logger.error("Error: PRIVATE_PARENT_ID not found, create a .env file with PRIVATE_PARENT_ID") + exit(1) + + if args.name and not args.parent: + logger.warning("Parent folder id not specified, PRIVATE_PARENT_ID will be used") + + if args.file: + if args.folder: + logger.error("Both file and folder specified") + exit(1) + else: + main(args.file, args.folder, args.name, args.parent, args.private, logger) + else: + if args.folder: + main(args.file, args.folder, args.name, args.parent, args.private, logger) + else: + logger.error("No file or folder specified") + exit(1) \ No newline at end of file diff --git a/test.py b/test.py new file mode 100644 index 0000000..aad47ab --- /dev/null +++ b/test.py @@ -0,0 +1,2 @@ +if not None: + print('This will never be printed') \ No newline at end of file