1. import argparse
  2. import logging
  3. import sys
  4. from urllib.parse import urlparse, parse_qs
  5. # Configure logging
  6. logging.basicConfig(
  7. level=logging.INFO,
  8. format="%(asctime)s - %(levelname)s - %(message)s",
  9. stream=sys.stdout,
  10. )
  11. def watch_url_params(url_pattern, callback):
  12. """
  13. Watches for changes in URL parameters matching a pattern and calls a callback function
  14. when changes are detected.
  15. """
  16. logging.info(f"Watching URL pattern: {url_pattern}")
  17. # Parse the URL pattern to extract parameter names
  18. parsed_pattern = urlparse(url_pattern)
  19. parameter_names = [p for p in parsed_pattern.path.split('/') if p] # Extract parameter names
  20. # Initial state of URL parameters
  21. initial_params = parse_qs(parsed_pattern.query)
  22. while True:
  23. try:
  24. # Get the current URL
  25. current_url = input("Enter URL to check (or type exit): ")
  26. if current_url.lower() == 'exit':
  27. break
  28. # Parse current URL
  29. parsed_url = urlparse(current_url)
  30. current_params = parse_qs(parsed_url.query)
  31. # Check for changes in parameters
  32. param_changed = False
  33. for param_name in parameter_names:
  34. if param_name in current_params and param_name in initial_params:
  35. if current_params[param_name] != initial_params[param_name]:
  36. param_changed = True
  37. logging.debug(f"Parameter '{param_name}' changed from '{initial_params[param_name]}' to '{current_params[param_name]}'")
  38. elif param_name in current_params:
  39. param_changed = True
  40. logging.debug(f"Parameter '{param_name}' added: '{current_params[param_name]}'")
  41. elif param_name in initial_params:
  42. param_changed = True
  43. logging.debug(f"Parameter '{param_name}' removed")
  44. if param_changed:
  45. callback(current_url, current_params)
  46. # Update initial parameters for the next iteration
  47. initial_params = current_params.copy()
  48. if not param_changed:
  49. logging.debug("No parameter changes detected.")
  50. except Exception as e:
  51. logging.error(f"An error occurred: {e}")
  52. #Consider adding a sleep here to avoid tight loop causing resource exhaustion
  53. if __name__ == "__main__":
  54. # Example usage:
  55. url_pattern = "/items/?id=*&sort=name" # Example URL pattern
  56. def my_callback(url, params):
  57. """
  58. Callback function to be executed when URL parameters change.
  59. """
  60. logging.info(f"URL changed: {url}")
  61. logging.info(f"New parameters: {params}")
  62. watch_url_params(url_pattern, my_callback)

Add your comment