import argparse
import logging
import sys
from urllib.parse import urlparse, parse_qs
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
stream=sys.stdout,
)
def watch_url_params(url_pattern, callback):
"""
Watches for changes in URL parameters matching a pattern and calls a callback function
when changes are detected.
"""
logging.info(f"Watching URL pattern: {url_pattern}")
# Parse the URL pattern to extract parameter names
parsed_pattern = urlparse(url_pattern)
parameter_names = [p for p in parsed_pattern.path.split('/') if p] # Extract parameter names
# Initial state of URL parameters
initial_params = parse_qs(parsed_pattern.query)
while True:
try:
# Get the current URL
current_url = input("Enter URL to check (or type exit): ")
if current_url.lower() == 'exit':
break
# Parse current URL
parsed_url = urlparse(current_url)
current_params = parse_qs(parsed_url.query)
# Check for changes in parameters
param_changed = False
for param_name in parameter_names:
if param_name in current_params and param_name in initial_params:
if current_params[param_name] != initial_params[param_name]:
param_changed = True
logging.debug(f"Parameter '{param_name}' changed from '{initial_params[param_name]}' to '{current_params[param_name]}'")
elif param_name in current_params:
param_changed = True
logging.debug(f"Parameter '{param_name}' added: '{current_params[param_name]}'")
elif param_name in initial_params:
param_changed = True
logging.debug(f"Parameter '{param_name}' removed")
if param_changed:
callback(current_url, current_params)
# Update initial parameters for the next iteration
initial_params = current_params.copy()
if not param_changed:
logging.debug("No parameter changes detected.")
except Exception as e:
logging.error(f"An error occurred: {e}")
#Consider adding a sleep here to avoid tight loop causing resource exhaustion
if __name__ == "__main__":
# Example usage:
url_pattern = "/items/?id=*&sort=name" # Example URL pattern
def my_callback(url, params):
"""
Callback function to be executed when URL parameters change.
"""
logging.info(f"URL changed: {url}")
logging.info(f"New parameters: {params}")
watch_url_params(url_pattern, my_callback)
Add your comment