#!/usr/bin/env python3 import cv2 import hashlib import secrets import time import argparse def fetch_frame_opencv(url): cap = cv2.VideoCapture(url) ret, frame = cap.read() cap.release() if not ret: raise ValueError("Failed to fetch frame.") return frame def generate_random_numbers(frame, bit_lengths=[512]): _, img_encoded = cv2.imencode('.jpg', frame) img_bytes = img_encoded.tobytes() entropy = hashlib.sha256(img_bytes).digest() return {length: secrets.randbits(length) for length in bit_lengths} def main(): parser = argparse.ArgumentParser(description="Generate random numbers from camera entropy.") parser.add_argument("--url", default="http://192.168.0.200/mjpg/video.mjpg", help="Camera MJPEG stream URL") parser.add_argument("--single", action="store_true", help="Run once (single mode)") args = parser.parse_args() while True: try: frame = fetch_frame_opencv(args.url) random_numbers = generate_random_numbers(frame) for number in random_numbers.values(): print(f"{number:x}") # Print as hex without '0x' prefix except Exception as e: print(f"Error: {e}", file=sys.stderr) if args.single: return # Exit after one attempt in single mode if args.single: break # Exit after one iteration in single mode time.sleep(1) # Wait 1 second before fetching the next frame if __name__ == "__main__": import sys main()