Created
April 9, 2023 12:55
-
-
Save fadenb/d14048805c1cb42c18faf147e74715a7 to your computer and use it in GitHub Desktop.
A (very) naive speedtest using the cloudflare speedtest endpoint written by ChatGPT 🤷
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import time | |
import argparse | |
def get_trace_info(): | |
trace_url = "https://speed.cloudflare.com/cdn-cgi/trace" | |
response = requests.get(trace_url) | |
trace_data = {} | |
for line in response.text.splitlines(): | |
key, value = line.split("=", 1) | |
trace_data[key] = value | |
return trace_data | |
def test_speed(url, size_label, size_bytes): | |
from tqdm import tqdm | |
start_time = time.time() | |
response = requests.get(url, stream=True) | |
total_bytes = 0 | |
with tqdm(total=size_bytes, unit='B', unit_scale=True, desc=size_label) as pbar: | |
for chunk in response.iter_content(chunk_size=1024): | |
total_bytes += len(chunk) | |
pbar.update(len(chunk)) | |
elapsed_time = time.time() - start_time | |
speed_mbps = (total_bytes * 8) / (elapsed_time * 1024 * 1024) | |
return size_label, speed_mbps | |
def size_to_bytes(size_str): | |
size_str = size_str.strip().lower() | |
if size_str[-1] == 'k': | |
multiplier = 1024 | |
elif size_str[-1] == 'm': | |
multiplier = 1024 * 1024 | |
elif size_str[-1] == 'g': | |
multiplier = 1024 * 1024 * 1024 | |
else: | |
raise ValueError("Invalid size. Use suffixes: K, M, G (case-insensitive)") | |
try: | |
size_bytes = int(size_str[:-1]) * multiplier | |
except ValueError: | |
raise ValueError("Invalid size. Please enter a valid number followed by a suffix (K, M, G)") | |
return size_bytes | |
def main(args): | |
try: | |
from tabulate import tabulate | |
except ImportError: | |
print("tabulate is not installed. Please install it using 'pip install tabulate'") | |
exit(1) | |
trace_info = get_trace_info() | |
print(f"Tester IP: {trace_info['ip']}") | |
print(f"Cloudflare Data Center: {trace_info['colo']}\n") | |
base_url = "https://speed.cloudflare.com/__down?bytes=" | |
if not args.size: | |
default_sizes = ["10M", "100M", "250M", "500M", "1G"] | |
else: | |
default_sizes = [args.size] | |
results = [] | |
for size_str in default_sizes: | |
try: | |
size_bytes = size_to_bytes(size_str) | |
except ValueError as e: | |
print(e) | |
continue | |
size_label, speed_mbps = test_speed(base_url + str(size_bytes), size_str, size_bytes) | |
results.append((size_label, speed_mbps)) | |
print("\nSummary:") | |
print(tabulate(results, headers=["Size", "Speed (Mbps)"], tablefmt="grid")) | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser(description="Test connection speed to Cloudflare's servers.") | |
parser.add_argument("-s", "--size", help="File size to test. Use suffixes: K, M, G (case-insensitive); if not provided, the default set of sizes will be tested") | |
args = parser.parse_args() | |
try: | |
from tqdm import tqdm | |
except ImportError: | |
print("tqdm is not installed. Please install it using 'pip install tqdm'") | |
exit(1) | |
main(args) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment