#!/root/venvs/itb/bin/python import sys import os import time import random from selenium import webdriver class ScrollController: def __init__(self, debug_port: int): options = webdriver.ChromeOptions() options.add_experimental_option("debuggerAddress", f"127.0.0.1:{debug_port}") self.driver = webdriver.Chrome(options=options) # Load JavaScript files js_dir = os.path.join(os.path.dirname(__file__), "..", "js") self.js_code = "" with open(os.path.join(js_dir, "viewport.js")) as f: self.js_code = f.read() def get_viewport_info(self) -> dict: return self.driver.execute_script(self.js_code + "; return getViewportInfo();") def smooth_scroll(self, target_x: int, target_y: int): viewport = self.get_viewport_info() start_x = viewport['scroll_x'] start_y = viewport['scroll_y'] # Clamp target values to valid ranges target_x = max(0, min(target_x, viewport['max_scroll_x'])) target_y = max(0, min(target_y, viewport['max_scroll_y'])) # Calculate number of steps (random for natural feel) steps = random.randint(5, 10) for step in range(1, steps + 1): progress = step / steps current_x = start_x + (target_x - start_x) * progress current_y = start_y + (target_y - start_y) * progress self.driver.execute_script( 'window.scrollTo(arguments[0], arguments[1]);', current_x, current_y ) # Random small delay between steps time.sleep(random.uniform(0.01, 0.05)) # Final position check final = self.get_viewport_info() return { 'x': final['scroll_x'], 'y': final['scroll_y'] } def main(debug_port: int, target_x: int, target_y: int): try: controller = ScrollController(debug_port) result = controller.smooth_scroll(target_x, target_y) print(result) except Exception as e: print(f"Error: {e}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": if len(sys.argv) != 4: print("Usage: itb_scroll ") sys.exit(1) main(int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]))