KeyboardInterrupt + better logging + best server

This commit is contained in:
√(noham)² 2024-09-21 16:18:48 +02:00
parent efd6a882f9
commit 26dda558e4
3 changed files with 108 additions and 24 deletions

View File

@ -53,6 +53,7 @@ gofilecli -d https://gofile.io/d/XXXXX # to download a folder
``` ```
# To do : # To do :
- KeyboardInterrupt + Lost connexion
- error-rateLimit - error-rateLimit
- env via CLI - env via CLI
- finish README.md - finish README.md

View File

@ -11,6 +11,36 @@ import platform
import subprocess import subprocess
import sys import sys
import simpleaudio as sa import simpleaudio as sa
import ping3
def reqst(url, method ,headers=None, data=None, files=None, params=None, json=None, logger=None):
try:
if method == "get":
response = requests.get(url, headers=headers, data=data, params=params, json=json)
elif method == "post":
response = requests.post(url, headers=headers, data=data, files=files, params=params, json=json)
elif method == "put":
response = requests.put(url, headers=headers, data=data, files=files, params=params, json=json)
elif method == "delete":
response = requests.delete(url, headers=headers, data=data, files=files, params=params, json=json)
json_response = response.json() # If response content is not JSON, this will raise a ValueError
return json_response
except requests.exceptions.HTTPError as http_err:
logger.error(f"HTTP error occurred: {http_err}") # Handles HTTP errors (e.g., 404, 500)
sys.exit()
except requests.exceptions.ConnectionError as conn_err:
logger.error(f"Connection error occurred: {conn_err}") # Handles network-related errors
sys.exit()
except requests.exceptions.Timeout as timeout_err:
logger.error(f"Timeout error occurred: {timeout_err}") # Handles request timeouts
sys.exit()
except requests.exceptions.RequestException as req_err:
logger.error(f"An error occurred: {req_err}") # Catches any other requests-related errors
sys.exit()
except ValueError as json_err:
logger.error(f"JSON decode error: {json_err}") # Handles issues with JSON decoding
sys.exit()
def play_sound(): def play_sound():
@ -99,7 +129,8 @@ def check_folderPath(path):
def getservers(logger): def getservers(logger):
servers = [] servers = []
response = requests.get("https://api.gofile.io/servers").json() # response = requests.get("https://api.gofile.io/servers").json()
response = reqst("https://api.gofile.io/servers", logger=logger, method="get")
if response["status"] == "ok": if response["status"] == "ok":
for server in response["data"]["servers"]: for server in response["data"]["servers"]:
servers.append(server["name"]) servers.append(server["name"])
@ -110,22 +141,60 @@ def getservers(logger):
return None return None
def ping_server(url, count=4):
response_times = []
for _ in range(count):
response_time = ping3.ping(url)
if response_time:
response_times.append(response_time)
time.sleep(0.2)
if response_times:
avg_response = sum(response_times) / len(response_times)
return avg_response
else:
return float('inf')
def test_servers(servers, logger):
best_server = None
best_time = float('inf')
for server in servers:
logger.debug(f"Pinging {server}...")
url = f"{server}.gofile.io"
avg_time = ping_server(url)
logger.debug(f"Average response time for {server}: {avg_time:.2f} ms")
if avg_time < best_time:
best_time = avg_time
best_server = server
if best_server:
logger.debug(f"\nThe best server is {best_server} with an average response time of {best_time:.2f} ms.")
else:
logger.error("All pings failed.")
return best_server
def get_stats(logger): def get_stats(logger):
headers = {'authorization': f'Bearer {TOKEN}',} headers = {'authorization': f'Bearer {TOKEN}',}
data = requests.get(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers).json() # data = requests.get(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers).json()
stats = data["data"]["statsCurrent"] data = reqst(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers, logger=logger, method="get")
logger.info("Account stats:") if data["status"] == "ok":
logger.info(f"Total files: {stats['fileCount']}") stats = data["data"]["statsCurrent"]
logger.info(f"Total folders: {stats['folderCount']}") logger.info("Account stats:")
size = file_size(num_bytes=stats['storage']) logger.info(f"Total files: {stats['fileCount']}")
logger.info(f"Total size: {size}") logger.info(f"Total folders: {stats['folderCount']}")
traffic = file_size(num_bytes=stats['trafficWebDownloaded']) size = file_size(num_bytes=stats['storage'])
logger.info(f"Total traffic: {traffic}") logger.info(f"Total size: {size}")
traffic = file_size(num_bytes=stats['trafficWebDownloaded'])
logger.info(f"Total traffic: {traffic}")
else:
logger.error(f"{data}")
return None
def get_rootfolder(logger): def get_rootfolder(logger):
headers = {'authorization': f'Bearer {TOKEN}',} headers = {'authorization': f'Bearer {TOKEN}',}
data = requests.get(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers).json() # data = requests.get(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers).json()
data = reqst(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers, logger=logger, method="get")
root_folder = data.get("data", {}).get("rootFolder", {}) root_folder = data.get("data", {}).get("rootFolder", {})
if root_folder: if root_folder:
return root_folder return root_folder
@ -137,7 +206,8 @@ def get_rootfolder(logger):
def get_code(folderId, logger): def get_code(folderId, logger):
headers = {'authorization': f'Bearer {TOKEN}',} headers = {'authorization': f'Bearer {TOKEN}',}
params = (('wt', '4fd6sg89d7s6'),('cache', 'false'),) params = (('wt', '4fd6sg89d7s6'),('cache', 'false'),)
data = requests.get(f'https://api.gofile.io/contents/{folderId}', headers=headers, params=params).json() # data = requests.get(f'https://api.gofile.io/contents/{folderId}', headers=headers, params=params).json()
data = reqst(f'https://api.gofile.io/contents/{folderId}', headers=headers, params=params, logger=logger, method="get")
code = data.get("data", {}).get("code", {}) code = data.get("data", {}).get("code", {})
if code: if code:
return code return code
@ -149,7 +219,8 @@ def get_code(folderId, logger):
def get_children(id, logger): def get_children(id, logger):
headers = {'authorization': f'Bearer {TOKEN}',} headers = {'authorization': f'Bearer {TOKEN}',}
params = (('wt', '4fd6sg89d7s6'),('cache', 'false'),) params = (('wt', '4fd6sg89d7s6'),('cache', 'false'),)
data = requests.get(f'https://api.gofile.io/contents/{id}', headers=headers, params=params).json() # data = requests.get(f'https://api.gofile.io/contents/{id}', headers=headers, params=params).json()
data = reqst(f'https://api.gofile.io/contents/{id}', headers=headers, params=params, logger=logger, method="get")
children = data.get("data", {}).get("children", {}) children = data.get("data", {}).get("children", {})
if children: if children:
return children return children
@ -169,7 +240,8 @@ def createfolder(parentFolderId, folderName, logger):
data = {"parentFolderId": parentFolderId, "folderName": folderName} data = {"parentFolderId": parentFolderId, "folderName": folderName}
else: else:
data = {"parentFolderId": parentFolderId} data = {"parentFolderId": parentFolderId}
response = requests.post("https://api.gofile.io/contents/createFolder", headers=headers, json=data).json() # response = requests.post("https://api.gofile.io/contents/createFolder", headers=headers, json=data).json()
response = reqst("https://api.gofile.io/contents/createFolder", headers=headers, json=data, logger=logger, method="post")
if response["status"] == "ok": if response["status"] == "ok":
name = response["data"]["name"] name = response["data"]["name"]
code = response["data"]["code"] code = response["data"]["code"]
@ -188,7 +260,8 @@ def uploadfile(serverName, folderId, filePath, logger):
'folderId': (None, folderId), 'folderId': (None, folderId),
} }
start_time = time.time() start_time = time.time()
response = requests.post(f"https://{serverName}.gofile.io/contents/uploadfile", headers=headers, files=files).json() # response = requests.post(f"https://{serverName}.gofile.io/contents/uploadfile", headers=headers, files=files).json()
response = reqst(f"https://{serverName}.gofile.io/contents/uploadfile", headers=headers, files=files, logger=logger, method="post")
speed, elapsed_time = calculate_upload_speed(filePath, start_time) speed, elapsed_time = calculate_upload_speed(filePath, start_time)
if response["status"] == "ok": if response["status"] == "ok":
logger.debug(response) logger.debug(response)
@ -202,10 +275,11 @@ def uploadfile(serverName, folderId, filePath, logger):
return None return None
def actionFolder(folderId, attributeValue): def actionFolder(folderId, attributeValue, logger):
headers = {"Content-Type": "application/json", "Authorization": f"Bearer {TOKEN}"} headers = {"Content-Type": "application/json", "Authorization": f"Bearer {TOKEN}"}
data = {"attribute": "public", "attributeValue": attributeValue} data = {"attribute": "public", "attributeValue": attributeValue}
response = requests.put(f"https://api.gofile.io/contents/{folderId}/update", headers=headers, json=data).json() # response = requests.put(f"https://api.gofile.io/contents/{folderId}/update", headers=headers, json=data).json()
response = reqst(f"https://api.gofile.io/contents/{folderId}/update", headers=headers, json=data, logger=logger, method="put")
if response["status"] == "ok": if response["status"] == "ok":
return True return True
else: else:
@ -230,7 +304,10 @@ def upload(filePath, folderPath, folderName, parentFolderId, private, logger):
servers = getservers(logger) servers = getservers(logger)
if servers: if servers:
serverName = random.choice(servers) if len(servers) > 1:
serverName = test_servers(servers, logger)
else:
serverName = servers[0]
logger.debug(f"Selected server: {serverName}") logger.debug(f"Selected server: {serverName}")
if folderName and parentFolderId: if folderName and parentFolderId:
@ -247,25 +324,25 @@ def upload(filePath, folderPath, folderName, parentFolderId, private, logger):
parentFolderId = parentFolderId parentFolderId = parentFolderId
logger.debug(f"FolderId: {parentFolderId}") logger.debug(f"FolderId: {parentFolderId}")
else: else:
parentFolderId = None parentFolderId = PRIVATE_PARENT_ID
logger.debug(f"FolderId: {parentFolderId}") logger.debug(f"FolderId: {parentFolderId}")
for file in files: for file in files:
if parentFolderId: if parentFolderId:
logger.info(f"Uploading file: '{file}' ({file_size(file)}) to: '{parentFolderId}' on: '{serverName}'") logger.info(f"Uploading file: '{file}' ({file_size(file)}) to: '{parentFolderId}' on: '{serverName}'")
else: else:
logger.info(f"Uploading file: {file} ({file_size(file)}) on: {serverName}") logger.info(f"Uploading file: '{file}' ({file_size(file)}) on: '{serverName}'")
downloadPage, parentFolderId, speed, elapsed_time = uploadfile(serverName, parentFolderId, file, logger) downloadPage, parentFolderId, speed, elapsed_time = uploadfile(serverName, parentFolderId, file, logger)
logger.info(f"File uploaded to: {downloadPage} in {elapsed_time} at {speed}") logger.info(f"File uploaded to: {downloadPage} in {elapsed_time} at {speed}")
if not private: if not private:
action = actionFolder(parentFolderId, "true") action = actionFolder(parentFolderId, "true", logger)
if action: if action:
logger.info("Folder made public") logger.info("Folder made public")
else: else:
logger.error(f"{action}") logger.error(f"{action}")
else: else:
action = actionFolder(parentFolderId, "false") action = actionFolder(parentFolderId, "false", logger)
if action: if action:
logger.info("Folder made private") logger.info("Folder made private")
else: else:
@ -279,7 +356,8 @@ def upload(filePath, folderPath, folderName, parentFolderId, private, logger):
def downloadFile(downloadUrl, path, logger): def downloadFile(downloadUrl, path, logger):
start_time = time.time() start_time = time.time()
headers = {"Authorization": f"Bearer {TOKEN}"} headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(downloadUrl, headers=headers) # response = requests.get(downloadUrl, headers=headers)
response = reqst(downloadUrl, headers=headers, logger=logger, method="get")
with open(path, "wb") as f: with open(path, "wb") as f:
f.write(response.content) f.write(response.content)
logger.debug(f"File downloaded: {path}") logger.debug(f"File downloaded: {path}")
@ -424,4 +502,8 @@ def init():
if __name__ == "__main__": if __name__ == "__main__":
init() try:
init()
except KeyboardInterrupt:
print("\nExiting...")
sys.exit()

View File

@ -1,4 +1,5 @@
cryptography==39.0.1 cryptography==39.0.1
ping3==4.0.8
python-dotenv==1.0.1 python-dotenv==1.0.1
Requests==2.32.3 Requests==2.32.3
simpleaudio==1.0.4 simpleaudio==1.0.4